From 6a47b5f12093dc1eec89623af1913a3292c13378 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Mon, 11 Aug 2025 02:19:48 +0000 Subject: [PATCH 01/18] refactor --- AppDir/AppRun | 97 +++++++++++++++++++ AppDir/android-tools.desktop | 9 ++ AppDir/android-tools.png | Bin 0 -> 10292 bytes android-tools-appimage.sh | 181 +++++++---------------------------- 4 files changed, 142 insertions(+), 145 deletions(-) create mode 100644 AppDir/AppRun create mode 100644 AppDir/android-tools.desktop create mode 100644 AppDir/android-tools.png diff --git a/AppDir/AppRun b/AppDir/AppRun new file mode 100644 index 0000000..76389bf --- /dev/null +++ b/AppDir/AppRun @@ -0,0 +1,97 @@ +#!/usr/bin/env sh +CURRENTDIR="$(dirname "$(readlink -f "$0")")" +UDEVNOTICE='No android udev rules detected, use "--getudev" to install' +UDEVREPO="https://github.com/M0Rf30/android-udev-rules.git" +cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" +cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" +BIN="${ARGV0#./}" +unset ARGV0 +export PATH="$CURRENTDIR/bin:$PATH" + +_get_udev_rules() { + if cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 \ + || cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1; then + echo "ERROR: udev rules are already installed!" + echo "Errors persisting with installed udev rules may be due to missing" + echo "udev rules for device or lack of permissions from device" + exit 1 + fi + if ! command -v git >/dev/null 2>&1; then + echo "ERROR: you need git to use this function" + exit 1 + fi + if command -v sudo >/dev/null 2>&1; then + SUDOCMD="sudo" + elif command -v doas >/dev/null 2>&1; then + SUDOCMD="doas" + else + echo "ERROR: You need sudo or doas to use this function" + exit 1 + fi + printf '%s' "udev rules installer from $UDEVREPO, run installer? (y/N): " + read -r yn + if echo "$yn" | grep -i '^y' >/dev/null 2>&1; then + tmpudev=".udev_rules_tmp.dir" + git clone "$UDEVREPO" "$tmpudev" && cd "$tmpudev" || exit 1 + chmod +x ./install.sh && "$SUDOCMD" ./install.sh + cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 || exit 1 + cd .. && rm -rf "$tmpudev" || exit 1 + echo "udev rules installed successfully!" + else + echo "Aborting..." + exit 1 + fi +} + +_get_symlinks() { + BINDIR="${XDG_BIN_HOME:-$HOME/.local/bin}" + links="$(find "$CURRENTDIR"/shared/bin -maxdepth 1 -exec file {} \; \ + | awk -F":" '/ELF/ {print $1}' | xargs -I {} basename {} 2>/dev/null)" + echo "" + echo "This function will make wrapper symlinks in $BINDIR" + echo "that will point to $APPIMAGE with the names:" + echo "$links" | tr ' ' '\n' + echo "" + echo "Make sure there are not existing files $BINDIR with those names" + printf '\n%s' "Proceed with the symlink creation? (Y/n): " + read -r yn + if echo "$yn" | grep -i '^n' >/dev/null 2>&1; then + echo "Aborting..." + exit 1 + fi + mkdir -p "$BINDIR" || exit 1 + for link in $links; do + ln -s "$APPIMAGE" "$BINDIR/$link" 2>/dev/null \ + && echo "\"$link\" symlink successfully created in \"$BINDIR\"" + done +} + +# logic +if [ -n "$BIN" ] && [ -e "$CURRENTDIR/bin/$BIN" ]; then + "$CURRENTDIR/bin/$BIN" "$@" || echo "$UDEVNOTICE" +elif [ -n "$1" ] && [ -e "$CURRENTDIR/bin/$1" ]; then + option="$1" + shift + "$CURRENTDIR/bin/$option" "$@" || echo "$UDEVNOTICE" +else + case "$1" in + '--getudev') + _get_udev_rules + ;; + '--getlinks') + _get_symlinks + ;; + *) + echo "" + echo "USAGE: \"${APPIMAGE##*/} [ARGUMENT]\"" + echo "EXAMPLE: \"${APPIMAGE##*/} adb shell\" to enter adb shell" + echo "" + echo "You can also make a symlink to $APPIMAGE named adb" + echo "and run the symlink to enter adb without typing ${APPIMAGE##*/}" + echo "" + echo 'use "--getlinks" if you want to make the symlinks automatically' + echo "" + exit 1 + ;; + esac +fi diff --git a/AppDir/android-tools.desktop b/AppDir/android-tools.desktop new file mode 100644 index 0000000..3095196 --- /dev/null +++ b/AppDir/android-tools.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Android-platform-tools +Type=Application +Icon=Android +Exec=android-tools +Categories=Utility; +Terminal=true +Hidden=true + diff --git a/AppDir/android-tools.png b/AppDir/android-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..c19b5090091430d47a7ecfb8b8c1a8271fbb091d GIT binary patch literal 10292 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 txNJsc6VzTr4dD0r<51N9w-QOzWWI;ur_*`> ./android-tools.desktop << 'EOF' -[Desktop Entry] -Name=Android-platform-tools -Type=Application -Icon=Android -Exec=android-tools -Categories=Utility; -Terminal=true -Hidden=true -EOF -wget "$ICON" -O ./Android.png -ln -s ./Android.png ./.DirIcon - -# BUNDLE ALL DEPENDENCIES -wget "$LIB4BIN" -O ./lib4bin -chmod +x ./lib4bin - -./lib4bin -p -v -s -k ./shared/bin/* - -# AppRun -cat >> ./AppRun << 'EOF' -#!/usr/bin/env sh -CURRENTDIR="$(dirname "$(readlink -f "$0")")" -UDEVNOTICE='No android udev rules detected, use "--getudev" to install' -UDEVREPO="https://github.com/M0Rf30/android-udev-rules.git" -cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" -cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" -BIN="${ARGV0#./}" -unset ARGV0 -export PATH="$CURRENTDIR/bin:$PATH" +export ADD_HOOKS="udev-installer.hook" +export UPINFO="gh-releases-zsync|${GITHUB_REPOSITORY%/*}|${GITHUB_REPOSITORY#*/}|latest|*$ARCH.AppImage.zsync" +export URUNTIME_PRELOAD=1 # really needed here -_get_udev_rules() { - if cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 \ - || cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1; then - echo "ERROR: udev rules are already installed!" - echo "Errors persisting with installed udev rules may be due to missing" - echo "udev rules for device or lack of permissions from device" - exit 1 - fi - if ! command -v git >/dev/null 2>&1; then - echo "ERROR: you need git to use this function" - exit 1 - fi - if command -v sudo >/dev/null 2>&1; then - SUDOCMD="sudo" - elif command -v doas >/dev/null 2>&1; then - SUDOCMD="doas" - else - echo "ERROR: You need sudo or doas to use this function" - exit 1 - fi - printf '%s' "udev rules installer from $UDEVREPO, run installer? (y/N): " - read -r yn - if echo "$yn" | grep -i '^y' >/dev/null 2>&1; then - tmpudev=".udev_rules_tmp.dir" - git clone "$UDEVREPO" "$tmpudev" && cd "$tmpudev" || exit 1 - chmod +x ./install.sh && "$SUDOCMD" ./install.sh - cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 || exit 1 - cd .. && rm -rf "$tmpudev" || exit 1 - echo "udev rules installed successfully!" - else - echo "Aborting..." - exit 1 - fi -} - -_get_symlinks() { - BINDIR="${XDG_BIN_HOME:-$HOME/.local/bin}" - links="$(find "$CURRENTDIR"/shared/bin -maxdepth 1 -exec file {} \; \ - | awk -F":" '/ELF/ {print $1}' | xargs -I {} basename {} 2>/dev/null)" - echo "" - echo "This function will make wrapper symlinks in $BINDIR" - echo "that will point to $APPIMAGE with the names:" - echo "$links" | tr ' ' '\n' - echo "" - echo "Make sure there are not existing files $BINDIR with those names" - printf '\n%s' "Proceed with the symlink creation? (Y/n): " - read -r yn - if echo "$yn" | grep -i '^n' >/dev/null 2>&1; then - echo "Aborting..." - exit 1 - fi - mkdir -p "$BINDIR" || exit 1 - for link in $links; do - ln -s "$APPIMAGE" "$BINDIR/$link" 2>/dev/null \ - && echo "\"$link\" symlink successfully created in \"$BINDIR\"" - done -} - -# logic -if [ -n "$BIN" ] && [ -e "$CURRENTDIR/bin/$BIN" ]; then - "$CURRENTDIR/bin/$BIN" "$@" || echo "$UDEVNOTICE" -elif [ -n "$1" ] && [ -e "$CURRENTDIR/bin/$1" ]; then - option="$1" - shift - "$CURRENTDIR/bin/$option" "$@" || echo "$UDEVNOTICE" -else - case "$1" in - '--getudev') - _get_udev_rules - ;; - '--getlinks') - _get_symlinks - ;; - *) - echo "" - echo "USAGE: \"${APPIMAGE##*/} [ARGUMENT]\"" - echo "EXAMPLE: \"${APPIMAGE##*/} adb shell\" to enter adb shell" - echo "" - echo "You can also make a symlink to $APPIMAGE named adb" - echo "and run the symlink to enter adb without typing ${APPIMAGE##*/}" - echo "" - echo 'use "--getlinks" if you want to make the symlinks automatically' - echo "" - exit 1 - ;; - esac -fi -EOF -chmod a+x ./AppRun -export VERSION="$(awk -F"=" '/vision/ {print $2}' ./shared/bin/source.properties)" -echo "$VERSION" > ~/version - -# Do the thing! -cd .. -wget "$APPIMAGETOOL" -O appimagetool -chmod +x ./appimagetool -./appimagetool -n -u "$UPINFO" ./AppDir +# CREATE DIRECTORIES AND DOWNLOAD THE ARCHIVE +mkdir -p ./AppDir/shared/bin ./AppDir/bin ./AppDir/etc/udev/rules.d +wget "$BINARY" -O ./bin.zip +unzip -q ./bin.zip +rm -f ./bin.zip +cp -v ./platform-tools/lib64 ./AppDir/bin +cp -v ./platform-tools/mke2fs.conf ./AppDir/bin +mv -v ./platform-tools/* ./AppDir/shared/bin + +VERSION="$(awk -F"=" '/Revision/{print $2; exit}' ./AppDir/shared/bin/source.properties)" +[ -n "$VERSION" ] && "$VERSION" > ~/version +export OUTNAME=Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage + +# add udev rules +wget --retry-connrefused --tries=30 "$UDEV" -O ./AppDir/etc/udev/rules.d + +# DEPLOY ALL LIBS +wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun +chmod +x ./quick-sharun +./quick-sharun ./AppDir/shared/bin/* + +# MAKE APPIMAGE WITH URUNTIME +wget --retry-connrefused --tries=30 "$URUNTIME" -O ./uruntime2appimage +chmod +x ./uruntime2appimage +./uruntime2appimage UPINFO="$(echo "$UPINFO" | sed 's#.AppImage.zsync#*.AppBundle.zsync#g')" -wget -O ./pelf "https://github.com/xplshn/pelf/releases/latest/download/pelf_$ARCH" +wget -O ./pelf "https://github.com/xplshn/pelf/releases/latest/download/pelf_$ARCH" chmod +x ./pelf echo "Generating [dwfs]AppBundle..." ./pelf \ @@ -159,7 +50,7 @@ echo "Generating [dwfs]AppBundle..." --add-updinfo "$UPINFO" \ --compression "-C zstd:level=22 -S26 -B8" \ --appbundle-id="android-tools#github.com/$GITHUB_REPOSITORY:$VERSION@$(date +%d_%m_%Y)" \ - --output-to ./Android-platform-tools-"$VERSION"-"$ARCH".dwfs.AppBundle + --output-to ./Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage echo "Generating zsync file..." zsyncmake ./*.AppBundle -u ./*.AppBundle From 72a0625cb0571a228b85b509bfb2429fa39d889b Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:52:25 -0400 Subject: [PATCH 02/18] big refactor --- AppDir/AppRun | 132 ++++++++++++++++++-------------------------------- 1 file changed, 47 insertions(+), 85 deletions(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index 76389bf..a287fae 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -1,97 +1,59 @@ -#!/usr/bin/env sh -CURRENTDIR="$(dirname "$(readlink -f "$0")")" -UDEVNOTICE='No android udev rules detected, use "--getudev" to install' -UDEVREPO="https://github.com/M0Rf30/android-udev-rules.git" -cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" -cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1 && UDEVNOTICE="" -BIN="${ARGV0#./}" -unset ARGV0 -export PATH="$CURRENTDIR/bin:$PATH" +#!/bin/sh -_get_udev_rules() { - if cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 \ - || cat /usr/lib/udev/rules.d/*droid.rules >/dev/null 2>&1; then - echo "ERROR: udev rules are already installed!" - echo "Errors persisting with installed udev rules may be due to missing" - echo "udev rules for device or lack of permissions from device" - exit 1 - fi - if ! command -v git >/dev/null 2>&1; then - echo "ERROR: you need git to use this function" - exit 1 - fi - if command -v sudo >/dev/null 2>&1; then - SUDOCMD="sudo" - elif command -v doas >/dev/null 2>&1; then - SUDOCMD="doas" - else - echo "ERROR: You need sudo or doas to use this function" - exit 1 - fi - printf '%s' "udev rules installer from $UDEVREPO, run installer? (y/N): " - read -r yn - if echo "$yn" | grep -i '^y' >/dev/null 2>&1; then - tmpudev=".udev_rules_tmp.dir" - git clone "$UDEVREPO" "$tmpudev" && cd "$tmpudev" || exit 1 - chmod +x ./install.sh && "$SUDOCMD" ./install.sh - cat /etc/udev/rules.d/*droid.rules >/dev/null 2>&1 || exit 1 - cd .. && rm -rf "$tmpudev" || exit 1 - echo "udev rules installed successfully!" - else - echo "Aborting..." - exit 1 - fi -} +set -e + +CURRENTDIR="$(cd "${0%/*}" && echo "$PWD")" +BINDIR="${XDG_BIN_HOME:-$HOME/.local/bin}" +BIN="${ARGV0:-$0}" +BIN="${BIN##*/}" +unset ARGV0 _get_symlinks() { - BINDIR="${XDG_BIN_HOME:-$HOME/.local/bin}" - links="$(find "$CURRENTDIR"/shared/bin -maxdepth 1 -exec file {} \; \ - | awk -F":" '/ELF/ {print $1}' | xargs -I {} basename {} 2>/dev/null)" + set -- "$CURRENTDIR"/bin/* echo "" echo "This function will make wrapper symlinks in $BINDIR" - echo "that will point to $APPIMAGE with the names:" - echo "$links" | tr ' ' '\n' + echo "that will point to $APPIMAGE, this way when you run that symlink" + echo "it automatically launches that binary without extra arguments" echo "" - echo "Make sure there are not existing files $BINDIR with those names" - printf '\n%s' "Proceed with the symlink creation? (Y/n): " - read -r yn - if echo "$yn" | grep -i '^n' >/dev/null 2>&1; then - echo "Aborting..." - exit 1 - fi - mkdir -p "$BINDIR" || exit 1 - for link in $links; do - ln -s "$APPIMAGE" "$BINDIR/$link" 2>/dev/null \ - && echo "\"$link\" symlink successfully created in \"$BINDIR\"" + printf '%s' "Proceed with the symlink creation? (Y/n): "; read -r yn + case "$yn" in + n*|N*) >&2 echo "Aborting..."; exit 1;; + esac + mkdir -p "$BINDIR" + for link do + if [ ! -x "$link" ] || [ ! -f "$link" ]; then + continue + fi + link="${link##*/}" + ln -s "$APPIMAGE" "$BINDIR"/"$link" 2>/dev/null \ + && echo "'$link' successfully created in '$BINDIR'" done } -# logic -if [ -n "$BIN" ] && [ -e "$CURRENTDIR/bin/$BIN" ]; then - "$CURRENTDIR/bin/$BIN" "$@" || echo "$UDEVNOTICE" -elif [ -n "$1" ] && [ -e "$CURRENTDIR/bin/$1" ]; then - option="$1" +# additional scripts can be placed in the top level bin dir +# those with a name that ends up .hook will be executed in teh current shell +# while those that end with bg.hook will be executed in the background +for hook in "$CURRENTDIR"/bin/*.hook; do + [ -x "$hook" ] || continue + case "$hook" in + *.bg.hook) >&2 echo "exec bg hook: $hook"; "$hook" &;; + *.hook) >&2 echo "exec hook: $hook"; "$hook" ;; + esac +done + +if [ "$1" = '--getlinks' ]; then + _getlinks +fi + +# Check if ARGV0 matches any bundled binary, fallback to $1, then main bin +if [ -f "$CURRENTDIR"/bin/"$BIN" ]; then + exec "$CURRENTDIR"/bin/"$BIN" "$@" +elif [ -f "$CURRENTDIR"/bin/"$1" ]; then + BIN="$1" shift - "$CURRENTDIR/bin/$option" "$@" || echo "$UDEVNOTICE" + exec "$CURRENTDIR"/bin/"$BIN" "$@" else - case "$1" in - '--getudev') - _get_udev_rules - ;; - '--getlinks') - _get_symlinks - ;; - *) - echo "" - echo "USAGE: \"${APPIMAGE##*/} [ARGUMENT]\"" - echo "EXAMPLE: \"${APPIMAGE##*/} adb shell\" to enter adb shell" - echo "" - echo "You can also make a symlink to $APPIMAGE named adb" - echo "and run the symlink to enter adb without typing ${APPIMAGE##*/}" - echo "" - echo 'use "--getlinks" if you want to make the symlinks automatically' - echo "" - exit 1 - ;; - esac + >&2 echo "Using default binary adb..." + >&2 echo "Run ${APPIMAGE##*/} --getlinks for more info" + exec "$CURRENTDIR"/bin/adb "$@" fi From 425c2eaedbd5df9ffac9eccbd516061afbf0ca51 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:53:55 -0400 Subject: [PATCH 03/18] Delete Android.png --- Android.png | Bin 38857 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Android.png diff --git a/Android.png b/Android.png deleted file mode 100644 index 879461a2b717106e007bcda906a3f47eb1ec1e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38857 zcmeEtWm6nXu=OsB1t+*$f(Cb89D)Q55L|-0J1kD{B)Ge4aCdiicXwx(``i!rN4!<< z)KvAn$vyy%rE6{GUzD8C;$Ke{j02`DgXfdZwUk-BmQS}or=x=Gw{yhU)7QS z8$QTC!vO$Fz*k8zbr1cs_782QnkpsnXea`h{v#LD}+PP#N*zhZIWE);6lIooQRn*?iDv0i&_Ic%@gEK!$! zj3|ev=XZ!B^>|I%+<01vZuGHt&V9&zkvwO(*WSI;ZdWZ+FSX<&E%ftuFz=jgFWY2DHEd(#v^`t?#BNXCu`h}iVAf29gKUWq)#i6;2Ql}e{kHt$thFk&IAM{(z6 zhP(o`eyOcL;ue z4#HaneKulB1QEJ4yq{l~e>YFH&rG+=)GE=(sF+HqvAWrkjT|C-t*@80WZSO2>EXPs6ijTyNf4N|1+x5l>9N`kqf zQ-XQAwA$Vgw(&d81zoDcwARE^fV%u4M5d+zUZo_x^r#wht4YT9PK zs&D|FEuf*p-ukw%S#U$uVBOh`^3L|HTqaFji5yO* z-}F<#-#k`}Hht~nY$nIWEt8-mF!klPO;NDb^8NEO+>}Tt|XCLPK9?m-~HCDfN z2QeGZ8UXV?e_-}5MZG*;Kswb9ifJ~GHw%~sJ{+eY0hq=nr+Pqsh6x2vG!v7dG-+Ag zvYM(D!bj=NF5h1x-k+9|?DeReH2&1U@n79GY}CcM8E_?&3U81?>wY>z`^DrVE`u00y(gJ+on2KX;_1=@z1cGM}-3~x673x z6At9%AiC*5FyW;lJo$T!-zn$gw|Y7$^l6v=(pf%>?hE<@x%v8I!I~ z(Z<~IF{BOE3JT5e2*Gh;-P@V^7ICy4ovy;#eV=qv)vBq5A%Yhx-fJDOnd3-dXQ-g9 zwz`(4)|x|o;I(0kfTa5m)A2#W`lK@n)-HT|n~cH*OBaLtiq59n9HtT+Ic*Fu(#B)Q zZT@z&{V*qqjqEF)hNVHbG~MU%plmTh!|ZUXQi{gGX*J9$IAS3@#d{~_^T z?~FSxll;a!VJ^U$?>|LR9g7|VLO>>(B)9#ITXU;2^GTaweb< zMB8Zwcxl%!SR_#(%f#RCtzen~+`Za<4pl5S#Z=j!8md>8p*CTWvx0)-a+=2r@T2HT+WUG_xper<+2$Q(3T=s?({!8BH zJmc1zu*P4mpM{V_mrbYV7rgG8-UlwrN8p|G zQN8y-Amy&&t|wZPw&H^>V4cka-Y(n}OX2y|;qVNk1jrEhr>2+j3%2X7*#gD{K4noJ znUY|R1)#FLM9<%jKU|_&{igF^hdOIqsUwR?S|vVbyzIabUf@Yhz;gF6LZ@-4trdI zs~MH4d?S5kzZ}ep#$m7SIv*T#;vedocmEYXqxM`8#Q+vD`#z)I2|MRX>2T#+_0Dej zU!Pbm*z3*Puc;mrg1iq9x^N%_fDkit*%HS_QbtcRWWH=`WlTQX$t@TB1vneAIO(o( zUz4k?_Fh<(F~XDR7{hFg9md<66hZo0#iPFMnS=}AjLc+>wOjiC?nQdX!QI5l^qpyaCBKRmJQr%j zGw$JCvRZc!^;t*C1y%XKx$Wg%tJ8A8HzX@Tq*fpsFj=B56`JJZ@Hj}}?Gov=+_F!) zdD5v{ya_d`zJA8_MBWEgwqe-B%8 zL$q9Y$XwLW)N>lXW&Po(R8T1kGNdaEO|vR{_jB!Bt_gzb$_7ZGvqBKNDp(qHjv|)b zg>ds3fLxni3j)Z`(?4qZgF?s&foZQ5c15rdR{z^kx7hBpW_Y+ZBndv1lZM-^3*Z=3S4yFUv#_QUQm zj{U?C`3C)&b!8o>d09&|Mn#E^W<_Nxb?=P!>$cZ6kn(JHz&JY!j^h|WS;|i=5LR9I zW(RN4f7(0nCi&`m*s;5IzsWBzkH(Y&DlAWE-fq;N%On))o(Mkj3HJ;V_Ol5?rU8Rz zT)!|5_FDp?fGt*KQyIOrr!<0bBv;cq@ol^We zs7;eD6Vb2@D&c@j4iCW&ufV@UeECX7UEnTZThgI@TGj*!XoNhIZ!kew8zK?W!I)Sf}t|)wJ;p9q}Z2ZKS@<&=uHU zqp7L95c84rOFpAJ*2=f4OQrfou7!5Hf*9D=K?J^=2k_LI#NXf7-Kt7BLTZ#)EkFx7 zzMf|wP1WQc|FF7QuIxj4xtIsQZ8DQ=OI>splJg@{#a8{C3yJl0Wwir(b*VchhsN|9 zv~-?Q#@bQJ%kG1W8JsdUh0|A~SNYizzUazO`2*3-Kv!?y2KexWJ}pDF0Ad+|Vn4rE zXNU1VFun4a#dV!MSs|$pugJ6lfDDZvj=>HOMp`0CGEOXhqB2%jE5oQV`ji1meq6lmn`Vu&-nvxM-SmO{>^PDt%$Uoa>i<> z9%b-W?`~-U5((%*STy`DnL$Vi20DH&tSR}&g$s#P@_%}h9|sq*gr(wRj;mIh9nID$ zbX}&Um@Yn3T19tgwgI~qhChs>+Y2;wo*c-nwxH|(haYzEH_RfXLa*qxT;vPYvjKdc z!|zGlva3D>7c9O6RK004)Ltcg%X?4n?>=IXqD|PQ$pS6yr<66Ykn)6y&WJ#jRs-3IBNP%vf;dD z0VOCSJ4MW_;t4gGpN|4~$KwA`3t0O26Djq;88|4&_d>LghS&wCCuk0E#~KW>`IGd5 z1HEiDb)1YGFYYsR@bD@szmId+T61r6g2GL_E~@>VeCgdf11htz4FWAX%JUzxRHZ^Z+30`1_vgh&io!)+e?A0%4AuqSV0!<0rR{;peC-i7^=bw^Bq z%A!u*{3LrW(*3f-IjUbgE=eDQyoQEM@Hn6k0O|#@b{)QtyScj9nD%=69d(=Qw>$Cw z1Dndk0|C#mVAwRTU1_DCb)Lzd9&oI?np_k$T1u?;&JLN&JZKQpR+E>rq6@XZ zf|EI+tk**h;M_mpFfZQzD#-etbi*G2l``Ki^4V=USGrJm@Z6wKYvp?anI`&(nw671 zOsDyB?U>AkeffDIB7_k2cEPM1&vx}R>zDjW!Kvl?`l0r8(-74k=KP&03!Hrw&I!=^ zA?!F`*hso*;4V>MyB^#x`Ur=3ov5L0sR-oyaCHw@{W#VRNj?=ro?EW*82a541<-$* zDZ$KgdS#9TJN|Sr|7z;6m9+69Un~Fj9QFF42pGj5^Rlu-LB2M;5LrB24WLEkxq01- z3j+P5mWI|e!Wm_6=Vq-#f4mQWv#l;^xKI+gBcN#6mpu)jnE*h#DSSqe-0jILpim<3 z*uT%`0t8!3HM@45x_n-UXBI?onb<>xpcA(zc!x_i@Z7Yr2hi(VSLWfbZgL!Etz)x2hSjYTfnMwHBo z)c;1|?4K4v&a3;HHCSnIyC^f#W1zwkBMSmZXX%2kL4&aiwq;8og1i_-1cxs;WT%mw zsvg{UdeQxQu0psO`V^gf$dpI=fJ2`|@l$(u58(R2R^9W&8f((z2i*Tc7HaU;V6d^4 zdDe~(rnOe>*2}!Qz$&s)1}L!bvF+Vt13!g*Xf*h@p9lVl9_BX&7;{NmzfY*|eBTDY zUTq|d{%$R@>4&Ngum2Uuyyf-3kcps?2fN?3L@W>%c}rdwYmp+T(fi-TeBm z?jVzEjL24p_vaH9M(~@k9-a_SOt>K2HjxAGR5lxBA1;I(fQVx7RJN27&ulqPr%@$* zZo=R@!cP8!*Z$$Rl#6m?miEh#zyC?aBCkETs&PagQ{cN&{fAesbG6#>H*ID`E(PzB zr-#vs?`@*$mmjiKLEuY%EfstqRL)B{{eL!`P|hnZelUEya1l=U4fGTn(_TZgQr- z)@>6-^BY-K)4|YO_Sgkk$zIW2opYA&$)Y!}zu)Uw5Bq$IbgAMpl5}=uBf_E)vcfTm zt2`%7mpMp$b=t-Y?g5ExC>dRBTxP zuDiEE;7lR$sY!~L$bEzFb0r$1(0A*3H|CDfsO}1lbLM-a`!vMsdTDN7+d_8d+n4cE zoz|?H*2emO^K|Q&q=#32@79MM&l?597tZ5-*DCgH8zlDrfdpO5#uJ-H@Wn4yIJSWv zg^K}SuUjAT$YlpF0XvTjFKmEhyOqBs_s`Qu-YIZMvAL|wsVmV@*^Q1IM-mE{p?r3l5H)gchbPLVBq7Az=zx6tZ6>4YWoDuv$`x7` zZlH-e))7aqi(a-m@TE+$#wK(R0Mvw41HWh}n0SzeZ-{-;Nk$B$$Q#wN9`E+n^m=G7 zo2h~o5rwiY?VUtuySkhYAMX{QvNUZ8df7beUwS^Dq_uj3r!!BofE})efH(7PzS3D_ zLb1vxJBf9Gmh~2FwGChmczU*Ph9$qJQ9*82kw#*t{jFG*n|F|)3j{2%JCe&PG`>cR z*KfIR5Mt8ZD-T|xmZ3|vCM^>O4a){V!$ z-*W=sPh`@N*pF%5)l$@o2*eHehEHc=0bXTpyM+U#6h4oWuzkHpNlkW47U=xB4()5C zyKtcaS*B?z6!$iVg0~pc%+{vL8Ni*D%B2NW_n;@bc<3JL^DjKSE(YB$eNhk<+qWF0 zN54|m{Yf*vvrUF8?||P`7ALRu$0zJ9M4Gu3fc zhMpywH2BzFcsggia+r#~gDm8>#-7ECYOe)6JHbZfG3%Q(=8zSK^D z{a*$y>M1%cofdysCNO{(;D`&49!h4BmjnRPt|Zf^9T>{>e6(=!-;<^ss&de@gz~Su zhy$77jftmZ&EQ`Wwr$F;kz)BT;}_TeX7A9S>}V43t~6ce>kA9_hIY}Vm1eOOuU1Vd zgVZmVj$+7j{z&{f2YZF9#7b&WegW|9nQvhmb~5(Zhy7jJUHw=LKjg5lQCQH;%>v18 zBZ251k}ZAA)+v_o)L#Jh0wBvMhoJ%FflxPZQ?28L*ZKEK4929i!K-U++Xs2`a__#( z|Lt!)J_(#BwcVNyuK!rQ_4IB&l`xd#er(LT8|bFcG$RC@y$6zhgBd0-5l@xP!*YmF z=)wLgBp2Y3mFGVlQuQa}QGWK#DSOO@OwG+N4vFmJa z4>FJCCyEOi+zQX^cx(k>bfT=HBWN^`1iz>YpK;DTV4&!`G8`EV`wht*qLnUcGMj{Q zV?vWzRgJZY`%bxg)?-W+-VdY#gO`yR_Vbmkl7?>&Uz`v8J*EgNYE(AyPZa>ZE=B)T ztaGq8(0#P0S>eB|(=nbg&~C>Xef}wT$(Jj1sQ`k<6&xw4uwgTLn}E=nH3A|yj40o} zwK0aqdC-TTR6#5Y4S@v5O(w8$gn_G%QP3-l(k4vCcB{^YS$sUOEo#g=m*D){nTa_? zt9LW|R>S66f&CKi{PTD3Ndp8rKK7fzZi>wHK`Qn+&?M-*&hUzP^^v!r==5^cPxq&_(q)5n8hE|%SptM-&vn#*R z1i^m#eChL?=dScc->&njc7haE$7iuB$ZvC3v}#W=mGf<18~&-ER!4?j*xxQ#rfVB0 zdhPhw-zm15iSgsC!1Z=~VfZ-MT-WuQ4m=u4ijb6lNN*v_waw6ZrB<}g)^D2szUJOE`UvzERlJmV|vBE|KE zj|=)b$1&u_Wp|TgJkmNg&#Q>cy@9_))O;B7xd`RLJ;ZW^qj(_ru*FHS9DhIVp5H0M>Xa{^u2Tou1~JzT8wZ{_6o&>xKVGw>fqJl4?W zpn(vyU8xrheKK#;IcG6iT=oAyEdb0?PxRJr?4A2DX~%gQQy)_CX0qAI!%He$=RMY% zIy!atwH}meZHcTpUM`*K;>jNmscVGEb)WlW zmtYF4Z(La!kwN=0eV)-ok0{7L8+#<+~Me&fB@Y^KoxC zr)~nOsGP5(35Qa+)KD0r6P?s73#xPOrgqizGDE3?~6C zmRZ!DZK?C{QJFz;lmv~0I2mO5->!%5-2e-h{@m7fdXUgIMFbiyiR^QJ7p%hl<8&qe#JadxM=S7cXSTFqywMLA)~SvBq|*4YqepbeWFp zs^+lf+xdqUx%K!Fe7KzLwb#Ru&ei}dmalXO2&zB|$g1=jDAB>V#35JY_X4l^toCbH zkVQ)MJ-hjyaf9ueQC*`IUsHC>S&YM61xQ-iNkMAIP<4%ay^E)ykS@9KN`h4i959h3 z&ijIw)ID^Q{gk`{0FRz;RUz=j zRL0PR{SJ^y|I4bW(8tbLTetor3#BzIju#%0pjT@$O4Ryi8Q`FyQ6QtPNH`0>g}LQ^ zOPTO{`)6YC-LHF~=La82!dw3~>zPB?(!=R$$Gb&N(l_lDhgq6bI-zR`|L2^bjfc;@ zF_6>ZG&sm%p-rB7=fU#ja=Z2Qq21+~pot+X&OmXLN=3x4PeKxZsiIc2p8mQR&1;%> z*Sthpms&c*ewA=>&vVHGw9wBDIgK2;`9W>p!88&*%p5m%^nE&`##<$O!co zTobCq8>9d55W0xR3gz!BV!|x(Nvt950)jGMki4)(a|cTX5@YCRdL`Ln2=%-QoTutp z6^r5uxf9t5jk_>gL$LuE>Qs&Cf`k{PI?4ps-s{-`$DzF_EBUPGX%D1orhksTy(8~X zEFjF7*8FUU`Lqi@4zfc(^I|T* z(Vy72X_@Z4{Frg{5zhXH42h;?4q#_yyVF9;yDMvNIY1L;jXk3f!?#)#a!Q zhoWi32@UwK43SN$G_gP2zVe|fx;3X%^KtbR31^nYlk#AG9fgGDh$6QoQvQjshR2^+ zz`R4$!~Ls$I+4qT7HCTD5$o4Qaf4Pkg58Y8V>jesh%>vTf_Z~Zbu5Ytl$X&lN~Ig; z?A<9lpD#R4`LGHs%?}B2)3#`AV$<5ccJPE3#k%zuxty#3`;6TWu5D)CZ_XI_k29Pq zJqe;Q7T;L3#%O~eF#@nAI$x*DiX=am%J$u6i8DH}pfd%4*GD+Q2;^9R8$idm%&c%` zjB)jV)16`xvx`vl*$AF(Fc`S?wg}G>zczTHkdhJu)^savW%5q+gK!OTj0ck-Obv5I z$`GE9;E{Oz{$t>oITOcxPv1kCE)fc+)~RKp&%@eJoev^dkw`t0ccmvgP(eYb0U{*) z0WpfF!zo*;EcF0pwHCCWTzzT+hI0#tOc&!mD}S zp#i4rQvw+A1{gB`9G=OZn>aFwGDC@Ag~Bv}mKhamg?6mu58cL9_^_UPij@w3Q%gR9 zoJLqsY*pq1-J-5@^g*!x__T{)DLO#l1j+B5U2ui>p67z>ix9Bvp4JkJfgG0dPeS-q zqe9MlQK9Io4t=^!>P^~?$zE6wukT(gPEeC`KY7F{iV^~nNa3NUs!w+ab{AP7iv(pJ z@W(iAVEk9hd@KahKTEf11a?$U3jI%|`8(khmW(bC`z_>su&7%mZUPx#>7OLQcTSow za@ovcY%9c+!P5R7eqZ{`nwB&X{5*se#zz8rNQ;i}$es#o`pGEHLYHc;K5)X%E-bpO zu-zMXQdk4<$#;^9&T319YcKN$t`GgTayvVr)LHz-X&{ZrnoskK+n`Tp_LcTqFHT@8oM?(Ep~COx@q;|! zC{Yif-6xALSA$Ks2Goqacs*$Sti*v>+qxb3XeKCR#BR#s$XmHL2iKr|(Go*d=S0@j8m8_Qa~>csk=tUQYQ1z#V%iJYJVTF%oJeN14!Nxs$Q z_D{arwr;sCUQnCV)Ou%VLsuBKfAh_1*nQ>DmEY#2wb z5!w~xq_R4RRZPfbzPp>Jl*XDjY=E&yuB%U|qYeiSUv#q-tK|?}FMwLlSBT1qYFM>c zuK%URPi&7$4}ZxqiEW$q^M9cq`W`Kca5a{9%jne&)#p_@_9H@j-rxWIwYyk{73i2B z@Nmv(*Gz4sk{G%vk&|1IGz(H zwUTT{h43MpZ2}8fNU$*ap2X*k_2FjR^DvP7f^V)j3wq=0M}A|}QgNljw}DYk5mdvA z_;@}p)<8RD=Q`Whv2sOK;ab&khq?J~z7W2qC3s^UPdI#*sVL&aA#9pP@Z#Gw#<66;X(iB>Bh;960y`MHT0&Ua z>wPa&6j8JY2FOG5zrwP&T+fo z%Vt)V1TJ)-f}3-8cYgLI%gZzU)55E;?XRLF&+NIUKl}*+W83364vQ3=&{R)Em&fbF zfdEv`M5KPrrNg_?D4>fJs(udaIb6pHY4{^ThQI0`52)rBnZswSH|5l`sJ}A` z(4|a<(4KY;${mp z)eI`b4`gk*>`F2qk7G{#lMdbLRgrR46=Q6xs7Ip}ujz~!e;@nZ4OAw9CtJ$3srw`cz)7H$#W4Pn zg>&I5Lv%%37Isc*-7d$zE|Te=?KUb4q_y{TgAC1DG^`a{)-5WvQK2aTp7}0FGDQ!t z*~Xn5c_TyJv6u4F-HvA6P|iy7hW$*I&KBQ&OTpLw>Z_8WGs5j}pI3bI*KaojXXrag zybN9w7wwWszI0UTU1lwo+|%05DLFh}>i~sb%5u755p`T_`Zv%au@_fZ7L=3+Zj%Ie zV}XQ>b~@9@!6Ufn0XWFrMG*Ow0vmP%jGWNhXm(d!DiD4$u7<^zbeRFZ-0PNPb$YzJ zt4yZCzkH!|k%Z-F#HtSjBnQ}8a=}JJm!8c~`Mjk7)ttv%!B&#g+{2GXhD97|+pe(; z|5dd!wIy(dX!w{gtVG1FlkS#cA^}3UwwDT{#{(=@|CHo3(z#8x`im#t&SP``^I`#9 z7sJXj%-CZ4H>=4D-bvvcwPUDf>xMVl2D7PsHdjH|P1=;G0Q*iF_7ohMw9Bat`OGjL zSl64Ly9meyw|!vUKoRLnRY!VG|N3CQjpZ6qDOE!F+u~8#`x6xt$#eeu55K}bk$AJ7 z3kMZ)EtIc`<;i6+yRB)Jv=_R-pgBtS^t(1&B-I}`c@X(GZ1Z3x2IFa`gvLPX&qFfU zH*~E&eMorExQL>6z@LO1AP86VRq|}t$*;3{LVjG?`6${DwP2B|`uQ?H4J@6Xd%(jT4hx_kP;k-nbUZ+KY` z{;)G%-qk#E`xBlPR%@b$`7J!8_lRbW z5sLqNP3`FXfS=JzRKVDqYXJFVr#NEq)Y;1Z$I1kWxfZ_+l=)?-lHrx5Rz03CN zK;8?cn;ltHikeoyf=Ys~^`mg*ciYaY^|SQ#`bSBl4$S>Qq+WC+Vq%EHBlN=AC;H+U zrSsvrm(b$3QUpehbQ|Sa<@Lv5-RuJS<`+4%NS3mjh|TQ|vs+F6IxJ0!dEIQP?854g zE(aW>n=MTGXiNwwIMpG7@Eh|8k2bj9ncp->oFZtx;pICmd>3d6c^T9Lw$ z9=86dCLW&I$DxD*q}mOHjz#Z7kUtk z{I&V*AsI;&_A%pXTgMgmbX?7eehVF?n?NJJz?3|I!pEe>6AoSR!;EB==k8qb^9*{G)@=%nV-n@%@YXg;r+vG}>0XBSLtBI1 zB}}_$Bco>_6aTgRmSaB*D|PExH_NWAzjjgAahnzYiL#Fm2Ou^Y4Km3@1fok*p%ZlI zZQxx6^G)M3`Nxql6y$TMDI;el{AQ;Y<@0d~>RUT?%9%t9PdJ2$P|hGY86V z9lAtr-G<-HeuIpDLlN)3ZXCmMFz=dqax@X8F*GVSx|031ZmUPR+|spikPTZI97~5y zT;37H42@mxxJoJl^GfeccYlh=>6UBL0YD37Jf{VL$O$a!I!4fEc4z-2|+Cc84DB`BC5+ISH4?b!Y0X5-7 zK2nw0aEU5Pi}7?jkMJcTC^mNN!E$EOMgb~_OG!;jHBGC7;RN9z>JMx{H08iDTAx+> zR0ZO(<<^x}&8%CT$)}zM|K)|x8#G%ZI?X-5pkV)p)UZbB$V;~Ucd^%g07a-#Mzi`Gs7`0)Zs8MYsOe6=^AU6ryleD>)pa05&kCGP)x z8|Dw$fqeYgmFJPT^8_+0|C0UhrJXCjc8VYXXPhx~S@cgN#4*%XqilO)cg5Z@j;14p z6U6cjiGvT!B%1Ej%*PBN$R>kJCn?4(^!`hcnPU02Lt$_=DEMOO>F6t z_(yuV98`^bi7qx`{6U+THW4pz3_d4n=AiFH`PYiPT~^!w$&e0lm~NEQtVCO>X0v7Q zQS7${^qPzLuZ~z!@0rKCfCyNhDwZl)NEnS$oYk1<&H9lX!v|G#)<&Yi9 zF8RQ>x5DXqt_sX8ABf{%JMf_>8pbx_V?qB79j>Yhsjr*LTY?`Gec4Mim6WTKC(R7j z3HI%$(6erHz6d8^Iu?9!{5&nGeU)aP)w+Mns%7J{xl-x6Abwr56=q9l+pi@P=!G2E z3N->eJOb*F>GJ?IR3L~~9OCm(Fnj(ZfRur;8dnxd9D&LZ>FK(6h^6|i(0t_2C<3~e zq@q5S#s_R_pKQ*nU^u=tr}P|3S@!|}ZDP!WSIU<(C#!To_-96vW^v#yd=L?RWOz52 zb^Ihk^GX9XRGgeGXYa1#jr9nmP`OckOU_BmvAa{(@?O{=)tbvH{0(H7^dd@%u0*Gg zF|zo3R&)s|wCm;bwd@AUO*M4col^h7f=HOGsneNi4Wl zHM;AjLwmtBjBdoXgZ1)RYIWzew?Nx`!Ot#o#2(!9n*m&aMrI>{BI72qP}bj}HT2g> z=g?srskl{u2t$#nQ@cJ51S+?C2W%zn;J08olf>jS`%s5mk>V z)81Uk z9G|2H&~g%Mgk-BzSd-d|ywa!rV?TqM8O2=5MjiutWglGu!M=xp$&YziZM9rv4iW$w zwjAz&b~Wg*!N%K(>wEQ|sIG`*1jvnn;G;q3bg8S~AjUIS>jSEY_7&%VgvwOVk-C~k za7mrZd;L?dj4F$X*@3Zu{!UhwK4r_Yid#wp5ElYdW#DyZH<;ocg*{Dh=a=vZ5&y_ub=Fy;PL; zF!w#rKyIQypl6YM`lzE!Bz1_xUcr$B@_G*O%>w7NYF?_)pmpxGI$ssd5sDRLO-@yC z_v408NnDXsX88iO;&dfM!@u-^QkBnCJ&;Cr_DAS;K6GSeIb-tCUgQvGvdL~WWHmw( z@96acQ8O3_xp^O4bFKPO-ca(U{KkUuymV9QXS>(}Ck)8x0^=rKfQ10#P?LEBXKw~i z1#CW@Iu0isP&C@t>ebhc+>c)vH2Yj+v|W7Y3Fcy(7iOvcw3%OHO}?>of2>1;uO4aY z)3ef3H$2wW0LzKCbfLDgXY^FEtw<5mH~%gY=;c%9542K`LcMbPwenV}-hZpgh$~gg ztW>7Ne50C=T8HAiC9SacE25aUb}}F2@7X+rb1)R7EGbumc5?rvAp!Z9N})mW^{qJ? zKNz0Mhq2%uMGRr^>|$uxJm=#_jUX{G6+#b}Kj=SkxZpG&I*p{aPMNxq`BrmlHlc#} zZx?Sj7Y08{8(`I@cK)m6`{yY;CRtf<=qOa%N4v_#P=D7i!4VnO?{CixKjl90ji?4p<-9$_@P_X!p+4o7O-{Ib1S{ifIg?sVdbHE$ z3MeBIOnFq`&-n1qgimfw^JpAuZv71LlVa0O>W#ph-hi4Qkp7Hklk}B^8%;hLpm)al z2f;sc(w0Q;xc|NT&E!B5Dfp00uex|@(LP+6KmCLqu{rz>^aa-|B^x1FW;1xYPzK+3 zf&t<G0+A3gcuuMkZv1}y)=UIh##r~${ExYGGy>Vr2el1`v4GnF z?&qGGZOBNKrETsW8>cCdpjTBcO#`=l+?X(F-KXL?J2dzbQqd{HALJKJ@iaN65r@rR zP{Du5-1Xl*h$GD$z8PpR67bD@kISQ{xkmr;af{SErd2Ce6}2fN6!HNjFWR$Zg=~ND z6x$$>W)CNUhF^R^GZM%~tFdxP82Nu% z0FkQ!%q-hHSbt>wLrY9ERIfHp=m;d8$ICy+>*f)rI&CDTH@zE@3E5uT5V@{1fQiPU zi4Uj;4Zn0<|5GCq)hqaxr$%OV><+Q2Z$C8+zuw8ie3vO=lqEHsT&_J zK;k^+b5oS45!VVs{*T@PP$};TCdxdED0S999s0zOZW_7Lgxz9|KKyePv3)>N2pZL@ zg;-&05B-PTpMJjxMzG1IzfGT5Xi>(K^F`v25w&)m*fMJb{)7G4(Ad{1g@O<@_2=Z- zyPbiDDf)N7i@q`mP&*SN!2C9%9OW$wIyTQ2Vit)bZ8+0p{Jy zlwXP;O73@h2D#f`9Qm_p0lL9Qd+NR0cZJ2?=n(0WIx@cHmb#K!kL4q_j)kJ*^3{9G zcf$b88a2ZeW(P|ktU}>|fLI8fA8Dk~1tSYsCelM-3SrT1cs(tIP6BTD-5;i)6%YqJ z)4fjRgGNuV8$#JAogv9lsk}kC!l10$mII5%Vmb!&uZPYMc zFZwQ^?M@(XyQS|(zZ(OU5dVr?WItk{A)HEQ^%e|?qyRZ;Q&3QdVfE@18&r-x^V$FV z<5ypL=>Ra_jqAH+0JgqwYjgL``8O}t+dtK+cB?q(qrHAG(LRMEzR-S-*7&kd%MCA@FB0dO!X~sVAwcGmH=g8H-}9xIqF?nWEFP(hw+^%s zoARI_i?$JhK#}^b+ z|41o7T9|a9bTK_ov-Mfa!Sf5cFcf)H7!pU67Xn}8cMM%ojqa)ov_(3?GUd6s0>0dU z9XjM9^kspaVcxwE?kGZP)DuBfs_8|Gx5TmiJ+6%d(1# zL>!v%1MUG>Ln?py(RVy;v9k2%i}r9&r>Yfyton~X)(cBa&KM)mF<_CV0QvSF7^Me( z!XW7EKgz{ukAlJ@HWN{HsXM8XmZp2m;h{+Q$P-X5)2ySIJ_aA9g-J#t7l844Se2Is zDe6}VXHJ_!o)<8l9Ze`oLM?6!L*=w2~# zIpQ(TU|D{#POe{g0@^oja#Tm46G-NkEp97KvtDeAaP&Ah`1IAEzWNTLegLlr+yLyG-gnx3 zYQ1-%*52HB;4^8-ETQ3*j267?eSt;@uUhdB11=<`GwxdRRk!5mqn;ZN1DP2 z806UC7xe0`^4^0^VonCiMhgK68uMB}FIlkcDq=5`e`^q{%@fZ*gL;q*Avz1;1 zd5ZbB*X=Z9xC`(+D>NF;R!6n(|B+`r`GfXWp(SKLP}c)$0I=vc-)sHdLbdg1D1XNk zKMwow2|sj9bhI0RP;PddaU({5NLqw7*LP(%&hRI`T-i~c9pLc@MhE8#jc(n4WRH#w zBLG)lf9PmEfCI@u=ViFqI}wYJx=i)PcOIjmpd?BhRXP_=KvEX`Q^cll{#}HP)F_*m zQ$1s4T@ddHCis>SW57jBLEku?IfT@~<3Xt5$n=Rc*q7xAR&7RV5obn6)l^LA|nkoGLj`+TQsoHK}(GM&BIOh-L=Z9}kun+rI zubM)bEGKFwuMaN%d82Yk_EKKerxf=fBB1Y( z+z^8C&I*ho7kLs6yQ3mVgVD_(_(K5ucw3ZE$YX+_i{AmKJNN@U!YzDk0umiJD>PuGXF$v2V-z@V^4i6p+-pF)P(sQb zzw{G|DW%R0uZUG&g8&VudFRwxm|lQYpPdLT@)YF=>hO$<2T=$1 zx~%M^J?Z+`r~lYfKXB!zuWUu$p}HS(1Mtc}dF9knxAoWa)ziE@AIhIC z{6Q|%H&kx2!QxCpr`iY00$~(F(c=!+pGC4VVo5H$>Kfoh2%P`}(6_)~UQdQ!)JHAR>3I#Rn{n$^iND>^7#9LTJ`%=c)8Tndbsb%UM*;4jh^NcN)v z0^tF{9rzxwH@8@5fhw zfd{x}n20M=Qg4L%7!{#DON78Fr1EG3Wk5y+o@B^HHg#lO!Vt}J^p01}$c%KV9BWk1 zKI^y7`NXz&Z99-1Wx4xv9ny0Ec*5__*Y9}gVzqO2$GFXTzs-I$zt+r2>@WtPV~t{1 zJur}O`T_IE5p;u$f*2!fN=V}hM*uL^n6D8TLIRfyaWBD+$lZE9vu%psH<~)VG-?@L zyF019YbkZ-+o|8`rAFPJ)m}Z5W{#OntBzlr8XKlkyWUUjVJCG4J>t&x|Dzu7e9(-V z@ri@6jHo%xRhtAyx!La$l-e&`0&W^#>i@TAx_gMcTi6};fO+NQo#8&OBJMNkzxAAoj&A9jYJ z(y2B^)pK`ze)p%Xo-cRqk#ZN$Y=|~vg-HzkPiR}O6({iiQ_h0eX|n%zO6&F%_!|^rG*=Ir9EG{ zGwr=?cUs)Hkop7bA}he|w*UG>BW*l>V|wrpoSGhT<|%1<%j&eJGM^UvZNdRJIxzoM zuZs?(#wA$xu3g}S2OWnxo|%!6VOAL==faW!F%$JL-zyZX*AJEesDKv*2r6wtC@ZUo z;K|9n5zLBuB010&!LqcmvOx$cV~sK-P7BJA?-+&Ihq{D|wZ=ac9k3Vzvt|*crO^o3 zsBg+US!*PF31^zWVNd$@Ro_gv{@2ZEVb^>b_BD8dpOCeBvyoP<$?sw)j?iqD}c>DjgES z%Wf7c?a6wozwuSCf7R7i@Q^(|e8{E%Ti?2Mc2{ff#S7J?)3xOX*B@@bDIe$kKF>A{ zWhcYDAw)B0|Hf%Dz~bTdBa1J6K%PYi%5n+=9EoJ3B?B)y1{N90#(BOecei7s_}*69 z^KaYJ?U#Nd-TI~fPP=d0nc7QjzRg7h5gWrp^AZ+z&!^kJdTZKu^X@b=Jwt4z^%jsG2?$%{v=s$;yvnR%1xSu?DFl3MweyVp!=>zqQE3Tc&=M`Le>vcO zh4UIwBEw$@u@M=b0tD&|3dRd(bVYzh#Rv@EWCqjHiP6gkz6>uBB}r8`HJ__{H??uY4=D7utGzZ?T{iLO-|WmpBm2-MB0D?^sF|%(!P8k~PN+ z{E(?)^RmTYSLTobbOMYKF0CD@ZOYGiJ8nQAw{bZ$ghKs}_90$P>uaOhy7OP~3zvTM zqaQsaQ-MQb0IVY`@4f7jm)dE+^ICS)w_~n9_Wb#3FDN2E#+br^A2Ng*jn+ZjL&KOJ{ASv*6<^mN*I(k5$HpWB0&JEA*dOo6O$TabA4T@;u=uTtK-NF0~) zOvl2j5jy8p0X&KUQ`8f8rdcGb-x7k4MLNLqpg5ollo6CTJP|k;2JYp6fw*vAPFJ)w zqiY!~5Q`o_I2WV7h_m`aKH?U|7V%W0nI`9J>G}`;XS(jvYtz!cdp|>?fu&-DL^sXf zY14$8?TK8Io4QT^D&`5~A}T`@ikp)zro=P=`D~xjEm$A;Ae)dEP8o8Z0*-BVeo~$+ zob?RS87ES#PCa7J;+|{&^)pxBkkfGgLx;owVAX$V)Vg@F+FI4JxjzhmsfiRHBfonB zU?$FEqfKONHtKsEX;4hRQ_$FQEC%9yu=7a(Oefzcji&U*T--6L56rrE(5c_ro9_JR zH`0#lZcmHz^J&$p)#>=-PDt&x&HHU3P@^hQ-R;$0u({)13u$`&Y+8Nd+SD0hJs`Rl zotLXo^uG5Sac1FYdzOmEg~-PU#}?&Rp{<0rx~RC$7XW4@JdHP@F5oHPWC8m!m_Q@k zDhHt?-_bNLmRFb4m**KhEF@qREfV1Qj>{)o#GOGoGSsVJ7RZUrsC7i-1Re~t_wP5% zogYl48~^#bbi*gFOWoGJ|3EKfYSrwj^h0O;P&#(=v1!MS9cg}UKK1TsrO{$PH8)SE z$^?vn^V{2po(GM%#~J`A(r}=*GSAYu2xuRKsrXKMtW^=0Gn^)ZOwm1zEJeWnF!&j) zJugsuDjXOY z{cCYWLjk}caT+-YX*FIZ40_DFk?Y?!*ch5*4$ER&$ZH)(~eKWnUs2F0Qi((QTem(&GD$i zquUGkz5VQO(oVG=BOqdVE0^JALHlw^5gx#(1n@1dIdFwTo7W$u#z+{iut>=Af;r-7 zkhg1pd~(|*32>5qKWISXm& zckRSq-JbEM>(A4EnE|jcl;5c5^YUnx-O)HKu&|kK6!@sGGg`mj2Zozs*i9Y)!ZHBC zHZmV>mEqyYZ=bGh?=9Z3knZ}}jcM*%dpO#k^@C@n7e4O=>C{tBrMr0NU3aFNzIl^v z2_F0@%kDxaRaVv0no~EVE=(M)`?zFfQRJb={EFZhI1;0m0mn@61NXdefH^AW6i_Qt zM7$hthI@HI$LM8wD-v1^N9BbgGBD~7COdpIDI=-aMgxmx<|uQ3QM{rV)YCl3*W{bOo(+?FkA^RdUKlTSJ+o%E2C(#~Bw)9q#m zM)Un-?p|u1u*#+bF&#BptsMFtQisNb{E-Eg$2BPLf3&Qq(2UzBrVJ<(@tD*H4Dkg3 ztJT)Hm8ifA7=5;P+0~bSXAca0M+V^6-|*{e_6+9##$5m7x#y2SD7K6__uBwiV=C{z{6jCZ(|#{9=eQcKzs-)_?bj3ljl#&!c@29^otD{f zOCwY5(jlMm`?y{TPLd3qVkh_s<>!jOx&Hh9{m!)O^R|M&Z=YH9lhglt;r~i&*Q`l* z+<8a3^y8PN&wlQ6X>NWl>xgAMx!dTP)oapYPk(f}b8=6rZ=9qR$5rSic5P;)7%s;0 z&Iau)YXuP8&sz{80mZkML9`HLE^%Zb1d0gq2}aPTGJz#pupF!K#B?Dqqne@?rdv{; zsy^mA>GG?PcA)HW@SL6^tir}u%Le8441L;p#kbS{`+&?Zv(Km zviCvrmG(OqQ)_j{p7fIeFr~L9V+z1``}1SO7nC1HfcnmK1Y{UO`N>pE#oi}!*=QIE z8V_R=5^?eFtTd+5^*001-no=^UV2m7b^A_Q-0yk#_oPQZ>QQN7aUp&DvX7@PTy+(_ z0n*HLOk99-EKE+zvFfeB%6=j%mu-(TxaVEOG`XCXv&r* zPhOKMbr_x)zEmE3ip9WK)B|lXK=dt)x;SOP1-h+F$RC;*hC+EV1YjIO5_@?XQ8V?! z76cok+QXjooM->T)t7F&U+)sUUk8EkhM!M-_3~HRfuCbLHXH7k+H>SLYlc1lc(RW3 z@=O49ya&pU5EPrcf)-bYhTE9Q3x!3@K^b&{m9QSik1XKVR=`e_#V@vEf4<)xr1|Ua zO8aix!?`_-2Hd+ZUvrJQ{=3puU;JWfwQPmg#SqosmkWo9ZZUlGX7JY9abmQO?wB`% zodtwOH0~VLX$hi*xdLRC9SsCUyxWyo1Wy+x<&#&!MOZ5n>@7AaLj@26_bP(XqKS3o z<)e%z6Fn~Ck9u5#bNt1c0B3RHEYRp}LkeV}m_z)m0A<3@7>6Ja3Fu`pm^eLP#x}pE?$;gxXV7%3XDdFcn|GCuZcFX|WMdb&McBgGqjGbxvF&k6G z)_*2=E=9XiR9KP6t^+-yPg5Wm6v&7aTnbGy03%|6xrZQLs=q+DJOlmM2?|JSu(%G7 zr!(qPAC@Ye$29ltc#*a9FO60qQS%S#`+j)h5c&ou9fn?Y(2SgIMR; z>i@0ZzBPUQhOe_jaov+pcr|x>+q-XXO2;(Q+Q)2GCmAF?l(72Vr>YcQXNGQ~4Sfi&53$bPrS$D>-$;u)?tS%tjL_u~qp4%l0LaVEojbTq9I}Gr z;}dp#c6LYGYLwBY#}M!28nfA}pyix?;6A+8fm06JGRfToDX<5RXs5NQ4SyP%q&e@&NdR z1!aU;eXu`n7PYSf(Uhajxh1(&+e1iEg@iVz(b0OsIJX%q^f?Mg{edUyW;*CApbp+= z`|Ae8LtiEX;>kE2_a&AoyG`}F_K7%f!24VLhV3ZrYq37a8)`&*D4$lp-f<}d5Y$9p zY1N-&zg=orv;}v{67JrL==YE*LHwFYb9p1hd4PG9hQ2D8_hUDHdlxA(u#_A_8Y^9HXgFO$4(f zCosq7{pyX*mvo{o)#DV15{CuNxP)8ufqp1n6t7-ab$4HD!O8WFs7_YYCZPu8As(usrl!V8_^Gc_UimWMc|-57*h z_RMW()cK{C|Ix2+xsOfOH2h!-;b**C!}hBdN9|QzV*o6WlwXT~Ah>A7&@5UslbEng zvV@Q)HJ@Gp8srUDdMHn>L>lRXF)TzG#oQm>K&RVFOLp*wQc@6h001BWNkl4E@wyP_Q^pw5(VTi)1rV6L?bWxK*V}=Odhx zLKypU^0GpXmx%qtvd$aete8QziMbPqTTm8-5AHtB-Tlk-+TFBt`<$&gnff`s^giv= zhe3eSlT2YkjFg~FPIJ*yf&Abq8iRn-!MWTcV7lRve)(d%8vu9#OQ~~gyEXSqcp{fb z5AwQCz+c(^mG83$W6wc_usk>oho}7Dn#fA!2B7E`qk(LsH2@4zBXSDK2677Jbq_f3 z2xYO78aNp@MaOYtltmm5eDrJ$;80yf5#k)*-PY8sq^T{dNU)T%2&oQL3m~Kt2FBTg zMd~Cb#nQ@GN(fQlioyY(3#*Xgo9c!-i}jEO%d;<(rT!O5DFA1qwK_=JFpc0yD%;^|3|3 z8(=eBG2LK&hAY+sXasCmz;*;S+j_tSTelv(7jV!9z()Vanw5DLxBaX#%s=S<(+h}( z+8wU>*q=sxG!YDR)n$v>NHR;7l6CG0C)nn8#nA!OgGP6OpC`HY#R^C0ASyLY0$aA48Ua1 z<~rQ-hh?Kuirlb>d4t9UN!?Unge9PZkS@ze^=E@Qr7+xVu-(Zt`=AcYwZtATYdOXF z*TFXY?%*gq6c`zyOo)&^RZZ(2w}qX@#Y>}yVL~HKtrTu42*SDI048cis_H?C%16n7 zQF<0LAo7<;NQBqTj3V+ekq0!n36LB$L&f;=ykfmUAZr9*_EA4DdbbFKDJ!y!Pa?!} z$tdRus>wcTbI?yb&Q$SZn5K@MwIkZ=vS~o@Trzeqgk=rA_W7iec{=myH>5)!iT5dYJd2YDyV#5_IxW`5v zlmWQ%`YTWFRJuQHqd!;vL*cY7Au9x;q^MHl5KT6~|3X5-NNCYSN<@Y@4!jI8lnG^( z7kA%wDd0toBW#M^uVYOI;E%BmKS91}6D>ds2pIMHl%*7Y7ZDcV96aMa;*bxV(A#*%38^w8k)D~E zO^1P7WhHRwR|ng244g(J(IrB12;Gsfqt?ndbKs`{@g1seC3*hY2&>b0L&*^z21vk!_F$q zHTW2;k;W;2Sspf+q^dz^4I9Qkbq-nKf*^OO2pcjH<8COp>H#Bid|nrsov*r5sca>9 zG*yuBgK7N%U?3<^{HLG&^z_mTe$gHmeFS$FDzmk8?2n$p=fh?Bq0C+%+h!fY7OSne zg$#SD=Sk>QQaQn^jC!;gLhU$IP~~!5cEZdeJbj0HNsE<Fn$wTmfFG1#=F`qT zJDqp#dFgSFd2E`RoZQb4+%KcBuE`&=l@}<523;DNL6?6lEe0;|%^4zvHyB7VFQYT$ zCWB)$b56(?4t(+|G$j@u;DSEF25Rvp!H0`J_@NJ^h1Nn^ch(7M)0ro7 z#g!wD{qcuN@Ilkq7GP1w<)W&_p%s9M!P=Y5HnMKDmXZ}=-U|$i^jtKGSb#$wK;Q%| zth0ze>Ioqe@tM5kxHE3Egj$?qj!?j7v{^!sthAiQ9Jh!-4nE7%m22t16%oG+b{uC6 zDm8m7c=e_=Y0ua0;Hl7cYuE8*ACGzTW7C69Jdw`{;K3i!eor+ot2Clkr2e?|Y4*YE z%(G~CL#3EhUdRRc?P*~Etvu)LFb;srU@XI7!Yd{k{IQ|V8AKuo`2Y$5vd{zrcD$^Y=h%f5Jz3uE`{0SuP*J;(O`kB8v*xcKLL|L_Fp`heJFA0sYn zEMV*}2#$uLJqTww*g`#Bg~dO_>~yc;aZAZYi@9VG@v8os84SGDwf5lE{(u2^Y|sVe z0XvspWS;%Swc4Hl`{5@)Ic>4$!>_la!xz8n;&l6++tbu3Yto5Nd8oY;(7X=3KLE5? zv7&IYJ;*@7u2@u~;(GzlT22OwWO*SZDg`EmjOb22_(<%+6LbIv!iqb_|JUBP1X+@u zXJuDacXf5odo=2q(P)G$Ym6+9W(J9oEF&+l4F(eevmk=UTC8N21Pk^=5J3Ri5ZbZ; zhc*rc0fFSjL?}Wg%);VfNj4)x7~zpMSo7$fQFlFV@xA_YPG(gLv0`(w>fSt$|Ns8~ z|IQ;%=FOXz@?`+~sKiM~b}=b7>>)af)D#efL?L^HF;tOPx13nfHuA-Mxs__~s2mnK2bO34!gIP_^OfKH>hc?3{*C1}zWMnvd?D=9Kl^F-3juY% zR`!2H=E?(j%=oRFdT3|`V|R0O2Bxlysb8BfT2XIq#N*<&#!dG@D@unTugnW|sMhmU zPCTFg4;SKLg%{UXS#ybAS8e z%kI4gdNjB;$npV{^|NG-l5wa`Mjc^3ET=wfz3?{r>X1-~3%XA?gGVcfGN^`kn9K(eSv6zwzbA$?kpRf#v2) zx0VMUy5Z|W14_kS1D2DQ`YZ>qe8z@1mN}*>uRQB7^UATwzoEJvxX_UN26dIV0U zpJ-njI;gVgs2=Rj%4wEM!2XS@f* zo3S#wVn)bWkCv&eyRO|J6pz~gqTh9hwnnhZrabW4U5Z`ZZ0lVdDEAaVRwaXPRW118 zB@t4fUFpFV3c80EIVmrMI|>TWW$cqD_$8_*e&W`04-W;s``SCp+i$(SeDmAiT3&ti zReiIMgYy4*!$*vVKmXM7;Ioe|hj^U$o^Coqf7B7WuT{2gkwIJIgdmNmv~8`6HFm zF}A)o2^=1gj~+N&j$U|T+56yO_5U*YW9|7(FuvF`51ziheCThzv>g8QBg@+-{sIVH zWxKB@GD4@3>AbvI@7JBb^CZo*Px6k7iU%(~vfRKo0k2=jsU|-a!d4$u z({b})&ow4c=DjamYmno`?+4(pyZ#ux#v{ijZ_zu!A8rbI z;_US8Uy<5*aMUfQm4JK-iXfK~nArFQ0kq3GuF{|3iv1bC8hSg|4+>|qZ}^0e zuXy3(r0YNR@baO*^U|{ar*1B{`C}le$KcnIKNtTbZ#_HahH731oIAxHf*MbbQod_L zg;*NnR>kOL&lMM{jqehVytqZqUfC-1^@>;0=sqbsxP%&2#)oaz;LT2T$`7}?*#C%mp}H4ch2wrT|Dt;A2->y ztN-=oA3yEKL(z}?O3d)q{lx={fidq!WWs^*>bc@(zRFmo&XJ;&OC#llM+yB&#tbRV z#<_`)1o3gr*=?K(;Bihxpm6T9X(|8s{_^NAJi9#mS3k1s9@}5=QHro-XEpd^-NuDz zZwh=2C}k~{lFTEXhIlnF5Xt}>Wb;w6);A}WZ)Dkv@@4d7?c2sjW@EFU(%)oz<;;*R z8M;uRT^!Q1?5%bFD$w2mtcoIEwIxw9ZjW+{jze9$g%K z_su(g&}WU*!Pccoe5}0x!h_4vpL=?_`P9S9jiW<7fK;(?(oG|X66B*bl#~!_+Fw~WmCo-UbLwWr3>>Iuo0N?Q|0*6-)o;=?_`_gZ}^4tI0 zsO$GjZ=K*xqT2XMr{g28_DGfym!zx?!a{pklW*&)vSjFiMQ`1z5a z93@EN16uq|q-h?ljfxtE>fV18%x5?epV}vZ}3U4lK|2n6&~OHmsKC zwalk){3sVctF;{c=|`6jy#K}J&HwVf<<0-_zm~Jtu(G=gZZ(1-Sb)H~f-}hF7Je)6 zg~zcPd~7*-?B;TGbj{eqptN!Ol$CwwUaoUO&r)B)!yu>0U==lvt6I~zqYbUJEhH>% z>PxXvA2rr@boi+q4&FyUJURU=Z2cbk!w4$9KBTO7r0^k0o~rR& zkOwL5ILPrWK72H`ha>tUpTyA|{o&m|x{a@ozqK6y;oHmZ4n7sY2)=R+lRO^wdhiS$ z0Q%&O*x`fFeKwSNZf3(pO_bOJcLefAk#4ts(# z2rnqqmwq@fd9lHRf9z6UUcc);PFoc6Q%1EAR zmyrlni8cLerapuMCn0`jdx%Cndj|IiykvdWYjAUqi-(*v^u;1#$`;M$kPRCY6qGsX#kvAmV{VHsw`eu{WJh9d<*&*F zfHwj&kDXQ!qp~3^XDRcvGVV5aAWfmiM{HSNZ{^ph!2=s_eb*icl+k56&I6bPyiCu< zWCnoW|GV)MxS8hzc)UAS2>iKtKIDU|TD3P19{iAMcJ|IDh@xez1>EL-*nPepV|Y+Pd-;n;P5+4S22c*`rgg$w2XBOR^e? zfw(&Haso3gMCy7&YE^BA27b&c(c+m|Zc3K`!Hgnnu~3Gwpp>B?NA=O0N*8R^Z_Sik zVHmkuKG=g&A0}H1_FFiSzg!~mMTp#%JZq$iH%~;7#m@dYW@bEOu*Xq=OJp8t)xYY9 zO9_DMeh$1i;KeuodAe5@dwH-hcDLnJ`ch)yt`1mAN4%BMXZn!{Smn(T=167O#8DXv` z1Bw*ELLYok9s~Ibz9qDW3BdT}F)QQIN=HuH)0C?NuA!~0*c>MdT7*bcEKKp@Ow*4L zeY5Yhg%pgK9Ya@+M=l-7hOKm|S?scUjlh!8i>e=aU*kGzPdaMj_?n%B+vLl(h;_wC zj$)2A-mK|&d)<96zJ`)A6l`B7L17QWJTkIo;u0qnxdr%6{dV{3aKR~gl&d3 zQ6leVM|4BKXf8B&oNzh0GB#B-zmN?6XRMhUb1!af*fJ6)Ms$kE=3mv**Rord8H~$l zmvQnS&C>y{+O>N3_XDnA0{AO94fv-JS)B%4m;mrd)1Ld6I~LI4WslZFAMCC1@Vqxe8kov2YS0c0H0RweNgqdvW~fno;b# zmIaciP?h(1Do;|+njt_>{99e(1xg0u19s|5$oGQ}`$YG`*1AptgiahzypGe8e~Khi z2O=V<&j7lA)MpN)8<&HM5~eEGr%&}^$ksIir$HEUZPV0iP-@ox7^xPjo{ROkQv)*YA6JU`|>FWBuaJMC|!F1N=^y+x5wx6yKy2@;mCE3^j>=0uS2S&9_x`o@x4I)`NHz+BV zUX*r~K$T06*eNJ=AN5taa>R|{j@i3HUj;Ou#gWy=K>DdldEYIz7>ZA*>r5vw?UblN z+nSN=1I^YZy2KSh#-ZeN;Ytdb=1EmZUoAR@u;RnEy3xAPsAH!NJEq3TO}@!SVnkXo zqEO3wy;2#eM1$NAD3jfc(ydR)ZV6L-n8Z*UQayStx2;XtTvQ;z>0% zwF2nl)Yt5|5;#6TxqkQb_?IHucB={Ct%u$^JUKu4WeDSG|GwL=E-Kip=J4i%oG21Q zb|H%vIn5v)Xf=o;)4zl2swSl(x3*|&4%=pFx>&Uxe2{gr=4)wPAd)h+RK0JsrrII4 zN|uZp)&6WKkZ~cSqPeG19zoYu#zDdwVy*BXpg-(uAP8#M=*6hlhhk@tWm>7>HM-Ee z;lK!H@4#fx1E!dgj{wmgZ>67MAOx4$Z{}M(1+wxsMx$48jMGEcZ{FGtDpc3r6kYSF zu}Mb-Y%g_cu#r>`T*0SL4roKn@1mzr?e#KX#n zXhnmU20bri<4+$4a{ShdUl7`z?D3Pm&*9O2F|6Hc0yur+^f`R+_W>UL4Unt;FhEfH zRZENtm5#_6IfOS5%zbMD1>&ueQL(C=PrQR%A0XB$a+PauBY5PRHOrN)UhHn9tHyz9 zeA91NOS~m1V57~~s-s_n%4l60<>P*h(ECKgLPC9P*py3=`%G`EZhH`- zxZ2ZOx7m7h^Gzl66|b_Ry=FXP^!D$VK2^3zq@=H&(#19tO|QDlZGd>RMTblq72rm@i;@`z{+ZHTJ8 z#%N}ePOO(?-Ka%L2mW+qV_Xibq(s=J%;cpDuni(Z9btytYG5|pSZ?encJb!AAc&Dz zJhW>d$xBsLToIGmO529trHOyJ)y&Fkb*dJ-^e;n5i~~lA>3Yefb~{q&fLyqyj`+4M z`?t1SI$L*at9xEWf%%R}Q5dtAuE^wg_e=6Y^=@6a zt}kHd#5eUaJLj@wSy(a!-(+Lc>kC`I+@tc$eYuSx^>>aqd$;yK)&OYCIET(y{axcl ze)mbh0v4cx0U&@;Jmw(%rj zj~tJs_uz=^3=_lPTI0REWnJ0Po~qmro2QsZ=F|9~|}w9qd0kLI_)P_H-$W*b}I`oV-m`qd6#<&)HjC74xg zrnCE@dcddz8GbZaHwEF^-qm|&$DcuYi=a&a-+Jv^H&4$`KEYdmrNo&C0Gf|D%fzhr zicZe>&7Nw|$4QGzK(gw~192=H)hjRIbXTXS>!XyBEKwc_G8Ocf9i3TSfo&Vgnr$nr zk9#J~;wwj2om({(-x@s}4IxrCGTS{XR_-Y85_vrgMi0&wqNG;3lHZhx*cflf)-3(> zwGuKWD%%Az>3Jg24N)@V>jQ?ak{s{I3(@!%2S-19d~}wtwo{84&F&b&_Q%MCHwrfI zd&L;K2UquYC9aH}w#4S(Hag$Ptcll1xusx$4HEjE{tPc|*VyKGFsjqKUf(0``0mr< zEPi{O8M*K&#qnAPObvVp>U4nj1mIf0?)>yK_&D%dIo&3Jckdp*j9>eClpp=o`G0}= z>$sT=JnE&dK|O5am>UCHF;Vh^fbx>f9+}K#v7=pQa*)Qeb&l=Tro>SI?IKw8M zL#vq{a9bcuTwLK=r946|s^d|*yjy!4F=4*j000+INkl z%WHP;ex=*6J~n+VAz1Oadlnq|YF!WV(zb`yX6~LYi%Oq>)Uw8tj|tAmDDO1VRP1f0 z^6=($UH~KsJav%Kb7Q2I5=vUCx6shdRHqg1uu*a~*n%-yqityk%=%;Axa(D^B%5*M z{4dK@XCynb@}Vj!T-sL}d*a}&p0MrH_nZb`62Kk4NBAAh_NXxR5uX2JhWJ@5|1l9* z*oqF!0ro-E92?fvz03};-$$HYW1VOYZ8tVTn`u+OKEgQY>M*`}0u2V)@X@=(*wR#k z5J@%J_Gu)%DpqCDyDUQ5<4br*4dE#5I+rR2`V%4QluX+rQL&cbC}US_hjQX6c-b{K zy@YouHQHzXmwH)pgmYTd#dz^i7wHPy<;K<|LF*<%%5@sYa>Hd14!DJF$LnZp0pZyl zbM4&MBO8v_2JnR1t2Ms%D5`2jZLx}qRZ0;Nd$smz5nHUHM(kFND6#k6#1?HSYSyUH z+Oetm^IyC-@3}j-=jvQM&*u(IVSl^sEhzXa({A!5w-M?Qo9~*fU#W6KEs8B-UQ9u4 z+fC|AA}Nrq?0tQp#^cJHu13xfDC(;Rw^i;R989)?pq{q7`46YtzMM>_*TvDvwsI!m zW;tG|8JT#am}e=U#>8+{A@hybhKsld;w1K#mT22-1m-nZP_Y1(x1(s->8M3GnY-Ti!x zFB0OsUx$gyNHq_I5-&j#1LETB+n>q967{AH1c=+`t*BiKGokU%Z7dib8`PMzQ&_l# zH&4yLIa&KpXO&z(7eY;wKs@GA{(+7^sm+7lB`W=KezCnB^hT}{@Q$(i;>uJBaaNSz z`-bMIta>-eGW^Rk>vHL}jT@Q8?2!Hk1B<KHO-}$umvBj9)VIcVUc6MeXcca2@bLfr#W;S$B`}11mvM$0?r!r)oW^9p)@wn zkwUFV>|*=#%5sS=`Q<_)qih|N<~0NKOk(+-nReVw$w2&*f5{v{`8QxrhfN;|Txyo5 zNk@&aTZJ_GcnuR3okRw)Ev5b=A3f~|aK|fMZ){In{005;C+I#3wtyTM-OfOS8J+%+ z3a?upO~gQ65L8p}qy>5OlDG<=OYPGc*XWz9eJJ<2cUQWGcrsv+nJ*6{<@{jJjURWV zs!Q6%(cIKJbnu4L10a<1HedHBj~l#ylcvj`F=P-=6NSY8UZH&EO__VtWWnEgrQl(c zaLy1lvP-tK-3ar0tYZELZ!3}b8Q&AZqZqVbYL&&m5%4QfI#>uHZ2#GyhfF&880tC) z&$8+ff(RS`ZM|7Eee%}QlimhFYPqiT;M-`lwqUW?qy--Y4IJo}KdKm(laNQu+wY$Mz8U2K(8orkKW- zf5D$4$_hgmoB`crG#-)MK8qERyA2U5XFUvCQJfTB!g`e zO4=Z;j2#^+?~CM4-J-lLiJGV zkkhSw9*wnfG1I6_Lde1X8W{t=rWI#9GCa zrAPp2$fo<9wp^6pT-qWd1;&&OW`DST$e3A+X}DkNt@Uy@2s|KYdZ3`#hu@QXRcl&% z@W|rckOPsRLsdaU_@Ucy@Yb*_?FZVkdb%qA>=2Q7(N((|mJ(qO<>QK3jF$yLZM1?0 zq)or&&ER-g5{POL;s3Ixm!(FZDCFI)P9Ak}o>l#lGZljw#g$Iy5EoPGh3Si?FNcJkSJ15*vUE$PWIOS&@Q@QG-BUH^5g{WR2ppP7=eM2=ZDJuYApai#3mPxA|AMf)<0Ve^7i9TMq`Y{ z6%eMY-TnmDI{h%u#`ZDX1lQPO-a&@lrGFH+0(4psqWtMO{`&n#h^oHd>wtI&k(Q7e~G@$7Wics}Vzz_vd(54=tk^anE>E~}Ij2zM0rcjF~ ze-te>oa-VJw`72oGp(Y?u$D+B)_!jv!%Ew2w=+X!Opp``<7nTgDhYk)@$$)@pfIX% z>v@v{oiqDnBgCinA~$0PH4wsC5ToYwPT*7)ZIa#v9{rmmvyf6i{P`4zpFC>-tZpNV zb#jr=dRsKdhENGSM1P|v^${}Dp|QOjO<0H!YHerk3?Z(=7p7rr?b+28 z*nSY2wLaAD5&7U-FFAAe64g?Eb=-aDJRV2~FD}7_+4G4B&o2GjpJtyW4gK9?Ld zJ+KeFT6r-y-YSyF7>liDd$!YU{fyzev65>~&nYy8-X8b5Yi$kqFeEl&V-_k_yXG3O z;9y8cD8K~2@AvQ3Q#U(Ym6%@eH2ve|sp%t6wvlQ_mu9$F0wMmU==r@4@wZRXDP_I0 z7w`JAUbZb;hQgmE)4jo=8SXR#G2Q=WvBP^;MQ8gh%cEI)frR%X6|_HsS*hj#X4DRr zLIs@!@XJ0nPpxPZyRSasrc{Mb;U@$na~dygDpYISMoJEO$>;8r&x|WBZUP=nD(EJG zLEXqJis~Vd@3>R@p-yXRUhw$1&OmRIs9_53%h#9M+!{gGP}+k>clr00gt_xotLZ+p z82$-N-CN5f*}LR#PRQ8rP|)Ws8n4X8qklwo2#g`~YAPGJEt5;#!-jD|;=Ya+{YC4f zB*b=3AV*hV8~(|&0UWZ~T=vkC0L7dPRZ;$>!rh?bU>}sM|K5{T@8;?D z8bIrv4<^zdF9UZS8R9=h2X={x7l#^19?g47-%$;>l$|4D<9*m@dSh24WBE|nZ}^_r z!sm=a^XVF5u1#vcM<99^BB2MrN>l$**NtT88l>E^Mh;19Esc`eUl^4n?4`aw-#ML;CdzWin!4OjiG8xYl8(an$4tWC@B>ED zvwJ#8M{md_pb?BLbU6|ENO{|eZJJlb7s?r8B2s*V#n0!WT#5dws z%#Y0Ihjzo*_5nQ~UJ^{H5rLUiOo~W+4%J5AAw(rv3gQRE@^V->+y*YN-+T(?L<2r{wx{MuDRLebcY>o0oIi5y#b7z<~7vC>z|n{@^-; zDgDKT^u*Ia4nff8N7IqJ&K~+p_|7_z6K86QDo2OprSGdOm6oe?s(B~J%pP9zbxZ}P zDpfMbXFMw7;~~Sx9mcGshK%}4)hPTN4Q(Oq;8e~}Y4Gz1a)q1M>b@0%f(-A|PDHRG z3S03;MvGe?s(#R1+(#y_KFEAJ(t7(@cF9hrp@j6G^ zlT7ljqJ`L7)VmIfI@Vk#yloR6ZTs8XyYLtf7`g-Je~W%iug(`iv#_M1MpF|2zL*LY z0{h|h(O*Vf`#px#{fb?GYZvz5xtzdL~L~LN0*PjhkqlZ70U7?PDY% zP)t%C(eIE^7NXZNMNSoaO~l-QA#cG1)t?nAdJa#u*9xMlvldq^-^4~@^sRJiHj{g0 zj8x{f3t-)S)$EDkZfTf9$uA4;O}?uLy2ODOo6Nk0F6t}H%RWH-P??#(rZ(ieK;ZRv zAd6~0|8^o}FK@SVa6lU?3F4fy^ARGLfeuODAi7Kklzq6|YgGXl10!0c#Ko3By);97 zQy-rR%d9{#pKfiKY1;Lm-lh%~VuuoDaFg2?q0or`PM@Q4Y3gdpHZ-(aJaMDdGajPKUZTBqdYf5M!or1Hg@peC4T(+Ey*MtsD&#iP;}wvqnTr zHiRPSN5*rWdiO~pgl2#hOfK!#bOZ24HOZ1Y?{K=R7m^lm#^b%c7v)bkzYv)zff}sZ zpLJi};15se*Xc~QWb$%Z6ACT=V%h)TNW$m@VioghwQyMT!4DX3bYwE3T+_63t3xl& zp01BSAkytt9*ZgeZEAsG)0i`o7f8iNvOi5f{RjhnN=+({N~w)^U>9l;bl2GOz>HOc=LEHrcZslPLYKn#$q1-)mCxJ!efOhqM9!wQ3TM=(vQ* z>tE^OF}ua4>Zox^d&FbD*$-E+%6h@sgTS1r^)FGG1@$~RtOdkTTQQd8P8JsxzS4~@ z@rum}0;fPcPER$K7Mc)ni1LD-VBPP5D&7)tdhN)ko+W{E$*UvGsDnLVVjz0mubQT@ z>(7$q1`3#@aVb@V!TwzKODbAHBLS#*^(*l#*8f=BPd$kIbjiS4K-IzcHE$iV{sfAT zJ6|vAb`L?kd7WRj*aG$^np_MA(z9)KH75!|so3vRT382;5631pJ!p3@i+HPY*Tdq@ z5iM_&yI<%g|F^In>ztv!VlZ?hNyIeVv>hb}u zz9bIt&A*Qcikt4ecD_rx^oDqQ*y1m`nrqmC{_F-c-L9ksu;nma$q>O#{}J5plt5H6 zez7k4NwX(g5d)YeHyrq$j;+vq<_Ou+E&T}?*^p1pxyKtSv4hsl);`P;{bdrcctmkB zYmT5o(|GYj3Y{%aJ#_eRChb64Lw(M1Ht>30Z^@j1xorU)8CX7$hXzNPo$`g^3gV)p zXq%l~b2nRyLT^N=sVG;zc+pT{miWrWhPGE_#CU~l-}-?{4+b~nn{6`IvBJ_je#c4H zvTgZ6W$i)sZ*0Zua$ZJgp>cKD8`8lM<{_!$gV4iAjKmmQg^S_Q^r1Z5{^%-+v{c8O zk$*ToZ7_!eM}70jCiiTs=Vn$bT(_+y)$I-y4Ks2rLFRyWlilpcnQ_8n7m*n|`Rux3 zgnX_f`NTC-FARTh{Si!OFkCaycx;$^$g(4O{%`vy)&w=+7#K`Pxh{Xm87tgOaJ5H|8+Wq_kT0R_w z8Bp$tQwJ+*UI{##;W<_@X5~W)mXDzS7NC{?3>2Mljw>;SrfQ~SwJVQv zhsMX2ys9r)yh^D!7^RkEq4LG~K*<0Vwikj#s(pvqAIZ6UW*qyO=B2XE^LdPA?yqJf z>iV@q!?XORW5!wbBl5Fx;uTmb`|rRkQjd#Dpd}rUkC3C+ zv-h?(BrGo=ic?jgt5M$PeCTkJr>XOLMm6y!-xS|+Qq{E|2{JoxSe8-pO+gNK+gXW; pGJm9eLCi<^|LgzJHEu&FuQ;#aeN4`+Y`%cI(NxoYUa4Xg_CI}Y?MeUu From 297051ffa624158efb0b39e2ddc5986e90907122 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:54:34 -0400 Subject: [PATCH 04/18] Update android-tools.desktop --- AppDir/android-tools.desktop | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AppDir/android-tools.desktop b/AppDir/android-tools.desktop index 3095196..2739d06 100644 --- a/AppDir/android-tools.desktop +++ b/AppDir/android-tools.desktop @@ -1,9 +1,8 @@ [Desktop Entry] Name=Android-platform-tools Type=Application -Icon=Android +Icon=android-tools Exec=android-tools Categories=Utility; Terminal=true Hidden=true - From 47d6fab59fc6b7deb15a0770c17462548acf940c Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:56:42 -0400 Subject: [PATCH 05/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 02b481c..8c3140e 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -18,9 +18,9 @@ mkdir -p ./AppDir/shared/bin ./AppDir/bin ./AppDir/etc/udev/rules.d wget "$BINARY" -O ./bin.zip unzip -q ./bin.zip rm -f ./bin.zip -cp -v ./platform-tools/lib64 ./AppDir/bin -cp -v ./platform-tools/mke2fs.conf ./AppDir/bin -mv -v ./platform-tools/* ./AppDir/shared/bin +cp -vr ./platform-tools/lib64 ./AppDir/bin +cp -v ./platform-tools/mke2fs.conf ./AppDir/bin +mv -v ./platform-tools/* ./AppDir/shared/bin VERSION="$(awk -F"=" '/Revision/{print $2; exit}' ./AppDir/shared/bin/source.properties)" [ -n "$VERSION" ] && "$VERSION" > ~/version From ef77ee8828048b52356a7d3b8f1b23ad679471bf Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:58:04 -0400 Subject: [PATCH 06/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 8c3140e..7aaa35c 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -23,7 +23,7 @@ cp -v ./platform-tools/mke2fs.conf ./AppDir/bin mv -v ./platform-tools/* ./AppDir/shared/bin VERSION="$(awk -F"=" '/Revision/{print $2; exit}' ./AppDir/shared/bin/source.properties)" -[ -n "$VERSION" ] && "$VERSION" > ~/version +[ -n "$VERSION" ] && echo "$VERSION" > ~/version export OUTNAME=Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage # add udev rules From 3d6ff2840e4ec6fe3acc9dace6660ae594c045e9 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:59:49 -0400 Subject: [PATCH 07/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 7aaa35c..72b3bd5 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -27,7 +27,7 @@ VERSION="$(awk -F"=" '/Revision/{print $2; exit}' ./AppDir/shared/bin/source.pro export OUTNAME=Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage # add udev rules -wget --retry-connrefused --tries=30 "$UDEV" -O ./AppDir/etc/udev/rules.d +wget --retry-connrefused --tries=30 "$UDEV" -O ./AppDir/etc/udev/rules.d/51-android.rules # DEPLOY ALL LIBS wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun From 677cd1f5e8ddba7580f828fb60e146f6bad4ea5f Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:04:57 -0400 Subject: [PATCH 08/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 72b3bd5..734e7bd 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -50,7 +50,7 @@ echo "Generating [dwfs]AppBundle..." --add-updinfo "$UPINFO" \ --compression "-C zstd:level=22 -S26 -B8" \ --appbundle-id="android-tools#github.com/$GITHUB_REPOSITORY:$VERSION@$(date +%d_%m_%Y)" \ - --output-to ./Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage + --output-to ./Android_Tools-"$VERSION"-"$ARCH".dwfs.AppBundle echo "Generating zsync file..." zsyncmake ./*.AppBundle -u ./*.AppBundle From 5690f397cd425af4135ecddbbdf41e1363a54055 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:09:54 -0400 Subject: [PATCH 09/18] Update AppRun --- AppDir/AppRun | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index a287fae..7a85279 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -36,8 +36,8 @@ _get_symlinks() { for hook in "$CURRENTDIR"/bin/*.hook; do [ -x "$hook" ] || continue case "$hook" in - *.bg.hook) >&2 echo "exec bg hook: $hook"; "$hook" &;; - *.hook) >&2 echo "exec hook: $hook"; "$hook" ;; + *.bg.hook) "$hook" &;; + *.hook) "$hook" ;; esac done From 933e4bb13fa35fcdd2eb55d483e38c02b1410848 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:11:10 -0400 Subject: [PATCH 10/18] Update AppRun --- AppDir/AppRun | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index 7a85279..a2c4748 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -42,7 +42,7 @@ for hook in "$CURRENTDIR"/bin/*.hook; do done if [ "$1" = '--getlinks' ]; then - _getlinks + _get_symlinks fi # Check if ARGV0 matches any bundled binary, fallback to $1, then main bin From 9b0a007b322abc01c0e862ddcc1521a69396f656 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:30:51 -0400 Subject: [PATCH 11/18] Update AppRun --- AppDir/AppRun | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index a2c4748..36a7ca9 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -12,8 +12,8 @@ _get_symlinks() { set -- "$CURRENTDIR"/bin/* echo "" echo "This function will make wrapper symlinks in $BINDIR" - echo "that will point to $APPIMAGE, this way when you run that symlink" - echo "it automatically launches that binary without extra arguments" + echo "that will point to ${APPIMAGE##*/}, this way when you run that" + echo "symlink it automatically runs that binary without extra arguments" echo "" printf '%s' "Proceed with the symlink creation? (Y/n): "; read -r yn case "$yn" in From 7cbe483b3e98c85d4eb42e72d00ef4bc147dafa7 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:39:52 -0400 Subject: [PATCH 12/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 734e7bd..96c2b56 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -6,7 +6,6 @@ ARCH="$(uname -m)" URUNTIME="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/uruntime2appimage.sh" SHARUN="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/quick-sharun.sh" BINARY="https://dl.google.com/android/repository/platform-tools-latest-linux.zip" -ICON="https://github.com/pkgforge-dev/android-tools-AppImage/blob/main/Android.png?raw=true" UDEV="https://raw.githubusercontent.com/M0Rf30/android-udev-rules/refs/heads/main/51-android.rules" export ADD_HOOKS="udev-installer.hook" @@ -15,10 +14,9 @@ export URUNTIME_PRELOAD=1 # really needed here # CREATE DIRECTORIES AND DOWNLOAD THE ARCHIVE mkdir -p ./AppDir/shared/bin ./AppDir/bin ./AppDir/etc/udev/rules.d -wget "$BINARY" -O ./bin.zip +wget --retry-connrefused --tries=30 "$BINARY" -O ./bin.zip unzip -q ./bin.zip rm -f ./bin.zip -cp -vr ./platform-tools/lib64 ./AppDir/bin cp -v ./platform-tools/mke2fs.conf ./AppDir/bin mv -v ./platform-tools/* ./AppDir/shared/bin From e8f671cf8bd78b129439f6ef51eab7c4912ebbd3 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:41:17 -0400 Subject: [PATCH 13/18] Update AppRun --- AppDir/AppRun | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index 36a7ca9..99f51c1 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -21,9 +21,10 @@ _get_symlinks() { esac mkdir -p "$BINDIR" for link do - if [ ! -x "$link" ] || [ ! -f "$link" ]; then - continue - fi + case "$link" in + *xdg-open|*.hook|lib*) continue;; + *) [ -x "$link" ] || continue;; + esac link="${link##*/}" ln -s "$APPIMAGE" "$BINDIR"/"$link" 2>/dev/null \ && echo "'$link' successfully created in '$BINDIR'" From 5ad5294c39649ffea76dcbe2221cb9b5adf6c8ba Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Sun, 10 Aug 2025 23:53:09 -0400 Subject: [PATCH 14/18] Update AppRun --- AppDir/AppRun | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppDir/AppRun b/AppDir/AppRun index 99f51c1..0aac111 100644 --- a/AppDir/AppRun +++ b/AppDir/AppRun @@ -22,13 +22,13 @@ _get_symlinks() { mkdir -p "$BINDIR" for link do case "$link" in - *xdg-open|*.hook|lib*) continue;; - *) [ -x "$link" ] || continue;; + *xdg-open|*.hook|*.conf) continue;; esac link="${link##*/}" ln -s "$APPIMAGE" "$BINDIR"/"$link" 2>/dev/null \ && echo "'$link' successfully created in '$BINDIR'" done + exit 0 } # additional scripts can be placed in the top level bin dir From cb247524221874a48c04e7e9bffc5bb9a6ddc7f3 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:07:05 -0400 Subject: [PATCH 15/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 96c2b56..bb7b39b 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -27,6 +27,9 @@ export OUTNAME=Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage # add udev rules wget --retry-connrefused --tries=30 "$UDEV" -O ./AppDir/etc/udev/rules.d/51-android.rules +# We also need to be added to a group after installing udev rules +sed -i '/cp -v/a usermod -a -G adbusers $(logname)' ./AppDir/bin/udev-installer.hook + # DEPLOY ALL LIBS wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun chmod +x ./quick-sharun From 0fa2f77e4ce5d237a33baf207261e13750d8d783 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:10:31 -0400 Subject: [PATCH 16/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index bb7b39b..2c34ed9 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -27,14 +27,14 @@ export OUTNAME=Android_Tools-"$VERSION"-anylinux-"$ARCH".AppImage # add udev rules wget --retry-connrefused --tries=30 "$UDEV" -O ./AppDir/etc/udev/rules.d/51-android.rules -# We also need to be added to a group after installing udev rules -sed -i '/cp -v/a usermod -a -G adbusers $(logname)' ./AppDir/bin/udev-installer.hook - # DEPLOY ALL LIBS wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun chmod +x ./quick-sharun ./quick-sharun ./AppDir/shared/bin/* +# We also need to be added to a group after installing udev rules +sed -i '/cp -v/a usermod -a -G adbusers $(logname)' ./AppDir/bin/udev-installer.hook + # MAKE APPIMAGE WITH URUNTIME wget --retry-connrefused --tries=30 "$URUNTIME" -O ./uruntime2appimage chmod +x ./uruntime2appimage From ee986f49ec38c97298e6ae643ecea03c36b34fc2 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:58:26 -0400 Subject: [PATCH 17/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index 2c34ed9..d81eda8 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -33,7 +33,7 @@ chmod +x ./quick-sharun ./quick-sharun ./AppDir/shared/bin/* # We also need to be added to a group after installing udev rules -sed -i '/cp -v/a usermod -a -G adbusers $(logname)' ./AppDir/bin/udev-installer.hook +sed -i '/cp -v/a groupadd -f adbusers; usermod -a -G adbusers $(logname)' ./AppDir/bin/udev-installer.hook # MAKE APPIMAGE WITH URUNTIME wget --retry-connrefused --tries=30 "$URUNTIME" -O ./uruntime2appimage From 78333ad85d5eeedbb93003d390a469e0cf500b52 Mon Sep 17 00:00:00 2001 From: Samuel <36420837+Samueru-sama@users.noreply.github.com> Date: Mon, 11 Aug 2025 01:06:09 -0400 Subject: [PATCH 18/18] Update android-tools-appimage.sh --- android-tools-appimage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-tools-appimage.sh b/android-tools-appimage.sh index d81eda8..7b77278 100755 --- a/android-tools-appimage.sh +++ b/android-tools-appimage.sh @@ -51,7 +51,7 @@ echo "Generating [dwfs]AppBundle..." --add-updinfo "$UPINFO" \ --compression "-C zstd:level=22 -S26 -B8" \ --appbundle-id="android-tools#github.com/$GITHUB_REPOSITORY:$VERSION@$(date +%d_%m_%Y)" \ - --output-to ./Android_Tools-"$VERSION"-"$ARCH".dwfs.AppBundle + --output-to ./Android_Tools-"$VERSION"-anylinux-"$ARCH".dwfs.AppBundle echo "Generating zsync file..." zsyncmake ./*.AppBundle -u ./*.AppBundle