From cc36bb9d5c78b656eb722c13b0f4fb4f4dfd0ef7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 1 Dec 2017 16:40:05 +0000 Subject: [PATCH 01/64] Mention peertube as an alternative --- doc/EN/app_mediagoblin.org | 2 +- website/EN/app_mediagoblin.html | 27 ++++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/EN/app_mediagoblin.org b/doc/EN/app_mediagoblin.org index baae49b7..33943552 100644 --- a/doc/EN/app_mediagoblin.org +++ b/doc/EN/app_mediagoblin.org @@ -16,7 +16,7 @@ #+END_EXPORT -With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/. +With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/. Another similar system which might be better fitted for small servers is [[./app_peertube.html][PeerTube]], since it uses webtorrent to distribute video files. When hosting media files you should take into consideration that since anyone on the internet can view your content then this could significantly increase your bandwidth usage and overall strain on the server. Also unless you are just hosting images then hardware such as the Beaglebone Black won't be powerful enough for a good user experience when either uploading or playing back videos. It's recommended that you use one of the more powerful quad (or more) core single board computers or an old laptop if you want to run Mediagoblin on it. diff --git a/website/EN/app_mediagoblin.html b/website/EN/app_mediagoblin.html index 984ea4fe..fadcf2ad 100644 --- a/website/EN/app_mediagoblin.html +++ b/website/EN/app_mediagoblin.html @@ -3,10 +3,10 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + - +

-With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as webm, ogv and ogg. +With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as webm, ogv and ogg. Another similar system which might be better fitted for small servers is PeerTube, since it uses webtorrent to distribute video files.

@@ -263,9 +264,9 @@ When hosting media files you should take into consideration that since anyone on -

-

Installation

-
+
+

Installation

+

Log into your system with:

@@ -290,9 +291,9 @@ After the install has completed go to Security settings and select Cre
-
-

Initial setup

-
+
+

Initial setup

+

If you have just obtained a Lets Encrypt certificate as above then go to About on the administrator control panel and you should see your Mediagoblin domain listed there along with an onion address. You can then navigate to your site in a browser.

@@ -308,9 +309,9 @@ You should repeat that for however many accounts you want on the system and then
-
-

File formats

-
+
+

File formats

+

It's a good idea to upload videos in webm format. In that case Mediagoblin will skip the transcoding step (which can take hours for videos of non-trivial length) and the whole process will be quicker. Transcoding just converts whatever file format you submit into a standard resolution and file type. On your local system you can convert a video to webm with:

From 4f512f5273e21b38cf29b229e44f850d55967efb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 12:50:13 +0000 Subject: [PATCH 02/64] Mention webrtc requirement for peertube --- doc/EN/app_mediagoblin.org | 2 +- website/EN/app_mediagoblin.html | 22 +++++++++++----------- website/EN/app_peertube.html | 16 ++++++++-------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/EN/app_mediagoblin.org b/doc/EN/app_mediagoblin.org index 33943552..9fef5ce0 100644 --- a/doc/EN/app_mediagoblin.org +++ b/doc/EN/app_mediagoblin.org @@ -16,7 +16,7 @@ #+END_EXPORT -With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/. Another similar system which might be better fitted for small servers is [[./app_peertube.html][PeerTube]], since it uses webtorrent to distribute video files. +With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as /webm/, /ogv/ and /ogg/. Another similar system which might be better fitted for small servers is [[./app_peertube.html][PeerTube]], since it uses webtorrent to distribute video files. Webtorrent will only work with WebRTC enabled browsers though. When hosting media files you should take into consideration that since anyone on the internet can view your content then this could significantly increase your bandwidth usage and overall strain on the server. Also unless you are just hosting images then hardware such as the Beaglebone Black won't be powerful enough for a good user experience when either uploading or playing back videos. It's recommended that you use one of the more powerful quad (or more) core single board computers or an old laptop if you want to run Mediagoblin on it. diff --git a/website/EN/app_mediagoblin.html b/website/EN/app_mediagoblin.html index fadcf2ad..ab90dc05 100644 --- a/website/EN/app_mediagoblin.html +++ b/website/EN/app_mediagoblin.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -249,7 +249,7 @@ for the JavaScript code in this tag.

-With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as webm, ogv and ogg. Another similar system which might be better fitted for small servers is PeerTube, since it uses webtorrent to distribute video files. +With Mediagoblin you can host video and audio content in a similar manner to the proprietary systems such as YouTube and SoundCloud. This system supports free media formats such as webm, ogv and ogg. Another similar system which might be better fitted for small servers is PeerTube, since it uses webtorrent to distribute video files. Webtorrent will only work with WebRTC enabled browsers though.

@@ -264,9 +264,9 @@ When hosting media files you should take into consideration that since anyone on

-
-

Installation

-
+
+

Installation

+

Log into your system with:

@@ -291,9 +291,9 @@ After the install has completed go to Security settings and select Cre
-
-

Initial setup

-
+
+

Initial setup

+

If you have just obtained a Lets Encrypt certificate as above then go to About on the administrator control panel and you should see your Mediagoblin domain listed there along with an onion address. You can then navigate to your site in a browser.

@@ -309,9 +309,9 @@ You should repeat that for however many accounts you want on the system and then
-
-

File formats

-
+
+

File formats

+

It's a good idea to upload videos in webm format. In that case Mediagoblin will skip the transcoding step (which can take hours for videos of non-trivial length) and the whole process will be quicker. Transcoding just converts whatever file format you submit into a standard resolution and file type. On your local system you can convert a video to webm with:

diff --git a/website/EN/app_peertube.html b/website/EN/app_peertube.html index cf820cc1..b99e7c2c 100644 --- a/website/EN/app_peertube.html +++ b/website/EN/app_peertube.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -249,7 +249,7 @@ for the JavaScript code in this tag.

-This is a video hosting system similar to Mediagoblin but using webtorrent to help distribute the files to or between clients. This should be more practical for situations where a video becomes popular because the load is then spread across the network, with performance increasing with the number of nodes. +This is a video hosting system similar to Mediagoblin but using webtorrent to help distribute the files to or between clients. This should be more practical for situations where a video becomes popular because the load is then spread across the network, with performance increasing with the number of nodes. However, the torrenting aspect of it only works with WebRTC enabled browsers and so this means it's unlikely to fully work with a Tor browser. Without WebRTC then from a user point of view it's effectively the same thing as Mediagoblin.

@@ -260,9 +260,9 @@ This is a video hosting system similar to Mediagoblin but using -

Installation

-
+
+

Installation

+

Log into your system with:

@@ -282,9 +282,9 @@ Select Add/Remove Apps then peertube. You will then be asked for a
-
-

Initial setup

-
+
+

Initial setup

+

Navigate to your site and select Signup to create a new account. By default the maximum number of accounts on your system is limited to a small number so that millions of random internet users can't then begin uploading dubious content. After that it's pretty straightforward.

From e88753d38b6032028d299fc47813abecf148e29c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 17:27:28 +0000 Subject: [PATCH 03/64] Add some subdirectories to the mesh public desktop folder --- src/freedombone-image-mesh | 4 +++- src/meshavahi | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 7b5cbd63..b8cfa6ef 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -680,7 +680,9 @@ function setup_ipfs { TOX_ID='none' if [ -d /home/$MY_USERNAME/Desktop ]; then if [ ! -d /home/$MY_USERNAME/Public ]; then - mkdir /home/$MY_USERNAME/Public + mkdir -p /home/$MY_USERNAME/Public/Videos + mkdir -p /home/$MY_USERNAME/Public/Music + mkdir -p /home/$MY_USERNAME/Public/Documents echo $'Files within this directory will be publicly visible on the network' > /home/$MY_USERNAME/Public/README.txt chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Public ln -s /home/$MY_USERNAME/Public /home/$MY_USERNAME/Desktop/Public diff --git a/src/meshavahi b/src/meshavahi index 74a66899..ead868fc 100755 --- a/src/meshavahi +++ b/src/meshavahi @@ -68,6 +68,25 @@ function ipfs_publish { NEW_STAT=$(stat -t $DIR_TO_CHECK) + # include some subdirectories + for dir in $DIR_TO_CHECK/*/ + do + REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir)" + NEW_STAT="$REALLY_NEW_STAT" + + for dir2 in "$dir"/*/ + do + REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir2)" + NEW_STAT="$REALLY_NEW_STAT" + + for dir3 in "$dir2"/*/ + do + REALLY_NEW_STAT="$NEW_STAT$(stat -t $dir3)" + NEW_STAT="$REALLY_NEW_STAT" + done + done + done + if [ "$OLD_STAT" != "$NEW_STAT" ]; then su -c "echo \$($IPFS_COMMAND add -rq /home/$MY_USERNAME/Public | tail -n 1) > $IPFS_PUBLIC" - $MY_USERNAME echo "$NEW_STAT" > $OLD_STAT_FILE From 206d683c0162a34048578ec59a03238e4c7c42a7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 17:42:55 +0000 Subject: [PATCH 04/64] Switch mesh browser from midori to firefox --- src/freedombone-image-customise | 9 +++++---- src/freedombone-image-mesh | 4 ++-- src/freedombone-mesh-visit-site | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index fc77b551..8e25e8a9 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -99,7 +99,8 @@ INSECURE='no' MESH_DESKTOP_BACKGROUND_IMAGE=/usr/local/share/${PROJECT_NAME}_mesh_initial_background.png # The browser application to use -BROWSER=midori +BROWSER=firefox +BROWSER_OPTIONS='-url' MESH_INSTALL_DIR=/var/lib @@ -946,7 +947,7 @@ if [ \$no_of_users -gt 0 ]; then echo 'Comment[it]=Editing collaborativo di documenti in tempo reale' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Comment[ru]=Совместное редактирование документов в режиме реального времени' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Comment[zh]=实时协同编辑文件' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop - echo "Exec=$BROWSER http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop + echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop @@ -954,7 +955,7 @@ if [ \$no_of_users -gt 0 ]; then chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop else if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then - sed -i "s|Exec=.*|Exec=$BROWSER http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop + sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop fi fi fi @@ -1250,7 +1251,7 @@ EOF fi # browser - chroot "$rootdir" apt-get -yq install $BROWSER + chroot "$rootdir" apt-get -yq install firefox-esr # help mkdir -p $rootdir/home/${MY_USERNAME}/help/images diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index b8cfa6ef..14a73c22 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -32,8 +32,8 @@ export TEXTDOMAIN=${PROJECT_NAME}-image-mesh export TEXTDOMAINDIR="/usr/share/locale" # The browser application to use -BROWSER=midori -BROWSER_OPTIONS='-p' +BROWSER=firefox +BROWSER_OPTIONS='-private -url' MY_USERNAME='fbone' PEER_ID= diff --git a/src/freedombone-mesh-visit-site b/src/freedombone-mesh-visit-site index 58de73e5..c2342b61 100755 --- a/src/freedombone-mesh-visit-site +++ b/src/freedombone-mesh-visit-site @@ -34,8 +34,8 @@ export TEXTDOMAINDIR="/usr/share/locale" IPFS_URL='http://127.0.0.1:8080/ipns' # The browser application to use -BROWSER=midori -BROWSER_OPTIONS='-p' +BROWSER=firefox +BROWSER_OPTIONS='-url' # An optional suffix to be appended to the URL SUFFIX=$1 From a497c0319532b5b6aeff29c00543b2ba60f0e18b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 19:50:47 +0000 Subject: [PATCH 05/64] Add a couple more public subdirectories on mesh clients --- src/freedombone-image-mesh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 14a73c22..6f86599b 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -682,7 +682,9 @@ function setup_ipfs { if [ ! -d /home/$MY_USERNAME/Public ]; then mkdir -p /home/$MY_USERNAME/Public/Videos mkdir -p /home/$MY_USERNAME/Public/Music + mkdir -p /home/$MY_USERNAME/Public/Podcasts mkdir -p /home/$MY_USERNAME/Public/Documents + mkdir -p /home/$MY_USERNAME/Public/Pictures echo $'Files within this directory will be publicly visible on the network' > /home/$MY_USERNAME/Public/README.txt chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Public ln -s /home/$MY_USERNAME/Public /home/$MY_USERNAME/Desktop/Public From 425cfdb5a1ebd083c5f4be3a81be5488c1197973 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 22:03:55 +0000 Subject: [PATCH 06/64] Add peertube to mesh client --- src/freedombone-app-peertube | 171 +++++++++++++++++++++++++++++-- src/freedombone-image-customise | 30 ++++++ src/freedombone-image-mesh | 58 ++++++++++- src/freedombone-utils-postgresql | 26 ++++- 4 files changed, 272 insertions(+), 13 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 3e85b891..59ee811d 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -39,6 +39,7 @@ PEERTUBE_REPO="https://github.com/Chocobozzz/PeerTube" PEERTUBE_COMMIT='fef2c7164e025b12a64185dbab058ef4129733c6' PEERTUBE_ONION_PORT=8136 PEERTUBE_PORT=9004 +MESH_PEERTUBE_PORT=8500 PEERTUBE_DIR=/etc/peertube peertube_variables=(PEERTUBE_DOMAIN_NAME @@ -479,21 +480,83 @@ function peertube_setup_web { nginx_ensite $PEERTUBE_DOMAIN_NAME } +function mesh_peertube_setup_web { + peertube_nginx_file=$rootdir/etc/nginx/sites-available/peertube + + echo 'server {' >> $peertube_nginx_file + echo " listen $MESH_PEERTUBE_PORT http2;" >> $peertube_nginx_file + echo ' listen [::]:$MESH_PEERTUBE_PORT http2;' >> $peertube_nginx_file + echo ' server_name $HOSTNAME;' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo ' location / {' >> $peertube_nginx_file + echo " proxy_pass http://localhost:${PEERTUBE_PORT};" >> $peertube_nginx_file + echo ' proxy_set_header X-Real-IP $remote_addr;' >> $peertube_nginx_file + echo ' proxy_set_header Host $host;' >> $peertube_nginx_file + echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo ' # For the video upload' >> $peertube_nginx_file + echo ' client_max_body_size 2G;' >> $peertube_nginx_file + echo ' }' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo ' location /static/webseed {' >> $peertube_nginx_file + echo " if (\$request_method = 'OPTIONS') {" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Origin' '*';" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';" >> $peertube_nginx_file + echo " add_header 'Access-Control-Max-Age' 1728000;" >> $peertube_nginx_file + echo " add_header 'Content-Type' 'text/plain charset=UTF-8';" >> $peertube_nginx_file + echo " add_header 'Content-Length' 0;" >> $peertube_nginx_file + echo ' return 204;' >> $peertube_nginx_file + echo ' }' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo " if (\$request_method = 'GET') {" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Origin' '*';" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';" >> $peertube_nginx_file + echo " add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';" >> $peertube_nginx_file + echo ' }' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo " alias $PEERTUBE_DIR/videos;" >> $peertube_nginx_file + echo ' }' >> $peertube_nginx_file + echo '' >> $peertube_nginx_file + echo ' # Websocket tracker' >> $peertube_nginx_file + echo ' location /tracker/socket {' >> $peertube_nginx_file + echo ' # Peers send a message to the tracker every 15 minutes' >> $peertube_nginx_file + echo ' # Dont close the websocket before this time' >> $peertube_nginx_file + echo ' proxy_read_timeout 1200s;' >> $peertube_nginx_file + echo ' proxy_set_header Upgrade $http_upgrade;' >> $peertube_nginx_file + echo ' proxy_set_header Connection "upgrade";' >> $peertube_nginx_file + echo ' proxy_http_version 1.1;' >> $peertube_nginx_file + echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $peertube_nginx_file + echo ' proxy_set_header Host $host;' >> $peertube_nginx_file + echo " proxy_pass http://localhost:${PEERTUBE_PORT};" >> $peertube_nginx_file + echo ' }' >> $peertube_nginx_file + echo '}' >> $peertube_nginx_file +} + function peertube_create_config { - peertube_config_file=$PEERTUBE_DIR/config/production.yaml + peertube_prefix=$1 + + peertube_config_file=$peertube_prefix$PEERTUBE_DIR/config/production.yaml + echo 'listen:' > $peertube_config_file echo " port: $PEERTUBE_PORT" >> $peertube_config_file echo '' >> $peertube_config_file echo '# Correspond to your reverse proxy "listen" configuration' >> $peertube_config_file echo 'webserver:' >> $peertube_config_file - if [[ $ONION_ONLY == 'no' ]]; then - echo ' https: true' >> $peertube_config_file - echo " hostname: '$PEERTUBE_DOMAIN_NAME'" >> $peertube_config_file - echo ' port: 443' >> $peertube_config_file + if [ ! $peertube_prefix ]; then + if [[ $ONION_ONLY == 'no' ]]; then + echo ' https: true' >> $peertube_config_file + echo " hostname: '$PEERTUBE_DOMAIN_NAME'" >> $peertube_config_file + echo ' port: 443' >> $peertube_config_file + else + echo ' https: false' >> $peertube_config_file + echo " hostname: '$PEERTUBE_ONION_HOSTNAME'" >> $peertube_config_file + echo ' port: 80' >> $peertube_config_file + fi else echo ' https: false' >> $peertube_config_file - echo " hostname: '$PEERTUBE_ONION_HOSTNAME'" >> $peertube_config_file - echo ' port: 80' >> $peertube_config_file + echo " hostname: ''" >> $peertube_config_file + echo " port: $MESH_PEERTUBE_PORT" >> $peertube_config_file fi echo '' >> $peertube_config_file echo '# Your database name will be "peertube"+database.suffix' >> $peertube_config_file @@ -502,7 +565,11 @@ function peertube_create_config { echo ' port: 5432' >> $peertube_config_file echo " suffix: ''" >> $peertube_config_file echo " username: 'peertube'" >> $peertube_config_file - echo " password: '$PEERTUBE_ADMIN_PASSWORD'" >> $peertube_config_file + if [ ! $peertube_prefix ]; then + echo " password: '$PEERTUBE_ADMIN_PASSWORD'" >> $peertube_config_file + else + echo " password: ''" >> $peertube_config_file + fi echo '' >> $peertube_config_file echo '# From the project root directory' >> $peertube_config_file echo 'storage:' >> $peertube_config_file @@ -519,7 +586,7 @@ function peertube_create_config { echo ' size: 10 # Max number of previews you want to cache' >> $peertube_config_file echo '' >> $peertube_config_file echo 'admin:' >> $peertube_config_file - echo " email: '$MY_EMAIL_ADDRESS'" >> $peertube_config_file + echo " email: 'root@local'" >> $peertube_config_file echo '' >> $peertube_config_file echo 'signup:' >> $peertube_config_file echo ' enabled: true' >> $peertube_config_file @@ -543,7 +610,93 @@ function peertube_create_config { echo ' 1080p: false' >> $peertube_config_file } +function mesh_install_peertube { + if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then + return + fi + + chroot "$rootdir" apt-get -yq install ffmpeg + + function_check install_postgresql + install_postgresql + + if [ -d $rootdir$PEERTUBE_DIR ]; then + rm -rf $rootdir$PEERTUBE_DIR + fi + + chroot "$rootdir" groupadd peertube + chroot "$rootdir" useradd -c "PeerTube system account" -d $PEERTUBE_DIR -m -r -g peertube peertube + + #peertube_create_database + + git clone $PEERTUBE_REPO $rootdir$PEERTUBE_DIR + + cd $rootdir$PEERTUBE_DIR + git checkout $PEERTUBE_COMMIT -b $PEERTUBE_COMMIT + + get_npm_arch + + cat < $rootdir/usr/bin/install_peertube +#!/bin/bash +cd $PEERTUBE_DIR +npm install --arch=$NPM_ARCH -g yarn +if [ ! "$?" = "0" ]; then + echo $'PeerTube Failed to install yarn' + exit 79353234 +fi +yarn add -D webpack --network-concurrency 1 +yarn install +if [ ! "$?" = "0" ]; then + echo $'PeerTube Failed to run yarn install' + exit 63754235 +fi +npm install --arch=$NPM_ARCH +if [ ! "$?" = "0" ]; then + echo $'PeerTube Failed to install peertube' + exit 7835243 +fi +npm run build --arch=$NPM_ARCH +if [ ! "$?" = "0" ]; then + echo $'PeerTube Failed to build peertube' + exit 5293593 +fi +EOF + chmod +x $rootdir/usr/bin/install_peertube + chroot "$rootdir" /usr/bin/install_peertube + + echo '[Unit]' > $rootdir/etc/systemd/system/peertube.service + echo 'Description=PeerTube Decentralized video streaming platform' >> $rootdir/etc/systemd/system/peertube.service + echo 'After=syslog.target' >> $rootdir/etc/systemd/system/peertube.service + echo 'After=network.target' >> $rootdir/etc/systemd/system/peertube.service + echo '' >> $rootdir/etc/systemd/system/peertube.service + echo '[Service]' >> $rootdir/etc/systemd/system/peertube.service + echo 'User=peertube' >> $rootdir/etc/systemd/system/peertube.service + echo 'Group=peertube' >> $rootdir/etc/systemd/system/peertube.service + echo "WorkingDirectory=$PEERTUBE_DIR" >> $rootdir/etc/systemd/system/peertube.service + echo "ExecStart=/usr/local/bin/npm start" >> $rootdir/etc/systemd/system/peertube.service + echo "ExecStop=/usr/local/bin/npm stop" >> $rootdir/etc/systemd/system/peertube.service + echo 'StandardOutput=syslog' >> $rootdir/etc/systemd/system/peertube.service + echo 'StandardError=syslog' >> $rootdir/etc/systemd/system/peertube.service + echo 'SyslogIdentifier=peertube' >> $rootdir/etc/systemd/system/peertube.service + echo 'Restart=always' >> $rootdir/etc/systemd/system/peertube.service + echo "Environment=NODE_ENV=production" >> $rootdir/etc/systemd/system/peertube.service + echo '' >> $rootdir/etc/systemd/system/peertube.service + echo '[Install]' >> $rootdir/etc/systemd/system/peertube.service + echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/peertube.service + + peertube_create_config $rootdir + + chroot "$rootdir" chown -R peertube:peertube $PEERTUBE_DIR + + mesh_peertube_setup_web +} + function install_peertube { + if [[ $VARIANT == "mesh"* ]]; then + mesh_install_peertube + return + fi + if [ ! $ONION_ONLY ]; then ONION_ONLY='no' fi diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 8e25e8a9..6b5f5bbe 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -705,6 +705,7 @@ initialise_mesh() { install_web_server install_pelican mesh_install_cryptpad + mesh_install_peertube if [ $ENABLE_ZERONET ]; then install_zeronet fi @@ -960,6 +961,35 @@ if [ \$no_of_users -gt 0 ]; then fi fi + if [ ! -f /home/$MY_USERNAME/.peertube.desktop ]; then + if [ ! -f /home/$MY_USERNAME/Desktop/peertube.desktop ]; then + echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Name=PeerTube' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment=Upload and view videos on the mesh' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[el]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ar]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ca]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[hi]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[fr]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[de]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[es]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[it]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ru]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[zh]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT" >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_peertube.png" >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/peertube.desktop + chmod +x /home/$MY_USERNAME/Desktop/peertube.desktop + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/peertube.desktop + else + if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/peertube.desktop; then + sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT|g" /home/$MY_USERNAME/Desktop/peertube.desktop + fi + fi + fi + if [ ! -f /home/$MY_USERNAME/Desktop/social.desktop ]; then echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/social.desktop echo 'Name=Social' >> /home/$MY_USERNAME/Desktop/social.desktop diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 6f86599b..979f1542 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -88,6 +88,59 @@ SCUTTLEBOT_PORT=8010 CRYPTPAD_PORT=9003 CRYPTPAD_DIR=/etc/cryptpad +PEERTUBE_DIR=/etc/peertube + +function run_system_query_postgresql { + query=$1 + cd /etc/postgresql + sudo -u postgres psql -c "$query" +} + +function create_password { + openssl rand -base64 32 | tr -dc A-Za-z0-9 | head -c ${1} ; echo -n '' +} + +function enable_peertube { + if [ ! -d $PEERTUBE_DIR ]; then + return + fi + + PEERTUBE_ADMIN_PASSWORD="$(create_password 10)" + + if [ -d $PEERTUBE_DIR/videos ]; then + rm -rf $PEERTUBE_DIR/videos/* + fi + if [ -d $PEERTUBE_DIR/thumbnails ]; then + rm -rf $PEERTUBE_DIR/thumbnails/* + fi + + systemctl restart postgresql + run_system_query_postgresql "DROP DATABASE peertube;" + run_system_query_postgresql "CREATE USER peertube WITH PASSWORD '$PEERTUBE_ADMIN_PASSWORD';" + run_system_query_postgresql "CREATE DATABASE peertube OWNER peertube;" + run_system_query_postgresql "GRANT ALL PRIVILEGES ON DATABASE peertube to peertube;" + run_system_query_postgresql "set statement_timeout to 40000;" + + peertube_config_file=$PEERTUBE_DIR/config/production.yaml + sed -i "s|hostname:.*|hostname: 'P$PEER_ID.local'|g" $peertube_config_file + sed -i "s|password:.*|password: '$PEERTUBE_ADMIN_PASSWORD'|g" $peertube_config_file + + peertube_nginx_file=/etc/nginx/sites-available/peertube + sed -i "s|server_name.*|server_name P$PEER_ID.local;|g" $peertube_nginx_file + + chown -R peertube:peertube $PEERTUBE_DIR + + # Set up the web server + ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube + if [ -f /etc/nginx/sites-enabled/default ]; then + rm /etc/nginx/sites-enabled/default + fi + + systemctl enable peertube + systemctl daemon-reload + systemctl start peertube +} + function enable_cryptpad { if [ ! -d $CRYPTPAD_DIR ]; then return @@ -95,7 +148,9 @@ function enable_cryptpad { # Set up the web server ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad - rm /etc/nginx/sites-enabled/default + if [ -f /etc/nginx/sites-enabled/default ]; then + rm /etc/nginx/sites-enabled/default + fi if [ ! -d $CRYPTPAD_DIR/customize/api ]; then mkdir -p $CRYPTPAD_DIR/customize/api @@ -1042,6 +1097,7 @@ if [ -f $MESH_INSTALL_SETUP ]; then initialise_scuttlebot_pub setup_ipfs enable_cryptpad + enable_peertube mesh_amnesic make_root_read_only diff --git a/src/freedombone-utils-postgresql b/src/freedombone-utils-postgresql index b24899b7..676eef6d 100755 --- a/src/freedombone-utils-postgresql +++ b/src/freedombone-utils-postgresql @@ -30,6 +30,7 @@ # Set this when calling backup and restore commands USE_POSTGRESQL= +POSTGRESQL_PACKAGES='postgresql-9.6 postgresql-contrib-9.6 postgresql-client' function store_original_postgresql_password { if [ ! -f /root/.postgresqloriginal ]; then @@ -48,7 +49,26 @@ function get_postgresql_password { fi } +function mesh_install_postgresql { + chroot "$rootdir" apt-get -yq install $POSTGRESQL_PACKAGES + + if [ ! -d $rootdir/etc/postgresql ]; then + echo $"ERROR: postgresql does not appear to have installed." + exit 78352 + fi + + if [ ! -f $rootdir/usr/bin/psql ]; then + echo $"ERROR: psql command does not appear to have installed." + exit 835290 + fi +} + function install_postgresql { + if [[ $VARIANT == "mesh"* ]]; then + mesh_install_postgresql + return + fi + if [[ $(is_completed $FUNCNAME) == "1" ]]; then return fi @@ -64,7 +84,7 @@ function install_postgresql { fi ${PROJECT_NAME}-pass -u root -a postgresql -p "$POSTGRESQL_PASSWORD" - apt-get -yq install postgresql-9.6 postgresql-contrib-9.6 postgresql-client + apt-get -yq install $POSTGRESQL_PACKAGES apt-get -yq remove --purge apache2-bin* if [ -d /etc/apache2 ]; then rm -rf /etc/apache2 @@ -72,12 +92,12 @@ function install_postgresql { fi if [ ! -d /etc/postgresql ]; then - echo $"ERROR: postgresql does not appear to have installed. $CHECK_MESSAGE" + echo $"ERROR: postgresql does not appear to have installed." exit 78352 fi if [ ! -f /usr/bin/psql ]; then - echo $"ERROR: psql command does not appear to have installed. $CHECK_MESSAGE" + echo $"ERROR: psql command does not appear to have installed." exit 835290 fi From 43eab839b5c2758ca35763fd6cab9c4a00d87689 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 3 Dec 2017 22:21:06 +0000 Subject: [PATCH 07/64] Tidying --- src/freedombone-app-peertube | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 59ee811d..ffed4812 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -627,8 +627,6 @@ function mesh_install_peertube { chroot "$rootdir" groupadd peertube chroot "$rootdir" useradd -c "PeerTube system account" -d $PEERTUBE_DIR -m -r -g peertube peertube - #peertube_create_database - git clone $PEERTUBE_REPO $rootdir$PEERTUBE_DIR cd $rootdir$PEERTUBE_DIR From f8a9f4d522350305f1cdbdaf4fc4d9a7b969fe2a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 10:35:03 +0000 Subject: [PATCH 08/64] Clone repo before creating peertube user --- src/freedombone-app-peertube | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index ffed4812..a6fc4f75 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -624,11 +624,11 @@ function mesh_install_peertube { rm -rf $rootdir$PEERTUBE_DIR fi + git clone $PEERTUBE_REPO $rootdir$PEERTUBE_DIR + chroot "$rootdir" groupadd peertube chroot "$rootdir" useradd -c "PeerTube system account" -d $PEERTUBE_DIR -m -r -g peertube peertube - git clone $PEERTUBE_REPO $rootdir$PEERTUBE_DIR - cd $rootdir$PEERTUBE_DIR git checkout $PEERTUBE_COMMIT -b $PEERTUBE_COMMIT From 4a04d29121a44ef1e0fdec566c9a9972bb059b16 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 11:10:55 +0000 Subject: [PATCH 09/64] Exit if peertube install fails --- src/freedombone-app-peertube | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index a6fc4f75..b060adc4 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -661,6 +661,10 @@ fi EOF chmod +x $rootdir/usr/bin/install_peertube chroot "$rootdir" /usr/bin/install_peertube + if [ ! "$?" = "0" ]; then + echo $'PeerTube install failed' + exit 735638 + fi echo '[Unit]' > $rootdir/etc/systemd/system/peertube.service echo 'Description=PeerTube Decentralized video streaming platform' >> $rootdir/etc/systemd/system/peertube.service From 1f702d1900bbc8aa43b49eaf75aee02b75eba4c6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 11:22:03 +0000 Subject: [PATCH 10/64] Test nodejs version numbers --- src/freedombone-utils-nodejs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index 2b02db86..1c1b484d 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -127,6 +127,28 @@ function mesh_install_nodejs { $mesh_install_nodejs_prefix npm install --arch=$NPM_ARCH -g n@${NODEJS_N_VERSION} --save $mesh_install_nodejs_prefix n --arch $N_ARCH ${NODEJS_VERSION} cp $rootdir/root/npm $rootdir/usr/bin/npm + + # check the version numbers + cat < $rootdir/usr/bin/test_nodejs_install +#!/bin/bash +node_version=\$(node -v) +if [[ "\$node_version" != "v${NODEJS_VERSION}" ]]; then + echo $"nodejs version expected to be ${NODEJS_VERSION} but found \$node_version" + exit 1 +fi +npm_version=\$(npm -v) +if [[ "\$npm_version" != "v${NPM_VERSION}" ]]; then + echo $"npm version expected to be ${NPM_VERSION} but found \$npm_version" + exit 2 +fi +EOF + chmod +x $rootdir/usr/bin/test_nodejs_install + chroot "$rootdir" /usr/bin/test_nodejs_install + if [ ! "$?" = "0" ]; then + echo $"nodejs version numbers did not match. Architecture is $NPM_ARCH." + exit 76835282 + fi + rm $rootdir/usr/bin/test_nodejs_install } function remove_nodejs { From c4e5f013597bfc06c7e9050b6f090b45eb5fec5c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 11:37:31 +0000 Subject: [PATCH 11/64] Second install of npm --- src/freedombone-utils-nodejs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index 1c1b484d..c5d94db2 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -128,6 +128,13 @@ function mesh_install_nodejs { $mesh_install_nodejs_prefix n --arch $N_ARCH ${NODEJS_VERSION} cp $rootdir/root/npm $rootdir/usr/bin/npm + # deliberate second install of npm + $mesh_install_nodejs_prefix npm install --arch=$NPM_ARCH -g npm@${NPM_VERSION} --save + if [ -f $rootdir/usr/local/bin/npm ]; then + cp $rootdir/usr/local/bin/npm /usr/bin/npm + fi + cp $rootdir/usr/bin/npm $rootdir/root/npm + # check the version numbers cat < $rootdir/usr/bin/test_nodejs_install #!/bin/bash From 02d727064792671b3795654efd554026691621d8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 11:47:48 +0000 Subject: [PATCH 12/64] No v in npm version --- src/freedombone-utils-nodejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index c5d94db2..626fe229 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -144,7 +144,7 @@ if [[ "\$node_version" != "v${NODEJS_VERSION}" ]]; then exit 1 fi npm_version=\$(npm -v) -if [[ "\$npm_version" != "v${NPM_VERSION}" ]]; then +if [[ "\$npm_version" != "${NPM_VERSION}" ]]; then echo $"npm version expected to be ${NPM_VERSION} but found \$npm_version" exit 2 fi From e724c5f32fe113cc19ae57d49ab13337eef4422b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 12:31:06 +0000 Subject: [PATCH 13/64] Try some additional peertube build dependencies --- src/freedombone-app-peertube | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index b060adc4..e31d5268 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -642,20 +642,30 @@ if [ ! "$?" = "0" ]; then echo $'PeerTube Failed to install yarn' exit 79353234 fi +npm install --arch=$NPM_ARCH bcrypt@1.0.3 --build-from-source +if [ ! "$?" = "0" ]; then + echo $'PeerTube failed to build bcrypt' + exit 73563543 +fi +npm install --arch=$NPM_ARCH fsevents@1.1.3 --build-from-source +if [ ! "$?" = "0" ]; then + echo $'PeerTube failed to build fsevents' + exit 2846393 +fi yarn add -D webpack --network-concurrency 1 yarn install if [ ! "$?" = "0" ]; then - echo $'PeerTube Failed to run yarn install' + echo $'PeerTube failed to run yarn install' exit 63754235 fi npm install --arch=$NPM_ARCH if [ ! "$?" = "0" ]; then - echo $'PeerTube Failed to install peertube' + echo $'PeerTube failed to install peertube' exit 7835243 fi npm run build --arch=$NPM_ARCH if [ ! "$?" = "0" ]; then - echo $'PeerTube Failed to build peertube' + echo $'PeerTube failed to build peertube' exit 5293593 fi EOF From 38665c7cf11d7c2c23ea75ff75b07595332768d1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 13:11:39 +0000 Subject: [PATCH 14/64] Try ignoring optional packages --- src/freedombone-app-peertube | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index e31d5268..f892e08a 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -616,6 +616,8 @@ function mesh_install_peertube { fi chroot "$rootdir" apt-get -yq install ffmpeg + chroot "$rootdir" apt-get -yq install -y gcc-multilib + chroot "$rootdir" apt-get -yq install -y g++-multilib function_check install_postgresql install_postgresql @@ -642,28 +644,18 @@ if [ ! "$?" = "0" ]; then echo $'PeerTube Failed to install yarn' exit 79353234 fi -npm install --arch=$NPM_ARCH bcrypt@1.0.3 --build-from-source -if [ ! "$?" = "0" ]; then - echo $'PeerTube failed to build bcrypt' - exit 73563543 -fi -npm install --arch=$NPM_ARCH fsevents@1.1.3 --build-from-source -if [ ! "$?" = "0" ]; then - echo $'PeerTube failed to build fsevents' - exit 2846393 -fi yarn add -D webpack --network-concurrency 1 -yarn install +yarn install --ignore-optional if [ ! "$?" = "0" ]; then echo $'PeerTube failed to run yarn install' exit 63754235 fi -npm install --arch=$NPM_ARCH +npm install --arch=$NPM_ARCH --no-optional if [ ! "$?" = "0" ]; then echo $'PeerTube failed to install peertube' exit 7835243 fi -npm run build --arch=$NPM_ARCH +npm run build --arch=$NPM_ARCH --no-optional if [ ! "$?" = "0" ]; then echo $'PeerTube failed to build peertube' exit 5293593 From 0dbb10f2db283b874aac5339f2b1942a59fc41f9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 16:34:23 +0000 Subject: [PATCH 15/64] Limit peertube to x86 64bit --- src/freedombone-app-peertube | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index f892e08a..58936a82 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -614,10 +614,11 @@ function mesh_install_peertube { if [[ $VARIANT != "meshclient" && $VARIANT != "meshusb" ]]; then return fi + if [[ $ARCHITECTURE != 'x86_64' && $ARCHITECTURE != 'amd64' ]]; then + return + fi chroot "$rootdir" apt-get -yq install ffmpeg - chroot "$rootdir" apt-get -yq install -y gcc-multilib - chroot "$rootdir" apt-get -yq install -y g++-multilib function_check install_postgresql install_postgresql @@ -700,6 +701,9 @@ function install_peertube { mesh_install_peertube return fi + if [[ $ARCHITECTURE != 'x86_64' && $ARCHITECTURE != 'amd64' ]]; then + return + fi if [ ! $ONION_ONLY ]; then ONION_ONLY='no' From efc42f54476eae89d2c5d6c2aa67eab5a3cb22d0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 17:09:38 +0000 Subject: [PATCH 16/64] Check whether peertube was installed --- src/freedombone-image-customise | 52 +++++++++++++++++---------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 6b5f5bbe..78824e98 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -961,31 +961,33 @@ if [ \$no_of_users -gt 0 ]; then fi fi - if [ ! -f /home/$MY_USERNAME/.peertube.desktop ]; then - if [ ! -f /home/$MY_USERNAME/Desktop/peertube.desktop ]; then - echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Name=PeerTube' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment=Upload and view videos on the mesh' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[el]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[ar]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[ca]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[hi]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[fr]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[de]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[es]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[it]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[ru]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Comment[zh]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT" >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_peertube.png" >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/peertube.desktop - echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/peertube.desktop - chmod +x /home/$MY_USERNAME/Desktop/peertube.desktop - chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/peertube.desktop - else - if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/peertube.desktop; then - sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT|g" /home/$MY_USERNAME/Desktop/peertube.desktop + if [ -d /etc/peertube ]; then + if [ ! -f /home/$MY_USERNAME/.peertube.desktop ]; then + if [ ! -f /home/$MY_USERNAME/Desktop/peertube.desktop ]; then + echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Name=PeerTube' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment=Upload and view videos on the mesh' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[el]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ar]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ca]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[hi]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[fr]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[de]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[es]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[it]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[ru]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Comment[zh]=' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo "Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT" >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_peertube.png" >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/peertube.desktop + echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/peertube.desktop + chmod +x /home/$MY_USERNAME/Desktop/peertube.desktop + chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/peertube.desktop + else + if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/peertube.desktop; then + sed -i "s|Exec=.*|Exec=$BROWSER $BROWSER_OPTIONS http://\${HOSTNAME}.local:$MESH_PEERTUBE_PORT|g" /home/$MY_USERNAME/Desktop/peertube.desktop + fi fi fi fi From 6bdbc32a5a89481ee63ec9e6117b2dd84274ae88 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 17:50:07 +0000 Subject: [PATCH 17/64] image size --- src/freedombone-image | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/freedombone-image b/src/freedombone-image index d18c956a..3eab34fb 100755 --- a/src/freedombone-image +++ b/src/freedombone-image @@ -69,7 +69,7 @@ TEMPBUILD_DIR=~/.tmp_${PROJECT_NAME}_build VMDEBOOTSTRAP_REPO=git://git.liw.fi/vmdebootstrap VMDEBOOTSTRAP_VERSION=0.8 MAKEFILE=${PROJECT_NAME}-image-makefile -IMAGE_SIZE=7.8G +IMAGE_SIZE=7.9G IMAGE_SIZE_SPECIFIED= IMAGE_NAME='full' @@ -544,7 +544,7 @@ if [[ $VARIANT == 'meshclient' || $VARIANT == 'meshusb' ]]; then fi if [ ! $IMAGE_SIZE_SPECIFIED ]; then - IMAGE_SIZE=7.5G + IMAGE_SIZE=7.9G fi fi From f4946f0b15a0fda42cdd2efaad1c1846b27a1c2b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 18:30:53 +0000 Subject: [PATCH 18/64] Check for webpack failure --- src/freedombone-app-peertube | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 58936a82..4919722b 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -641,23 +641,27 @@ function mesh_install_peertube { #!/bin/bash cd $PEERTUBE_DIR npm install --arch=$NPM_ARCH -g yarn -if [ ! "$?" = "0" ]; then +if [ ! "\$?" = "0" ]; then echo $'PeerTube Failed to install yarn' exit 79353234 fi -yarn add -D webpack --network-concurrency 1 +yarn add -D webpack +if [ ! "\$?" = "0" ]; then + echo $'PeerTube failed to add webpack' + exit 67342823 +fi yarn install --ignore-optional -if [ ! "$?" = "0" ]; then +if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to run yarn install' exit 63754235 fi npm install --arch=$NPM_ARCH --no-optional -if [ ! "$?" = "0" ]; then +if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to install peertube' exit 7835243 fi npm run build --arch=$NPM_ARCH --no-optional -if [ ! "$?" = "0" ]; then +if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to build peertube' exit 5293593 fi From 26f228eb8679ccf11864011003c7128a3b652df9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 19:15:13 +0000 Subject: [PATCH 19/64] Try installing webpack without yarn --- src/freedombone-app-peertube | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 4919722b..07163696 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -645,16 +645,21 @@ if [ ! "\$?" = "0" ]; then echo $'PeerTube Failed to install yarn' exit 79353234 fi -yarn add -D webpack +npm install --arch=$NPM_ARCH webpack --no-optional if [ ! "\$?" = "0" ]; then - echo $'PeerTube failed to add webpack' - exit 67342823 -fi -yarn install --ignore-optional -if [ ! "\$?" = "0" ]; then - echo $'PeerTube failed to run yarn install' - exit 63754235 + echo $'PeerTube failed to install webpack' + exit 68386353 fi +#yarn add -D webpack +#if [ ! "\$?" = "0" ]; then +# echo $'PeerTube failed to add webpack' +# exit 67342823 +#fi +#yarn install --ignore-optional +#if [ ! "\$?" = "0" ]; then +# echo $'PeerTube failed to run yarn install' +# exit 63754235 +#fi npm install --arch=$NPM_ARCH --no-optional if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to install peertube' From e6e22eac6d316650b1620d79006e1db1ac92b7e0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 20:08:52 +0000 Subject: [PATCH 20/64] Install yarn from debian repo --- src/freedombone-app-peertube | 44 ++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 07163696..b6729a88 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -618,7 +618,7 @@ function mesh_install_peertube { return fi - chroot "$rootdir" apt-get -yq install ffmpeg + chroot "$rootdir" apt-get -yq install ffmpeg curl function_check install_postgresql install_postgresql @@ -635,37 +635,43 @@ function mesh_install_peertube { cd $rootdir$PEERTUBE_DIR git checkout $PEERTUBE_COMMIT -b $PEERTUBE_COMMIT + get_npm_arch cat < $rootdir/usr/bin/install_peertube #!/bin/bash cd $PEERTUBE_DIR -npm install --arch=$NPM_ARCH -g yarn -if [ ! "\$?" = "0" ]; then - echo $'PeerTube Failed to install yarn' - exit 79353234 -fi -npm install --arch=$NPM_ARCH webpack --no-optional -if [ ! "\$?" = "0" ]; then - echo $'PeerTube failed to install webpack' - exit 68386353 -fi -#yarn add -D webpack +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +apt-get -y update +apt-get -yq install yarn + +#npm install --arch=$NPM_ARCH -g yarn #if [ ! "\$?" = "0" ]; then -# echo $'PeerTube failed to add webpack' -# exit 67342823 +# echo $'PeerTube Failed to install yarn' +# exit 79353234 #fi -#yarn install --ignore-optional +#npm install --arch=$NPM_ARCH webpack@3.10.0 --no-optional #if [ ! "\$?" = "0" ]; then -# echo $'PeerTube failed to run yarn install' -# exit 63754235 +# echo $'PeerTube failed to install webpack' +# exit 68386353 #fi -npm install --arch=$NPM_ARCH --no-optional +yarn add -D webpack +if [ ! "\$?" = "0" ]; then + echo $'PeerTube failed to add webpack' + exit 67342823 +fi +yarn install --ignore-optional +if [ ! "\$?" = "0" ]; then + echo $'PeerTube failed to run yarn install' + exit 63754235 +fi +npm install --arch=$NPM_ARCH if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to install peertube' exit 7835243 fi -npm run build --arch=$NPM_ARCH --no-optional +npm run build --arch=$NPM_ARCH if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to build peertube' exit 5293593 From 95d06ef9b9390d9de8e23507a1b40aa7c43c8a3c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 4 Dec 2017 22:35:44 +0000 Subject: [PATCH 21/64] Attempt yarn fix --- src/freedombone-app-peertube | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index b6729a88..9ab12c2d 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -656,6 +656,8 @@ apt-get -yq install yarn # echo $'PeerTube failed to install webpack' # exit 68386353 #fi +yarn install +yarn run build:prod yarn add -D webpack if [ ! "\$?" = "0" ]; then echo $'PeerTube failed to add webpack' From f1759c763195c9bf22a7c09c8ba8c2a2416328c4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 5 Dec 2017 18:27:57 +0000 Subject: [PATCH 22/64] Don't install peertube on mesh images for now --- src/freedombone-app-peertube | 3 +++ src/freedombone-image-customise | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/freedombone-app-peertube b/src/freedombone-app-peertube index 9ab12c2d..21b05612 100755 --- a/src/freedombone-app-peertube +++ b/src/freedombone-app-peertube @@ -10,6 +10,9 @@ # # PeerTube server # +# There's a problem with installing this onto mesh images, which is +# that qemu appears to run out of RAM when using yarn to add webpack. +# # License # ======= # diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 78824e98..d8e20061 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -705,7 +705,7 @@ initialise_mesh() { install_web_server install_pelican mesh_install_cryptpad - mesh_install_peertube + #mesh_install_peertube if [ $ENABLE_ZERONET ]; then install_zeronet fi From 6fcb305e045016a66bcb0957411cd8a5e7b5ec4a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 5 Dec 2017 20:24:09 +0000 Subject: [PATCH 23/64] video editing on mesh client --- src/freedombone-image-customise | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index d8e20061..bf225052 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -880,8 +880,8 @@ function configure_user_interface { # clipboard chroot "$rootdir" apt-get -yq install xclip - # audio recording - chroot "$rootdir" apt-get -yq install audacity + # multimedia recording and editing + chroot "$rootdir" apt-get -yq install audacity kdenlive # for gtk dialog entry chroot "$rootdir" apt-get -yq install zenity From 01ac99ca4cc03d91ecc449516b63485d3ec32d6f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 12:32:23 +0000 Subject: [PATCH 24/64] Icon theme for kdenlive --- src/freedombone-image-customise | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index bf225052..07dea758 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -881,7 +881,8 @@ function configure_user_interface { chroot "$rootdir" apt-get -yq install xclip # multimedia recording and editing - chroot "$rootdir" apt-get -yq install audacity kdenlive + chroot "$rootdir" apt-get -yq install audacity + chroot "$rootdir" apt-get -yq install kdenlive breeze-icon-theme # for gtk dialog entry chroot "$rootdir" apt-get -yq install zenity From 3653d345dc8cfbe7159db890b7a4f7a34e79ddae Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 13:33:40 +0000 Subject: [PATCH 25/64] kdenlive desktop icon --- img/icon_kdenlive.png | Bin 0 -> 1288 bytes src/freedombone-image-mesh | 159 +++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 img/icon_kdenlive.png diff --git a/img/icon_kdenlive.png b/img/icon_kdenlive.png new file mode 100644 index 0000000000000000000000000000000000000000..7643c7bb30f32ca2e8f2122a4e667879440221ea GIT binary patch literal 1288 zcmV+j1^4=iP)pN+iTL8O(+c$YWj>) zgGLC@I@XZHG7(&B1nJiDCr4XvJ(H(h%%d}d=S3@58R5(!BZZ-tMW`_CV=o!JcNy-8 za8=7G3BfbM2=Pcp2&5Oh%@jgrgkCa4T76{J5Lg#HgE91tEZ}*+0vREwI26waS9SDx z(zpL#@^|lk-^b_IR_2n%zf?+Reu*<%8WB* zGRjq^(N2au(n%|#PjlJPOolSrA>IZ#HA6Ow>kQdy^tB4XpFT6|X(o-fqkSCY^sDs_ zZDhzeZQXTgB10Z^^P?w!J--DR1jXY1jDe$@?IlC4FtegfGz-Ww+5juRUt1m4OomWm zQ9}mNS|)hp4Po0~8jg%CwYoOKSehJgRwh=J2=QIaQc-v3d#p|rHIX5=I!Tidlem^u z_p{<~4-q18EZtl(%(Ax|u{g_Mqkd;~H&JHY%nYMH*H&+5CXUt(MI!-@zBfWiS~guYuX__m1w^(SIbJi!iV=3UY%I$)UqV1i5`v8>&IqrfYtUQ^EuWt-V`^C} zJNJ%Jtc%CdWGEIK491fIjbNmP*9u680QvqS!=29Jc4?3<1Cp=YiS&T$RhdvH7J2%3 z4H@q0ha%zFnXTE;>IYx4sG~L56HC>i5gYbS(D>e`c>{BBYc`O6hk>DX)lv=l@q9 zrL)?(65rFT5w>mnn^O9-ZQEyrw#|zMI=kMkXqFAXAM^^53QkWS*W#J znSEgzZrZ!^TkKJ^I==OKJdCY8KC#w2ocFKTN9O0 zkv%GFw36aXKWHS`3SnG&E^LJ`YbC{~Yn2qJD?6j2F$1(3?P^Z1wWH9`8s}E0BkE)b zpk;l;Y(_u~F31QTpozE|S4rI*!P|Od&rE~Yl!8@bbrbJ~j`Sq-Dhz!ku+&)vvkfiX zVOTggG;Q1FCL*ua7;4WeYI$~`rL)qcTe5UCMN#w~vcT=qz?y+y0=R1*R~ooh3u(@* z#gap2wSX-z3%6ccORZrv^x=Ck*gM{i&=yW94I0uhN|@;*56%Q5Ld*Hh5^3K$p*T7xhz1Bpgu7G5-mbu6htS@ yL;w&0Km-6007L)~0YC%*5dcI05CK30(1~w!L6g}T4%W{A0000> /home/$MY_USERNAME/Desktop/social.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/social.desktop + echo '#!/usr/bin/env xdg-open' > /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo '# KDE Config File' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo '' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo '[Desktop Entry]' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ast]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[bs]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ca]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ca@valencia]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[cs]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[da]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[de]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[el]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[en_GB]=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[es]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[et]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[fi]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[fr]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ga]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[gl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[hu]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[it]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ja]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[km]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[lt]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[lv]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[mr]=के-डि-एनलाइव्ह' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[nb]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[nds]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[nl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[nn]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[pl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[pt]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[pt_BR]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ro]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ru]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[sk]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[sl]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[sv]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[tr]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[ug]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[uk]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[x-test]=xxKdenlivexx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[zh_CN]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Name[zh_TW]=Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ar]=محرّر فيديوهات' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ast]=Editor de videu' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[bs]=Video uređivač' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ca]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ca@valencia]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[cs]=Editor videí' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[da]=Videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[de]=Video-Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[el]=Επεξεργαστής βίντεο' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[en_GB]=Video Editor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[es]=Editor de video' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[et]=Videoredaktor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[fi]=Videomuokkain' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[fr]=Éditeur vidéo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ga]=Eagarthóir Físe' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[gl]=Editor de vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[hu]=Videoszerkesztő' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[it]=Editor video' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ja]=ビデオエディタ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[km]=កម្មវិធី​កែសម្រួល​វីដេអូ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[lt]=Video redaktorius' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[lv]=Video redaktors' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[mr]=व्हिडीओ संपादक' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[nb]=Videoredigeringsprogram' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[nl]=Video-bewerker' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[nn]=Videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[pl]=Edytor wideo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[pt]=Editor de Víde' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[pt_BR]=Editor de Vídeo' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ro]=Redactor de imagini' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[ru]=Видеоредактор' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[sk]=Editor videa' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[sl]=Urejevalnik videa' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[sv]=Videoeditor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[tr]=Video Düzenleyici' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[uk]=Відеоредактор' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[x-test]=xxVideo Editorxx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[zh_CN]=视频编辑器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'GenericName[zh_TW]=影像編輯器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment=Nonlinear video editor for KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ar]=محرّر فيديوهات غير خطّيّ لكدي' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ast]=Editor de videu non llinial pa KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[bs]=Nelinearni video uređivač za KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ca]=Editor de vídeo no lineal per al KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ca@valencia]=Editor de vídeo no lineal per al KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[cs]=Nelineární editor videí pro KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[da]=Ikke-lineær videoredigering til KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[de]=Nichtlinearer Video-Editor für KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[el]=Μη γραμμικός επεξεργαστής βίντεο για το KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[en_GB]=Nonlinear video editor for KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[es]=Editor no lineal de video para KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[et]=KDE mittelineaarne videoredaktor' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[fi]=Epälineaarinen videomuokkain KDE:lle' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[fr]=Éditeur vidéo non linéaire pour KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[gl]=Editor de vídeo non linear para KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[hu]=Nemlineáris videoszerkesztő a KDE-hez' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[it]=Editor di video non lineare per KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ja]=KDE 向けノンリニアビデオエディタ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[km]=កម្មវិធី​កែសម្រួល​វីដេអូ​មិន​លីនេអ៊ែរ​សម្រាប់ KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[lt]=Nelinijinis veido redaktorius skirtas KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[lv]=Nelineārais video redaktors KDE videi' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[mr]=केडीई करिता अरेषीय व्हिडीओ संपादक' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[nb]=Videoredigeringsprogram for KDE med dataklipping' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[nl]=Niet-lineaire video-bewerker voor KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[nn]=Program for ikkje-lineær videoredigering' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[pl]=Nieliniowy edytor wideo dla KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[pt]=Editor de vídeo não-linear para o KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[pt_BR]=Editor de vídeo não-linear para o KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ro]=Redactor de imagini neliniar pentru KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ru]=Нелинейный видеоредактор от KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[sk]=Nelineárny editor videa pre KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[sl]=Ne-linearni urejevalnik videa za KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[sv]=Icke-linjär videoeditor för KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[tr]=KDE için doğrusal olmayan video düzenleyici' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[ug]=KDE ئۈچۈن سىزىقسىز سىن تەھرىرلىگۈچ' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[uk]=Нелінійний редактор відео для KDE' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[x-test]=xxNonlinear video editor for KDExx' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[zh_CN]=KDE 的非线性视频编辑器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Comment[zh_TW]=KDE 上的非線性影像編輯器' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Exec=kdenlive %U' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_kdenlive.png" >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'X-DocPath=kdenlive/index.html' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'X-DocPath[cs]=http://cs.wikibooks.org/wiki/Kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'MimeType=application/x-kdenlive;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Categories=Qt;KDE;AudioVideo;AudioVideoEditing;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[ca]=edició;vídeo;àudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[ca@valencia]=edició;vídeo;àudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[da]=redigering;video;lyd;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[de]=Editing;Bearbeitung;Schnitt;Videoschnitt;Video;Audio;MLT;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[en_GB]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[es]=edición;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[et]=redigeerimine;muutmine;video;audio;heli;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[fi]=editing;video;audio;mlt;kde;editointi;ääni;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[fr]=montage;vidéo;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[gl]=editing;edición;video;vídeo;audio;son;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[it]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[nl]=bewerken;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[nn]=redigering;video;lyd;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[pl]=edytowanie;video;wideo;filmy;audio;dźwięk;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[pt]=edição;vídeo;áudio;MLT;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[pt_BR]=edição;vídeo;áudio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[sk]=editovanie;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[sl]=urejanje;video;zvok;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[sv]=redigering;video;ljud;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[uk]=editing;video;audio;mlt;kde;редагування;відео;звук;аудіо;млт;кдє;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[x-test]=xxeditingxx;xxvideoxx;xxaudioxx;xxmltxx;xxkdexx;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[zh_CN]=editing;video;audio;mlt;kde;编辑;视频;音频;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'Keywords[zh_TW]=editing;video;audio;mlt;kde;' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + echo 'X-DBUS-ServiceName=org.kde.kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + #echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/audio.desktop #echo 'Name=Audio/Music' >> /home/$MY_USERNAME/Desktop/audio.desktop #echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/audio.desktop From 62b69e0cbd7ffeae08960936d16f7acc280239fa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 13:36:48 +0000 Subject: [PATCH 26/64] Move kdenlive icon to avatars so that it is accessible to the fbone user --- src/freedombone-image-mesh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 1df4169a..15074910 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -480,6 +480,7 @@ function show_desktop_icons { echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/social.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/social.desktop + cp /root/${PROJECT_NAME}/img/icon_kdenlive.png /usr/share/${PROJECT_NAME}/avatars/icon_kdenlive.png echo '#!/usr/bin/env xdg-open' > /home/$MY_USERNAME/Desktop/kdenlive.desktop echo '# KDE Config File' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop echo '' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop From dbed21ecd9f388c4fee2273da8f12fc8ca5304ab Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 19:10:50 +0000 Subject: [PATCH 27/64] Use zenity for visiting mesh sites --- src/freedombone-mesh-visit-site | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/freedombone-mesh-visit-site b/src/freedombone-mesh-visit-site index c2342b61..f27d4920 100755 --- a/src/freedombone-mesh-visit-site +++ b/src/freedombone-mesh-visit-site @@ -49,15 +49,11 @@ if [ ! -f $USERS_FILE ]; then exit 0 fi -data=$(tempfile 2>/dev/null) -trap "rm -f $data" 0 1 2 5 15 -dialog --title $"Visit IPFS site" \ - --backtitle $"Freedombone mesh" \ - --inputbox $"Enter the username or Tox ID for the site you wish to visit" 8 70 2>$data +data=$(zenity --forms --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit" --separator="," --add-entry="") sel=$? case $sel in 0) - TOX_USERNAME_OR_ID=$(<$data) + TOX_USERNAME_OR_ID="$data" if [ ${#TOX_USERNAME_OR_ID} -gt 0 ]; then if ! grep -q "$TOX_USERNAME_OR_ID" $USERS_FILE; then TOX_ID="$TOX_USERNAME_OR_ID" From bc51fa6b3ae553b7455c289a9df9a0b813546712 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 19:11:50 +0000 Subject: [PATCH 28/64] Don't open within a terminal --- src/freedombone-image-customise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 07dea758..7d1a96e1 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1096,7 +1096,7 @@ if [ \$no_of_users -gt 0 ]; then echo "Comment[it]=Visita un sito" >> /home/$MY_USERNAME/Desktop/sites.desktop echo "Comment[ru]=Посетите сайт" >> /home/$MY_USERNAME/Desktop/sites.desktop echo "Comment[zh]=访问网站" >> /home/$MY_USERNAME/Desktop/sites.desktop - echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop + echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-visit-site' >> /home/$MY_USERNAME/Desktop/sites.desktop echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_sites.png' >> /home/$MY_USERNAME/Desktop/sites.desktop echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/sites.desktop chmod +x /home/$MY_USERNAME/Desktop/sites.desktop From dab37d1d226afb95e33267850c1be8d02626075d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 19:37:36 +0000 Subject: [PATCH 29/64] Use zenity entry so that enter key works --- src/freedombone-image-customise | 2 +- src/freedombone-mesh-visit-site | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 7d1a96e1..fdcbe0f3 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -789,7 +789,7 @@ function mesh_client_startup_applications { echo '' >> $START_DESKTOP echo 'INITIAL_TOX_USERNAME=""' >> $START_DESKTOP echo 'while [ ${#INITIAL_TOX_USERNAME} -eq 0 ]; do' >> $START_DESKTOP - echo " data=\$(zenity --forms --title=\"$MESH_TITLE\" --text=\"$MESH_SET_USERNAME\" --separator=\",\" --add-entry=\"Username\")" >> $START_DESKTOP + echo " data=\$(zenity --entry --title=\"$MESH_TITLE\" --text=\"$MESH_SET_USERNAME\")" >> $START_DESKTOP echo ' accepted=$?' >> $START_DESKTOP echo ' if ((accepted == 0)); then' >> $START_DESKTOP echo " INITIAL_TOX_USERNAME=\$(awk -F, '{print \$1}' <<<\$data)" >> $START_DESKTOP diff --git a/src/freedombone-mesh-visit-site b/src/freedombone-mesh-visit-site index f27d4920..c667ff08 100755 --- a/src/freedombone-mesh-visit-site +++ b/src/freedombone-mesh-visit-site @@ -49,7 +49,7 @@ if [ ! -f $USERS_FILE ]; then exit 0 fi -data=$(zenity --forms --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit" --separator="," --add-entry="") +data=$(zenity --entry --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit") sel=$? case $sel in 0) From 7cb7225c2f6415719cccaf0bff5dbb2b00e7a976 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 20:35:32 +0000 Subject: [PATCH 30/64] Use zenity for selecting mesh blog options --- src/freedombone-mesh-blog | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/freedombone-mesh-blog b/src/freedombone-mesh-blog index 62c67f90..4aac2630 100755 --- a/src/freedombone-mesh-blog +++ b/src/freedombone-mesh-blog @@ -222,29 +222,18 @@ function change_theme { } function menu_blog { - data=$(tempfile 2>/dev/null) - trap "rm -f $data" 0 1 2 5 15 - dialog --backtitle $"Freedombone Mesh" \ - --title $"Blogging" \ - --radiolist $"Choose an operation:" 19 50 12 \ - 1 $"View a blog" on \ - 2 $"New blog entry" off \ - 3 $"Edit the previous blog entry" off \ - 4 $"Delete the previous blog entry" off \ - 5 $"Change theme" off \ - 6 $"Exit" off 2> $data + data=$(zenity --list 1 $"View a blog" 2 $"New blog entry" 3 $"Edit the previous blog entry" 4 $"Delete the previous blog entry" 5 $"Change theme" --column="id" --title $"Blogging" --column=$"Choose an operation:" --hide-column=1 --print-column=1 --height=250) sel=$? case $sel in 1) exit 1;; 255) exit 1;; esac - case $(cat $data) in + case $data in 1) view_blog;; 2) new_blog;; 3) edit_blog;; 4) delete_blog;; 5) change_theme;; - 6) break;; esac } From 504c561ea3619914e5d65cc188cffd97a488c5da Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 21:17:50 +0000 Subject: [PATCH 31/64] Switch mesh vpn connection to zenity --- src/freedombone-mesh-connect | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/freedombone-mesh-connect b/src/freedombone-mesh-connect index 5a9163b3..2491083b 100755 --- a/src/freedombone-mesh-connect +++ b/src/freedombone-mesh-connect @@ -152,8 +152,7 @@ function mesh_setup_vpn { chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/vpn.tar.gz if [ -f vpn.tar.gz ]; then - dialog --title $"Generate VPN client keys" \ - --msgbox $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, forward port $VPN_MESH_TLS_PORT then connect using your IP address or domain name." 15 70 + zenity --info --title $"Generate VPN client keys" --text $"\nNew VPN client keys have been generated in the /home/fbone directory.\n\nYou can find it by selecting \"Places\" then \"Home Directory\" on the top menu bar. Transmit the vpn.tar.gz file to whoever is running the other mesh network so that they can connect to yours.\n\nThey should uncompress vpn.tar.gz to their /home/fbone directory, forward port $VPN_MESH_TLS_PORT then connect using your IP address or domain name." --width 600 fi } @@ -164,15 +163,11 @@ function connect_to_mesh { connect_title=$"Connect from $(cat $HIDDEN_SERVICE_PATH) to another mesh network" fi - data=$(tempfile 2>/dev/null) - trap "rm -f $data" 0 1 2 5 15 - dialog --title "$connect_title" \ - --backtitle $"Freedombone Mesh" \ - --inputbox $'Enter the IP address or domain name of the other mesh.' 10 60 2>$data + data=$(zenity --entry --title "$connect_title" --text $'Enter the IP address or domain name of the other mesh') sel=$? case $sel in 0) - ip_or_domain=$(<$data) + ip_or_domain="$data" if [ ${#ip_or_domain} -gt 1 ]; then if [[ "$ip_or_domain" == *'.'* ]]; then @@ -188,9 +183,7 @@ function connect_to_mesh { fi if [ $connect_failed ]; then - dialog --title $"Connect to another mesh network" \ - --msgbox $"\nObtain the vpn.tar.gz file from the other mesh administrator, uncompress it into the /home/fbone directory and also forwarded port $VPN_MESH_TLS_PORT from your internet router to this system." 10 50 - rm $data + zenity --info --title $"Connect to another mesh network" --text $"\nObtain the vpn.tar.gz file from the other mesh administrator, uncompress it into the /home/fbone directory and also forwarded port $VPN_MESH_TLS_PORT from your internet router to this system." --width 400 exit 1 fi @@ -204,27 +197,17 @@ function connect_to_mesh { fi ;; esac - - rm $data } -data=$(tempfile 2>/dev/null) -trap "rm -f $data" 0 1 2 5 15 -dialog --backtitle $"Freedombone Mesh" \ - --title $"Connect to another mesh network" \ - --radiolist $"Choose an operation:" 10 75 2 \ - 1 $"Connect to another mesh network" on \ - 2 $"Generate VPN keys for another mesh network to connect to me" off 2> $data +data=$(zenity --list 1 $"Connect to another mesh network" 2 $"Generate VPN keys for another mesh network to connect to me" --column="id" --title $"Connect to another mesh network" --column=$"Choose an operation:" --hide-column=1 --print-column=1 --width=500 --height=100) sel=$? case $sel in 1) exit 1;; 255) exit 1;; esac -case $(cat $data) in - 1) rm $data - connect_to_mesh;; - 2) rm $data - mesh_setup_vpn;; +case $data in + 1) connect_to_mesh;; + 2) mesh_setup_vpn;; esac exit 0 From 9cfc3cb27248418c299ea0135bf694322c5d939a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 21:20:00 +0000 Subject: [PATCH 32/64] Call mesh connect script directly rather than via terminal --- src/freedombone-image-customise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index fdcbe0f3..38b4add2 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1064,7 +1064,7 @@ if [ \$no_of_users -gt 0 ]; then echo "Comment[it]=Collegarsi ad un'altra rete di maglie via internet" >> /home/$MY_USERNAME/Desktop/vpn.desktop echo 'Comment[ru]=Подключение к другой сети с сетью через Интернет' >> /home/$MY_USERNAME/Desktop/vpn.desktop echo 'Comment[zh]=通过互联网连接到另一个网状网络' >> /home/$MY_USERNAME/Desktop/vpn.desktop - echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-connect' >> /home/$MY_USERNAME/Desktop/vpn.desktop + echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-connect' >> /home/$MY_USERNAME/Desktop/vpn.desktop echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_connect.png' >> /home/$MY_USERNAME/Desktop/vpn.desktop echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/vpn.desktop chmod +x /home/$MY_USERNAME/Desktop/vpn.desktop From d89e7228527f56e239590c9b395380ea41e384ec Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 6 Dec 2017 22:20:05 +0000 Subject: [PATCH 33/64] More zenity --- src/freedombone-image-mesh | 2 +- src/freedombone-mesh-blog | 26 ++++++++++---------------- src/freedombone-mesh-reset | 2 +- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 15074910..8b969649 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -446,7 +446,7 @@ function show_desktop_icons { echo "Comment[it]=Crea una nuova identità" >> /home/$MY_USERNAME/Desktop/new_identity.desktop echo "Comment[ru]=Создайте новое удостоверение личности" >> /home/$MY_USERNAME/Desktop/new_identity.desktop echo "Comment[zh]=创建一个新的身份" >> /home/$MY_USERNAME/Desktop/new_identity.desktop - echo "Exec=mate-terminal --full-screen -e ${PROJECT_NAME}-mesh-reset" >> /home/$MY_USERNAME/Desktop/new_identity.desktop + echo "Exec=${PROJECT_NAME}-mesh-reset" >> /home/$MY_USERNAME/Desktop/new_identity.desktop echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_new_identity.png" >> /home/$MY_USERNAME/Desktop/new_identity.desktop echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/new_identity.desktop echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/new_identity.desktop diff --git a/src/freedombone-mesh-blog b/src/freedombone-mesh-blog index 4aac2630..fdd420ae 100755 --- a/src/freedombone-mesh-blog +++ b/src/freedombone-mesh-blog @@ -146,22 +146,16 @@ function delete_blog { return fi - dialog --title $"Delete the previous blog entry" \ - --backtitle $"Freedombone Mesh" \ - --defaultno \ - --yesno $"\nAre you sure that you wish to delete the previous blog entry?" 8 60 - sel=$? - case $sel in - 0) rm $LAST_BLOG_ENTRY - if [ $CURRENT_INDEX -gt 0 ]; then - CURRENT_INDEX=$PREVIOUS_INDEX - echo "$CURRENT_INDEX" > $CURRENT_BLOG_INDEX - else - rm -f $CURRENT_BLOG_INDEX - fi - regenerate_blog - ;; - esac + if ! zenity --question --title=$'Delete the previous blog entry' --text=$"\nAre you sure that you wish to delete the previous blog entry?" --ok-label=No --cancel-label=Yes --width=300; then + rm $LAST_BLOG_ENTRY + if [ $CURRENT_INDEX -gt 0 ]; then + CURRENT_INDEX=$PREVIOUS_INDEX + echo "$CURRENT_INDEX" > $CURRENT_BLOG_INDEX + else + rm -f $CURRENT_BLOG_INDEX + fi + regenerate_blog + fi } function change_theme { diff --git a/src/freedombone-mesh-reset b/src/freedombone-mesh-reset index 43b3df09..32cfc46e 100755 --- a/src/freedombone-mesh-reset +++ b/src/freedombone-mesh-reset @@ -33,7 +33,7 @@ export TEXTDOMAINDIR="/usr/share/locale" MESH_INSTALL_COMPLETED=/root/.mesh_setup_completed -if ! zenity --question --title='New Identity' --text="Do you want to reset your identity? This will reset ALL data for this peer, and you will not be able to recover it." --ok-label=No --cancel-label=Yes --width=300; then +if ! zenity --question --title=$'New Identity' --text=$"Do you want to reset your identity? This will reset ALL data for this peer, and you will not be able to recover it." --ok-label=No --cancel-label=Yes --width=300; then sudo batman stop sudo pkill qtox sudo pkill firefox From 7bda738c8e03d2ce9825ac564e4a0dd5067afb6e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 7 Dec 2017 18:06:40 +0000 Subject: [PATCH 34/64] Don't open blog via terminal on mesh client --- src/freedombone-image-customise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 38b4add2..aa0370cb 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1126,7 +1126,7 @@ if [ \$no_of_users -gt 0 ]; then echo 'Comment[it]=Visualizza o crea voci di blog' >> /home/$MY_USERNAME/Desktop/blog.desktop echo 'Comment[ru]=Просмотр или создание записей в блоге' >> /home/$MY_USERNAME/Desktop/blog.desktop echo 'Comment[zh]=查看或创建博客条目' >> /home/$MY_USERNAME/Desktop/blog.desktop - echo 'Exec=mate-terminal --full-screen -e /usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop + echo 'Exec=/usr/local/bin/${PROJECT_NAME}-mesh-blog' >> /home/$MY_USERNAME/Desktop/blog.desktop echo 'Icon=/usr/share/$PROJECT_NAME/avatars/icon_blog.png' >> /home/$MY_USERNAME/Desktop/blog.desktop echo 'StartupNotify=false' >> /home/$MY_USERNAME/Desktop/blog.desktop chmod +x /home/$MY_USERNAME/Desktop/blog.desktop From 8481a701eb9f0a9d5caa75ee31b57e900c013d17 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 13:30:35 +0000 Subject: [PATCH 35/64] Use zenity to select users and copy their tox ID to the clipboard --- src/freedombone-image-customise | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index aa0370cb..e9cfdf6e 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -887,6 +887,10 @@ function configure_user_interface { # for gtk dialog entry chroot "$rootdir" apt-get -yq install zenity + StrMeshUsers=$"Mesh Users" + StrUsername=$'Username' + StrToxID=$'Tox ID' + # Produce a text file on the desktop listing users on the mesh cat < $rootdir/usr/bin/list-tox-users #!/bin/bash @@ -901,13 +905,25 @@ if [ \$no_of_users -gt 0 ]; then echo "\$users_list" > /tmp/Users.txt chown $MY_USERNAME:$MY_USERNAME /tmp/Users.txt - echo 'showing_users=\$(ps aux | grep $MESH_TEXT_EDITOR | grep "Users.txt")' > /home/$MY_USERNAME/showusers - echo 'if [ \${#showing_users} -eq 0 ]; then' >> /home/$MY_USERNAME/showusers - echo ' $MESH_TEXT_EDITOR /tmp/Users.txt' >> /home/$MY_USERNAME/showusers - echo 'fi' >> /home/$MY_USERNAME/showusers - echo 'exit 0' >> /home/$MY_USERNAME/showusers - chmod +x /home/$MY_USERNAME/showusers - chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/showusers + if [ ! -f /home/$MY_USERNAME/showusers ]; then + echo '#!/bin/bash' > /home/$MY_USERNAME/showusers + echo 'data=$(' >> /home/$MY_USERNAME/showusers + echo 'cat /tmp/Users.txt | \' >> /home/$MY_USERNAME/showusers + echo " awk -F ' ' '{" >> /home/$MY_USERNAME/showusers + echo ' for(i=1;i<=NF;i++){' >> /home/$MY_USERNAME/showusers + echo ' print $i;' >> /home/$MY_USERNAME/showusers + echo ' }' >> /home/$MY_USERNAME/showusers + echo "}' | \\" >> /home/$MY_USERNAME/showusers + echo ' zenity --list \' >> /home/$MY_USERNAME/showusers + echo " --title='$StrMeshUsers' \\" >> /home/$MY_USERNAME/showusers + echo " --column='$StrUsername' --column='$StrToxID' \\" >> /home/$MY_USERNAME/showusers + echo ' --print-column=2 --hide-column=2 --width=250 --height=400)' >> /home/$MY_USERNAME/showusers + echo 'if [ ! $data ]; then' >> /home/$MY_USERNAME/showusers + echo ' exit 0' >> /home/$MY_USERNAME/showusers + echo 'fi' >> /home/$MY_USERNAME/showusers + echo 'echo "$data" | xclip -selection clipboard' >> /home/$MY_USERNAME/showusers + chmod +x /home/$MY_USERNAME/showusers + fi echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/Users.desktop if [ \$no_of_users -lt 2 ]; then From c6c28e5ce41f27954ba4a6e0fd26c2398f75a3b5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 14:27:14 +0000 Subject: [PATCH 36/64] Variables for showing list of mesh users --- src/freedombone-image-customise | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index e9cfdf6e..83371196 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -887,13 +887,12 @@ function configure_user_interface { # for gtk dialog entry chroot "$rootdir" apt-get -yq install zenity - StrMeshUsers=$"Mesh Users" - StrUsername=$'Username' - StrToxID=$'Tox ID' - # Produce a text file on the desktop listing users on the mesh cat < $rootdir/usr/bin/list-tox-users #!/bin/bash +StrMeshUsers=\$"Mesh Users" +StrUsername=\$'Username' +StrToxID=\$'Tox ID' ethernet_connected=\$(cat /sys/class/net/eth0/carrier) users_list=\$(lstox | awk -F ' ' '{\$1=""; print \$0}' | sed -e 's/^[[:space:]]*//' | sort -d | uniq) if [ \${#users_list} -eq 0 ]; then From fffcf01dc74ac5f156f4c67215d2e119be321727 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 15:09:47 +0000 Subject: [PATCH 37/64] Syntax --- src/freedombone-image-customise | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 83371196..a9927a0e 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -906,21 +906,21 @@ if [ \$no_of_users -gt 0 ]; then if [ ! -f /home/$MY_USERNAME/showusers ]; then echo '#!/bin/bash' > /home/$MY_USERNAME/showusers - echo 'data=$(' >> /home/$MY_USERNAME/showusers + echo 'data=\$(' >> /home/$MY_USERNAME/showusers echo 'cat /tmp/Users.txt | \' >> /home/$MY_USERNAME/showusers echo " awk -F ' ' '{" >> /home/$MY_USERNAME/showusers echo ' for(i=1;i<=NF;i++){' >> /home/$MY_USERNAME/showusers - echo ' print $i;' >> /home/$MY_USERNAME/showusers + echo ' print \$i;' >> /home/$MY_USERNAME/showusers echo ' }' >> /home/$MY_USERNAME/showusers echo "}' | \\" >> /home/$MY_USERNAME/showusers echo ' zenity --list \' >> /home/$MY_USERNAME/showusers - echo " --title='$StrMeshUsers' \\" >> /home/$MY_USERNAME/showusers - echo " --column='$StrUsername' --column='$StrToxID' \\" >> /home/$MY_USERNAME/showusers + echo " --title='\$StrMeshUsers' \\" >> /home/$MY_USERNAME/showusers + echo " --column='\$StrUsername' --column='\$StrToxID' \\" >> /home/$MY_USERNAME/showusers echo ' --print-column=2 --hide-column=2 --width=250 --height=400)' >> /home/$MY_USERNAME/showusers - echo 'if [ ! $data ]; then' >> /home/$MY_USERNAME/showusers + echo 'if [ ! \$data ]; then' >> /home/$MY_USERNAME/showusers echo ' exit 0' >> /home/$MY_USERNAME/showusers echo 'fi' >> /home/$MY_USERNAME/showusers - echo 'echo "$data" | xclip -selection clipboard' >> /home/$MY_USERNAME/showusers + echo 'echo "\$data" | xclip -selection clipboard' >> /home/$MY_USERNAME/showusers chmod +x /home/$MY_USERNAME/showusers fi From df8a6c86290bec44ff9b6c175b04e98962fd82fc Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 17:43:14 +0000 Subject: [PATCH 38/64] Syntax --- src/freedombone-image-customise | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index a9927a0e..000befbb 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -912,10 +912,10 @@ if [ \$no_of_users -gt 0 ]; then echo ' for(i=1;i<=NF;i++){' >> /home/$MY_USERNAME/showusers echo ' print \$i;' >> /home/$MY_USERNAME/showusers echo ' }' >> /home/$MY_USERNAME/showusers - echo "}' | \\" >> /home/$MY_USERNAME/showusers + echo "}' | \\\\" >> /home/$MY_USERNAME/showusers echo ' zenity --list \' >> /home/$MY_USERNAME/showusers - echo " --title='\$StrMeshUsers' \\" >> /home/$MY_USERNAME/showusers - echo " --column='\$StrUsername' --column='\$StrToxID' \\" >> /home/$MY_USERNAME/showusers + echo " --title='\$StrMeshUsers' \\\\" >> /home/$MY_USERNAME/showusers + echo " --column='\$StrUsername' --column='\$StrToxID' \\\\" >> /home/$MY_USERNAME/showusers echo ' --print-column=2 --hide-column=2 --width=250 --height=400)' >> /home/$MY_USERNAME/showusers echo 'if [ ! \$data ]; then' >> /home/$MY_USERNAME/showusers echo ' exit 0' >> /home/$MY_USERNAME/showusers From 394adf5bfcf6c8f0678134761ad0220e583e69e0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 18:30:59 +0000 Subject: [PATCH 39/64] peers list image in documentation --- doc/EN/mesh_usage.org | 10 +++- img/mesh_peerslist.png | Bin 0 -> 40591 bytes website/EN/mesh_usage.html | 108 +++++++++++++++++++++---------------- 3 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 img/mesh_peerslist.png diff --git a/doc/EN/mesh_usage.org b/doc/EN/mesh_usage.org index 826c7f09..3cb76884 100644 --- a/doc/EN/mesh_usage.org +++ b/doc/EN/mesh_usage.org @@ -101,7 +101,15 @@ On a typical Android device go to *Settings* then *Security* and ensure that *Un On some android devices you may need to move the downloaded APK file from the *Downloads* directory to your *home* directory before you can install it. * Chat System -Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the /Chat/ and /Other Users/ icons appear. Select the users icon and you should see a list of users on the mesh. Select the /Chat/ icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list. +Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the /Chat/ and /Other Users/ icons appear. Select the users icon and you should see a list of users on the mesh. + +#+BEGIN_CENTER +[[file:images/mesh_peerslist.png]] +#+END_CENTER + +Selecting a user followed by the Ok button will copy their Tox ID to the clipboard. + +Now select the /Chat/ icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then paste in a Tox ID. #+BEGIN_CENTER [[file:images/mesh_paste_tox_id.jpg]] diff --git a/img/mesh_peerslist.png b/img/mesh_peerslist.png new file mode 100644 index 0000000000000000000000000000000000000000..6c049588f2bd159f2fabadefb72f32a3019ac082 GIT binary patch literal 40591 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 - + @@ -247,17 +247,17 @@ for the JavaScript code in this tag.

Mesh Network: How to use it

@@ -268,9 +268,9 @@ When you first boot from the USB drive the system will create some encryption ke After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as Other Users and Chat.

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -280,9 +280,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -292,9 +292,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -317,9 +317,9 @@ When you are finished close the window and then select the Network Restart
-
-

Connecting to the internet

-
+
+

Connecting to the internet

+
@@ -350,9 +350,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

-
-

Connecting two meshes over the internet via a VPN tunnel

-
+
+

Connecting two meshes over the internet via a VPN tunnel

+
@@ -387,9 +387,9 @@ From a deep packet inspection point of view the traffic going over the internet
-
-

Mobile devices (phones, etc)

-
+
+

Mobile devices (phones, etc)

+
@@ -419,11 +419,27 @@ On some android devices you may need to move the downloaded APK file from the
-
-

Chat System

-
+
+

Chat System

+

-Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list. +Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. +

+ +
+ +
+

mesh_peerslist.png +

+
+
+ +

+Selecting a user followed by the Ok button will copy their Tox ID to the clipboard. +

+ +

+Now select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then paste in a Tox ID.

@@ -480,9 +496,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Collaborative document editing

-
+
+

Collaborative document editing

+

The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

@@ -513,9 +529,9 @@ If you have the chat system running you can then copy and paste the URL for your
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -550,9 +566,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -567,9 +583,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From 7ccd6b448025b49de69bff450646561ada7d9708 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 18:50:54 +0000 Subject: [PATCH 40/64] mesh blogging with zenity list --- doc/EN/mesh_usage.org | 4 +- img/mesh_blog.png | Bin 0 -> 34066 bytes website/EN/mesh_usage.html | 94 ++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 img/mesh_blog.png diff --git a/doc/EN/mesh_usage.org b/doc/EN/mesh_usage.org index 3cb76884..f186beb9 100644 --- a/doc/EN/mesh_usage.org +++ b/doc/EN/mesh_usage.org @@ -178,10 +178,10 @@ You can make files publicly available on the network simply by dragging and drop #+END_CENTER * Blogging -To create a blog post select the /Blog/ icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the *CreateBlog/content/images* directory and then link to them as shown. +To create a blog post select the /Blog/ icon on the desktop and then select *New blog entry* and *Ok*. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the *CreateBlog/content/images* directory and then link to them as shown. #+BEGIN_CENTER -[[file:images/mesh_new_blog.jpg]] +[[file:images/mesh_blog.png]] #+END_CENTER To finish your blog entry just select /Save/ and then close the editor. On older hardware it may take a while to publish the results, and this depends upon the amount of computation needed by IPFS to create file hashes. If you make no changes to the default text then the new blog entry will not be saved. diff --git a/img/mesh_blog.png b/img/mesh_blog.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8c559d61281c2a68375871e9a9b743afe5702d GIT binary patch literal 34066 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 - + @@ -247,17 +247,17 @@ for the JavaScript code in this tag.

Mesh Network: How to use it

@@ -268,9 +268,9 @@ When you first boot from the USB drive the system will create some encryption ke After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as Other Users and Chat.

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -280,9 +280,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -292,9 +292,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -317,9 +317,9 @@ When you are finished close the window and then select the Network Restart
-
-

Connecting to the internet

-
+
+

Connecting to the internet

+
@@ -350,9 +350,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

-
-

Connecting two meshes over the internet via a VPN tunnel

-
+
+

Connecting two meshes over the internet via a VPN tunnel

+
@@ -387,9 +387,9 @@ From a deep packet inspection point of view the traffic going over the internet
-
-

Mobile devices (phones, etc)

-
+
+

Mobile devices (phones, etc)

+
@@ -419,9 +419,9 @@ On some android devices you may need to move the downloaded APK file from the
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh.

@@ -496,9 +496,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Collaborative document editing

-
+
+

Collaborative document editing

+

The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

@@ -529,9 +529,9 @@ If you have the chat system running you can then copy and paste the URL for your
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -566,9 +566,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -583,17 +583,17 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

-To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown. +To create a blog post select the Blog icon on the desktop and then select New blog entry and Ok. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

-

mesh_new_blog.jpg +

mesh_blog.png

From 64d843d6153202eb977fedc2f79c22bc7b9acd1e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 8 Dec 2017 18:53:34 +0000 Subject: [PATCH 41/64] zenity image for connecting meshes --- doc/EN/mesh_usage.org | 2 +- img/mesh_connect.png | Bin 0 -> 35895 bytes website/EN/mesh_usage.html | 92 ++++++++++++++++++------------------- 3 files changed, 47 insertions(+), 47 deletions(-) create mode 100644 img/mesh_connect.png diff --git a/doc/EN/mesh_usage.org b/doc/EN/mesh_usage.org index f186beb9..553c11bf 100644 --- a/doc/EN/mesh_usage.org +++ b/doc/EN/mesh_usage.org @@ -77,7 +77,7 @@ Maybe the internet exists, but you don't care about getting any content from it In your home directory on a system connected via ethernet to an internet router you'll find a file called *vpn.tar.gz*. If you want another mesh to be able to connect to yours then send them this file and get them to uncompress it into their home directory also on an internet gateway machine. If they have an external IP address or domain name for your router then they will be able to VPN connect using the *Connect Meshes* icon. They should also forward port 653 from their internet router to the mesh gateway machine. #+BEGIN_CENTER -[[file:images/mesh_connect.jpg]] +[[file:images/mesh_connect.png]] #+END_CENTER You should create a new *vpn.tar.gz* file for every other mesh which wants to be able to connect to yours. If you are prompted for a password it is 'freedombone'. diff --git a/img/mesh_connect.png b/img/mesh_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..9f55819a7d16f462f6899188de9e2c89697c06d0 GIT binary patch literal 35895 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 F@?XNx!$kl9 literal 0 HcmV?d00001 diff --git a/website/EN/mesh_usage.html b/website/EN/mesh_usage.html index 9194b158..2621e7ac 100644 --- a/website/EN/mesh_usage.html +++ b/website/EN/mesh_usage.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -247,17 +247,17 @@ for the JavaScript code in this tag.

Mesh Network: How to use it

@@ -268,9 +268,9 @@ When you first boot from the USB drive the system will create some encryption ke After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as Other Users and Chat.

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -280,9 +280,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -292,9 +292,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -317,9 +317,9 @@ When you are finished close the window and then select the Network Restart
-
-

Connecting to the internet

-
+
+

Connecting to the internet

+
@@ -350,9 +350,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

-
-

Connecting two meshes over the internet via a VPN tunnel

-
+
+

Connecting two meshes over the internet via a VPN tunnel

+
@@ -372,7 +372,7 @@ In your home directory on a system connected via ethernet to an internet router
-

mesh_connect.jpg +

mesh_connect.png

@@ -387,9 +387,9 @@ From a deep packet inspection point of view the traffic going over the internet
-
-

Mobile devices (phones, etc)

-
+
+

Mobile devices (phones, etc)

+
@@ -419,9 +419,9 @@ On some android devices you may need to move the downloaded APK file from the
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh.

@@ -496,9 +496,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Collaborative document editing

-
+
+

Collaborative document editing

+

The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

@@ -529,9 +529,9 @@ If you have the chat system running you can then copy and paste the URL for your
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -566,9 +566,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -583,9 +583,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then select New blog entry and Ok. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From dec2f54a1b81af80c9df1755aebfb69237b49306 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 10:56:22 +0000 Subject: [PATCH 42/64] When visiting a mesh site choose from a list of users --- src/freedombone-mesh-visit-site | 83 +++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/src/freedombone-mesh-visit-site b/src/freedombone-mesh-visit-site index c667ff08..2136892e 100755 --- a/src/freedombone-mesh-visit-site +++ b/src/freedombone-mesh-visit-site @@ -49,38 +49,61 @@ if [ ! -f $USERS_FILE ]; then exit 0 fi -data=$(zenity --entry --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit") -sel=$? -case $sel in +USERS_FILE_LINES=$(wc -l $USERS_FILE | awk -F ' ' '{print $1}') + +if [ $USERS_FILE_LINES -gt 200 ]; then + # If there are more than a Dunbar number of peers then ask for the peer name or ID + data=$(zenity --entry --title="Visit IPFS site" --text="Enter the username or Tox ID for the site you wish to visit") + sel=$? + case $sel in 0) - TOX_USERNAME_OR_ID="$data" - if [ ${#TOX_USERNAME_OR_ID} -gt 0 ]; then - if ! grep -q "$TOX_USERNAME_OR_ID" $USERS_FILE; then - TOX_ID="$TOX_USERNAME_OR_ID" - else - TOX_ID=$(cat "$USERS_FILE" | grep "$TOX_USERNAME_OR_ID" | head -n 1 | sed "s|$TOX_USERNAME_OR_ID ||g" | sed -e 's/^[[:space:]]*//') - fi - - if [ ${#TOX_ID} -gt 5 ]; then - if ! grep -q "$TOX_ID" $IPFS_USERS_FILE; then - dialog --title $"Visit IPFS site" \ - --backtitle $"Freedombone mesh" \ - --msgbox $"An IPFS site was not found for the user '$TOX_USERNAME_OR_ID'" 8 60 - exit 3 - fi - IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}') - clear - echo $'Opening browser. Please wait...' - pkill $BROWSER - setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null & - - # Need to wait a while for the browser to begin opening - sleep 3 - fi + TOX_USERNAME_OR_ID="$data" + if [ ${#TOX_USERNAME_OR_ID} -gt 0 ]; then + if ! grep -q "$TOX_USERNAME_OR_ID" $USERS_FILE; then + TOX_ID="$TOX_USERNAME_OR_ID" else - exit 1 + TOX_ID=$(cat "$USERS_FILE" | grep "$TOX_USERNAME_OR_ID" | head -n 1 | sed "s|$TOX_USERNAME_OR_ID ||g" | sed -e 's/^[[:space:]]*//') fi - ;; -esac + + if [ ${#TOX_ID} -gt 5 ]; then + if ! grep -q "$TOX_ID" $IPFS_USERS_FILE; then + zenity --info --title $"Visit a site" --text $"An IPFS site was not found for the user '$TOX_USERNAME_OR_ID'" --width 500 + exit 3 + fi + IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}') + pkill $BROWSER + setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null & + + # Need to wait a while for the browser to begin opening + sleep 3 + fi + else + exit 1 + fi + ;; + esac +else + # If there are a relatively small number of users then choose from a list + TOX_ID=$( + cat $USERS_FILE | \ + awk -F ' ' '{ + for(i=1;i<=NF;i++){ + print $i; + } +}' | \ + zenity --list \ + --title='Visit the site of another user' \ + --column='Username' --column='Tox ID' \ + --print-column=2 --hide-column=2 --width=300 --height=400) + if [ ! $TOX_ID ]; then + exit 0 + fi + IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}') + pkill $BROWSER + setsid sh -c "$BROWSER $BROWSER_OPTIONS $IPFS_FULL_URL$SUFFIX" > /dev/null 2>&1 < /dev/null & + + # Need to wait a while for the browser to begin opening + sleep 3 +fi exit 0 From db3cc4f5af20434c3933a764d04277eca377d8ec Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 13:52:10 +0000 Subject: [PATCH 43/64] Select mesh blog theme using zenity --- src/freedombone-mesh-blog | 53 ++++++++++++++++----------------- src/freedombone-mesh-visit-site | 2 +- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/freedombone-mesh-blog b/src/freedombone-mesh-blog index fdd420ae..cf43076e 100755 --- a/src/freedombone-mesh-blog +++ b/src/freedombone-mesh-blog @@ -41,6 +41,13 @@ CURRENT_BLOG_INDEX=/home/$USER/.blog-index BLOG_EDITOR='pluma' DEFAULT_BLOG_TITLE=$"Freedombone Blog" +function remove_bad_blog_links { + current_theme=$1 + if [ -f $BLOG_PATH/themes/$current_theme/static/css/style.css ]; then + sed -i '/googleapi/d' $BLOG_PATH/themes/$current_theme/static/css/style.css + fi +} + function ipfs_publish { DIR_TO_CHECK=/home/$USER/Public if [ ! -d $DIR_TO_CHECK ]; then @@ -165,44 +172,36 @@ function change_theme { THEMES+=("$THEME_NAME") done - themelist="" n=1 - theme_index=0 curr_theme_index= if [ -f /home/$USER/.blog-theme-index ]; then curr_theme_index=$(cat /home/$USER/.blog-theme-index) fi + if [ -f /tmp/.blog-themes ]; then + rm /tmp/.blog-themes + fi for a in "${THEMES[@]}" do - is_selected='off' - if [ $curr_theme_index ]; then - if [ $n -eq $curr_theme_index ]; then - is_selected='on' - fi - else - if [[ "$a" == 'nice-blog' ]]; then - is_selected='on' - fi - fi - - themelist="$themelist $n $a $is_selected" + echo "$n $a" >> /tmp/.blog-themes n=$[n+1] - theme_index=$[theme_index+1] done - data=$(tempfile 2>/dev/null) - trap "rm -f $data" 0 1 2 5 15 - dialog --backtitle $"Freedombone Mesh" \ - --title $"Select Blog Theme" \ - --radiolist $'Choose:' \ - 80 40 20 $themelist 2> $data + CHOSEN_THEME_INDEX=$( + cat /tmp/.blog-themes | \ + awk -F ' ' '{ + for(i=1;i<=NF;i++){ + print $i; + } +}' | \ + zenity --list \ + --title=$'Select Blog Theme' \ + --column=$'Index' --column=$'Theme' \ + --print-column=1 --hide-column=1 --width=300 --height=400) + rm /tmp/.blog-themes + if [ ! $CHOSEN_THEME_INDEX ]; then + exit 1 + fi - sel=$? - case $sel in - 1) exit 1;; - 255) exit 1;; - esac - CHOSEN_THEME_INDEX=$(cat $data) echo "$CHOSEN_THEME_INDEX" > /home/$USER/.blog-theme-index CHOSEN_THEME_INDEX=$((CHOSEN_THEME_INDEX - 1)) diff --git a/src/freedombone-mesh-visit-site b/src/freedombone-mesh-visit-site index 2136892e..b13c4d02 100755 --- a/src/freedombone-mesh-visit-site +++ b/src/freedombone-mesh-visit-site @@ -96,7 +96,7 @@ else --column='Username' --column='Tox ID' \ --print-column=2 --hide-column=2 --width=300 --height=400) if [ ! $TOX_ID ]; then - exit 0 + exit 0 fi IPFS_FULL_URL=${IPFS_URL}/$(cat "$IPFS_USERS_FILE" | grep $TOX_ID | head -n 1 | awk -F ':' '{print $2}') pkill $BROWSER From d61d410746b34c75c34177a2f9c5a8fdaa73591f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 14:34:22 +0000 Subject: [PATCH 44/64] Remove bad css from selected blog --- src/freedombone-mesh-blog | 1 + 1 file changed, 1 insertion(+) diff --git a/src/freedombone-mesh-blog b/src/freedombone-mesh-blog index cf43076e..eb337827 100755 --- a/src/freedombone-mesh-blog +++ b/src/freedombone-mesh-blog @@ -206,6 +206,7 @@ function change_theme { CHOSEN_THEME_INDEX=$((CHOSEN_THEME_INDEX - 1)) CHOSEN_THEME=${THEMES[$CHOSEN_THEME_INDEX]} + remove_bad_blog_links $CHOSEN_THEME if grep -q "THEME=" $BLOG_PATH/pelicanconf.py; then sed -i "s|THEME=.*|THEME='themes/${CHOSEN_THEME}'|g" $BLOG_PATH/pelicanconf.py else From 85126cec66be71bc62d45608a412e7d0155e310b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 14:40:18 +0000 Subject: [PATCH 45/64] Remove bad css from non-mesh pelican installs --- src/freedombone-app-pelican | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/freedombone-app-pelican b/src/freedombone-app-pelican index af454a5f..df78ac77 100755 --- a/src/freedombone-app-pelican +++ b/src/freedombone-app-pelican @@ -275,6 +275,13 @@ function pelican_delete_blog { esac } +function pelican_remove_bad_blog_links { + current_theme=$1 + if [ -f $PELICAN_BLOG_INSTALL_DIR/themes/$current_theme/static/css/style.css ]; then + sed -i '/googleapi/d' $PELICAN_BLOG_INSTALL_DIR/themes/$current_theme/static/css/style.css + fi +} + function pelican_change_theme { THEMES=() for d in $PELICAN_BLOG_INSTALL_DIR/themes/*/ ; do @@ -323,6 +330,7 @@ function pelican_change_theme { CHOSEN_THEME_INDEX=$((CHOSEN_THEME_INDEX - 1)) CHOSEN_THEME=${THEMES[$CHOSEN_THEME_INDEX]} + pelican_remove_bad_blog_links $CHOSEN_THEME if grep -q "THEME=" $PELICAN_BLOG_INSTALL_DIR/pelicanconf.py; then sed -i "s|THEME=.*|THEME='themes/${CHOSEN_THEME}'|g" $PELICAN_BLOG_INSTALL_DIR/pelicanconf.py else From 4bb3d4b0b4e67baa16ae75b681bb860caa5007e2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 15:01:48 +0000 Subject: [PATCH 46/64] Remove dubious pelican theme css at install time --- src/freedombone-app-pelican | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/freedombone-app-pelican b/src/freedombone-app-pelican index df78ac77..4749b138 100755 --- a/src/freedombone-app-pelican +++ b/src/freedombone-app-pelican @@ -741,6 +741,14 @@ function pelican_themes { git clone https://github.com/samael500/w3-personal-blog git clone https://github.com/jarv/water-iris git clone https://github.com/kplaube/yapeme + + # remove any dubious css + for d in */ ; do + THEME_NAME=$(echo "$d" | awk -F '/' '{print $1}') + if [ -d $d/static/css/style.css ]; then + sed -i '/googleapi/d' $d/static/css/style.css + fi + done } function mesh_install_pelican { From 36e2af8e7651a008d493d0306651cf818a221902 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 16:19:39 +0000 Subject: [PATCH 47/64] Image showing selection of blog theme --- doc/EN/mesh_usage.org | 6 +- img/mesh_select_blog_theme.png | Bin 0 -> 54602 bytes website/EN/mesh_usage.html | 100 ++++++++++++++++++--------------- 3 files changed, 59 insertions(+), 47 deletions(-) create mode 100644 img/mesh_select_blog_theme.png diff --git a/doc/EN/mesh_usage.org b/doc/EN/mesh_usage.org index 553c11bf..7221cd50 100644 --- a/doc/EN/mesh_usage.org +++ b/doc/EN/mesh_usage.org @@ -194,4 +194,8 @@ To finish your blog entry just select /Save/ and then close the editor. On older [[file:images/mesh_view_blog.jpg]] #+END_CENTER -You can also visit other blogs, edit or delete your previous entry and also change your blog theme. +You can also visit other blogs, edit or delete your previous entry and change your blog theme. + +#+BEGIN_CENTER +[[file:images/mesh_select_blog_theme.png]] +#+END_CENTER diff --git a/img/mesh_select_blog_theme.png b/img/mesh_select_blog_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7aa51cf3a213ea8f28230ba9f8507b77f503e5 GIT binary patch literal 54602 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

n^|$3~H^Yh-9w z9*_b1%7IV$g|gU>XHCE`v9~yCl}MFM8#V_aK)H>l<;6l+V-4|Mj;g@1$g5X@;Rc|N zKOLt*qBzJXLkp7?hFv*&!G)B#GzgQ5)nrcKl{+4aKR^QQUvT6U7zT3~gj5-j0Y`@W z<98hI+0JUD^gA4{A|A1k)7{ih*f?oY-F7z6(9OI;F)>l&{p@FBk3$aLAjzQJolY&y z^pW2X)5hRzowj@h*60wqvl!r@L~#@+DN8W3vNDVKZlAJO@TH`(Ac>t*T}(H;8qm92 z2amRbzJ1&=YuXJb>-CB~BpgYSCno+T4Vx?NmH8JModpp`%deHWYjwZ)>qLeuRTh_P zSZj5&QQU79q%2XEfp$xcM*T7Q$yt5u?xcyk|Bv0w>XeHAH^)*%qNZ3+OmKy=h@AH4 z@MIp9$&}FZUZP_Q*&ueYIP+b%{!6I9F zF@9($c9?|nHm(JXhhjNo?0}z6C}Rng0aWEeMD2CFHIo*)SmZ+OR=$y$hLgIk3U9^m zUee&hZ#TZ5Alz3C)~$W<*;;dgz^ez=uk(cObUL3AmYp|lP;LjKvb4u=;vBQY4XRuK zug2F(*D*=}M{j$WEHRQY`YvK{Ikil9Qhd#HK*;Xf7v*yS4BL`l9I5J2PUb~o!Dk~e z%XFl{LZOf~D?wv(2jJW7tV{)umfX+@kr}PRc>k^REPU&$gUgUskS$t!n2VE}lppuE z+?0&!tD}Xeu~S<_!mA%1g4{o|2OCj<&&u?d;w`86>FB?EIs<_Rp+rhhWS?dfeVaKo z#JA&DRdb{tXm(d(;wVVkoeQ}L$v)V5=SkGc&z$jK{Qv#${QpA z{Vn7SMO*>kw<7=sQ@-oc;{8RLv50-9B$1s>&e@C4)H~E8ZvQd_=l!!0`H5f6D$#cL z`0j`j4|V`)Rs~R{4>poD!?~Y#{ABLr#?lXI(5Xzb*IO^D0eK4lJ(2H)p0s6#nP;)L z^f)J-Uie>pd?c*Crx*4j0UE5y>%1@Wucw_Of=br}$o82KI7_pNWX=J1qO7?lBr%85 zwA3GD8~eJBFj}(uB?#^fbf1!ak1f>7LMAEn^Xee(n>rtWC>X?ON)=O%jPX& zR&z5o;y_JNb`y>_`$m_Wan$|I7d)!cg}S%5=Y3CMz1p0wO@kNysAZ5o6xobHR9KE! z{+-3kdIdIjcJ5Z=d^@~d_oT^Whyh$&_44wgV?GN_n#VP?A)<)Yt%2~>Qvxz?r+I}M z4s{TY*O`uwIC{#cOzAtk&e0PLivkrf49lBD-c`z|umyZ{=2xJ#Ou=3We$nNMR4x7Ea zbf!thCh6dWK+beW&FWRhiY%yHqbiF6&qVbQqp&``}Z`G7@U;0>cT!4t(=u%g><2c_q@FLilWiV zTUt3S#R983esVJGAHQpm|7Y-eWMX2y;UrIo6-R>Zhe{^zI18KQtaOGc1^9pOPEjAB zWl4I>B(PO}p%cV1X7aA*?7_l8$GSueMZWw}dA8WOIy6@q(2NJ_Xl_Qq=}n8YTt=K0 z>L^0>;z}IFNM{Mak8^WGq zCjjmW`Vp_DyeqWPu|(~*qpc->{8nJBOZ-f%Abyb0kPQN2IyRzS<}FiSdz=F(tUkJlW5qLuq`Y~3kqn0;;eTo9DBO#w|5>HV>03k0&DClu#D*g86p%OS?wr zi8+tlYQ3r5)W5m5Tr$GRM6cqLY!9KOp^Sn2{HD!;rPE}c) z0LbB@z$YLZTcTy6v#E0wCT0o!yKGGGS-6L;^Yh`!gP3ag-#%F*;%^LvN#9ozeajQC6cVr<^Ju? zJ!{SiI8$f#w83>F=E}^%mzX%pYsqzwY2DmI%E3$0FE9WZM+TryCE+Aj?t4cK5aUWu z>Pyp<3a3J&r84(XO!@howstv~uQpHa4K4k#$v5~>iZb5h|DbqUJfOa*TsZI3k-1<~ zX5DrT$tld-=wGnvw+9K6M81iH#`4@;zTPn8IezeMzONLTG#VY^r8;IW=H_F>W@_j; z7`M0KM9(0I<9EA(;@b-$JrvWIJtB1=C zXK*+&kbKwGdCP_9T12*JL3k&sTn;YwltrO;kt`FI$e|o67?=NYUtu=|Q>wJ=do2{g zE%z}khz2#QXmE^zs1PFvg-R$8el8c*;p%>cfoNJTqbA-9cHOn-^UMyo?-Tig|4t<- z%gRbm=47+$$Ha&AqvfxzLZ`2}@{;hxh;bwWGOTAwIR}IXU%!4G6v}tH+M@5M>}QTH zr!@JAg|$@d&*!fG^EMLiv0N44E6Hqqru=2$H@u zPAqxrJ1MeMzg{1`M_s=c(j)iA7A|JibTqTOpL&?cq%sXdTYObFvks$KqFrS z|DozaL+TCdYc60fJTEcdL6Vq#7b z-_c5<@7(DqYwyrh&I>XZyI(L=={K1@)cUKIOO>meo0^uElz4hIKR-UJ>(CelONcY= zakwcDIrXnQ^v_qDo5f{iL3Wf*oL!uI7WED7-Y3WGSkwv4+BzEz&zt6oXe%WD>ji$lB3G4oU3&kn{VDHt}sgwkwN2HCXDAF{(8%xcyehPd7vWta|#4%iU{t+3r7*B3Ze?)k8%0=GilgVt6EPS z?KLW@PBL)=!~VGG_f-PD|p!g+o*96ubZ^DV;`H9EUPjN-Ke z&pEwA@JFEa$>Y!M#jq)YK)HB?;BaS$7Lk8Vy?m87 zQmhW=(}~={g!jx2O-w*;EBgnTljRc=6UWC1L;U%=Oa_dw zal8%h$fZrMI3<5D!#U>h_WgwGp!C6J^zEy~zl?;KnOF(0*BBgPa!)jz* z6?VcKo-+FR1TwX?#V=1joBkM#ucxwyz1MDYqb10#AspX+R+*A)@fMIL-C~9>g@_>k zE-pGGNuL}{6)!=fWu6a{-l-5a;1F;pmHR; z|1$`Gdl0Kr)i@3@`Rx?RThMd&rmOMgKDRn+E#1p)ovMnlu}*fB+OQf*eLQO@cfgko z-$69EZ(V2c!(kS7i=Fmm1=As{^h*cm7_YO3s!@@5Nnsbcb}KpVU|}Yo8ThmN$-tJP zx%qgj^YXz_jOQcYJGR#L69a2%B>BhK^kn!Fr;MYi{xEv%H zDh!rQm0jR2i}S3e>hdrAJ+!Igp{R_p@BX})hUkC%cE=4YWg%<)4Kt8GZYbAL02AQuQX9f=N1MT)tE*r>OQ{yuOjNszoBezxW2YJ$ zx&`uWUbe&Au5dbLq&Jx>eL{BCL7E?XF^5_@4x zk>}@zciVhKH%t;S?+koE(@{AYIx*~z&aeq7f=$1L1@AiUP#uZpT^g63KWipG_O$7DoI__YoA}rJ1er zF*P>3L$LF3?&`?1Z>?sKyNe=&;Hl%}L>li6^A2`M>)2B(gABtx^l(ZdXixM^`{*`CnPAl4ei z!|8n3?i?dVJyI+K?(dDR5=0w*IPelg)M2|2tw`pN8X`iNL(C0$rmg7`?f78? zH+E7q)<^H_n|jy%zibHD?$5D@al8=_nAZw0lQ&mQ$pFL^WQ~R<%F!AEW3JEw*HnRA zQ#LWTS5T_HV~&8_+TW3+rVOPK{V_4IHmU~}yIV3jKU~YZ!#Vcrh6G_tS4kO2p9I)<+|xiG$ZHv)raR5JQ8}_n z?BxG9UV+vER4O+3GRY4#DeyRGHi8ug`77SA4P_!^s2-+U3f2N=|<=!o%DDJI0B z{w(xc*jlY!Pn!;k;a5FC#bQ9a0aHaMk5BRj^i`nw4|Le)kto=#+lV zg^r4c6{T-F+DHeFm zUF+*Oz6A;vk_E>;Ij{45-bo!anAC{OYS;a9H!S2zZ&1|%qr2(utZ*2IZl1jd+BfU# zoa1wuPFyOczZuNIuf-UA-QY99cjAGcx--Na|3yyDQ^!Ycsm@g;cksu?v<2mM@xq+dYR}Z~CIdBKn1GVC2aU5dT;WusJ#|P{B4=~+3 zy~q01W{gnt*j#Y!>Zn{u{H%NTm{snqODau19qaidHgGjX+OzaF`Ua@k$$i|Wa1(%E z_6fN2^r)YEK1oo7l;Zg?jL`lV3Klc{{ZgA{*7Ycqlo2(z(U$m z&Mk}!h8uBKvmYo$WuI8`E6d_=0E#1{Ao6yQr@Br8ak1Ok;ja1_GfwhHzI-~MY?Ue! zo{KYkxU2Twq5l~j;_1OWJA{M}r_N(G79kDrn_{aq-&S^J`KgUSy9y!d~;VhV^6t@Gw&^xws(W*<&PKARpZ{$h)~TC z`q`S9+P&aM->r$#8IKnsGP`XbukXs)qbUV`j;$tJxL98<{!3U{*&r8yR*myf$mkMI z$G|z2&F6?X01yodO3f-GyQ*HFLd{JD7P^DCUQurR8efdD8a<}`x%WccpYq^{5m@q?$zSuRU|Q=eqqto(q}R;Qe$AL zy0xI9zv%jLvtbTS@$CNi@A^#VM)aM^AYZB?dSYYt@0S{Kp+;7U#xXXw&0H6=iTvVlp%(?PmnPOlNHuQpTo-%ftS**mn%!8 z;Edm&ITmZTYIF&0t$cZdP5NbW!+UhtP$_T!h)RuzM%(N~A=SzbP8dHrIi)LwjujTW zyFo9K`>#X@YqAzb@9S#fZMdEH{|&IwOq37*^WT~~m?NJ{lEJ%&dkUEL>eBYWW{5?i%;slEtlQ#TnD*3XDb&nRzgu%BPFBe+Z8 z5#$+vMz3| z;{0Qdm=oA;<^95gZheJ>F3-fK$}4F>HD;LLY-+3z&5nD|cQ4-Hi6)EsaOS6j!)+8R zx#3?Q)VBWl7wY`2(!V}vu%&-p@aap8fESy%#b8JL5()7qyS3w^sGbltWG>c1svGP~ z1#3!C+Rb+FPWTR^T>)Wd<3ksBVX%GNfAHQK*7(^*g;rO~ifV%b(<1nxz=5%i;`y|H zC`aT;^nSbDFoyA@XIABcn!7)-6Vco?XAUGy zN@u_zt3d56N>tQBqaJ>sjQ)vq!_vzb6R$7M>Cjmp1=A}@a$cxwL|gc~%UJEg=M;3@ z9_@I4|NLrY@OXC#m5;9L)5!s(E_iUH;PF4&N0QddW4Es1L&TT>U|u_YQSwlEA7X4| zRDlXw+*mH@P-q4boBW64MQ_za_Mt7jTk9XZg(&NP2DNa2RMYMGiE z8F4gh)jWTlSWtMsFl`|+?%Tgmjk;01_P`e)LH_L@y)*nWB3V~SYRxB3mJHhK-Ogcg zo)|BIP|w|+jL{x4L--13HVy&U2$@=ZvK9lx>>*HYjzrEagv<7CTVm$iJ)T95e#hla z6JeV@ti1+f2aMqUo>ag*`Che73{@>{)-ydjV+~xjM27{ZWibZ4KmHvYeEi{*kfbo< zJq8mxkjur9+qi$(6u*I#-~sXk7)42^;0@z%KLR@UnwuE0Es6Fo_P3XqoR`bO5*E|E zk#_)yUocY7Q$R5~S}{m57C8&yk_bES#BvdyG>PIEAlr9*eQS^Tqtx=JhFj(9MWO4y z*CKc+tk50B?;|;rK;Xi|S+I$uw8s0X0Gp||3AF>_WQ9nmsD0$3u`kU(RcALvz^k5qHCzvT#g@}7)>lD zK=*suuaDOwHSh1edf8MMpe>HW#SAXKF{Y|4n7qg_J1F91<1$jhlPfsx>Q9kPdQ~AA z^Ced368}+LVtyA{OKKe;;bJ`I*9Dqy>HFzdURGTXFXbd=Q;1PSu#agn4RjGtQTttv zy7f;$Gia&6^{GH2IfXmGY4ok<8sQ^3edQRrtY8?s)_0I<@_Hg1&wy#lE32 zbSB`?a0BGfv{Fea>dB@(CX>|Twz>AX!BCeZ>N$cWW4#eCXLyeIOVz3;h>U0BmZ2E=8#Y)pDuASyD$ zpaCHe&5y~}z1pEYyqgynxj8uoIyyR%8K2KdE#lje9sb~2oW9t;b{~loDwR=K#%I`}~hq{e05mMA* zRV#Dz{kxNej`sGf>}=1R(j)|t-P_w+Sy_oN^*ld6n?$i2cG~9E?;HtBJ~p|v?ji2v z)9Ev)ig{u#PMV%73<(NC$q{jXl(AivrR>_-J$&d-1tOx1-8Vevrc|!x7Jvw92-NDh z?uXRzmVW7b%P@0!(!3zwlGjf(Awzz|B8k-A(XqC=iue9KrLc#xo*pIu3k$2Wv$IO4 z0nw=NZplt1EbGX|f8uU43Sy?wZ~b$z-XQ7Y)7$E*%c$hr)4z1Ia-p@R@P!O9(HtGS zb2?-Z&Ln!gNCZ@^!|gC#qyn3wD>hT`bi7 zxVPU@A>?x4-C!)K)7|p8A$Ub9Obo5c>vDrE+x+i1qFUZQ!%&z+m!h!)m)^vASGwf)jgGGZ<(#I^V@ijpi>w zoh#xk?<>Al(`EOOmAztVq2~9>8xmM|G@8ix|7aSnyOR{W%!U?13L0o!W@ZTDGPN`9#;(2IW z2b;tGZ~rBfpBlIR>-OcFj&2z4KF7h%nZQZI@Rj>H?0Ph0tM84MM>DG~#Kpj#g8q-| zs5!{XUC4QN_HI#^*u>y(><7*=r=5_Kd55p^UU{njEl}Teh88J)4ZxaGo=mFl68>-d z5hTKf`fMa3iBLQ{t#9Z_l?mvd93$K?6SD;c35e-%dpK3@S`n5EtZH+=5T)8Z+IpJ) zYLb|c;C?0$#*YF($X?E7N>7$In)I4If_DTOn)e_$%PW={1|D1Giw#gH;z@ZKuU@XTVe3V=AfX`zCMT@Z-p1IM zTBb~Gkas7Cve9I4ofe*rH!G!#(Rf>XCT6+bOd%L_M=`~k)PHJfRJ%;qOPVx_UIH3- zy(Wvr!6aU6GaD^IuruszAJaKqrXO!qLSwU}(9ozmyj;)beve*sIkXYDr|vl2>~DQ8 z=|J4ZJdDU*v?+K}Z(Xv%K<9=45^Bw_zY^&v-6-&bx;TKPW9-*=*rjfcgMdGm12KCW z4#IA<72md(J~@pEHrBa^nRWRb=^)XmWb#GIiR3Ed&iGr7lPxBr7 z=}`cekZ9@cpTD9W>T0UC{2-rb=f|MNl9#qLxz>g73{7S4t8^-KD_X_K<1?FoJq9|{<&8Nbw%ok*;6AUPE-Bj z%F3G9q@s}mBsk-)GbO4DnT-vm2XI76d@n7hk)s@dqP_AGOAfs|ih{44i=B_t38|t- zPo-n7Xr<2XRI>y{lCE&WdPd53N}Du387lmKoPFf;9y%0;Zu~NqzOjBj&(p9W^f4M! z;A)$HJQ>e<(178)o`nTKKL~rOHTBERM7M6cBYbrFHe2K~tMTG-2;cfNRBts{UZnc} zQP80rPP=FYU3z&K@ifcrH?(@Z)e$9l-(Hy6At;(@IS+pxZBmlM$y)0|Rq$~0)n(n_ zw>e$)_LaLeo$h_~g@B@EX;cl!3e<{bO5wDHA)gu3Iq&ZN8{2*76(&~{7S(WnU z`l#XU`Fit)j$1I!TLF}Mi|sxH8KRr_6SV(i!z-98c7~{lX>>zJOI+omHa}GU@1j$2 zjmM=^$NX@K?2tJ%um83aS29eTBVGFkUl0 zVG1)b-3jh~JQQF5V+337<2llb74N z;`M@L#{%@y2=BO(!nLuQ2)l{94eHijT(xj0bAedA9#6ZOsrS$#BBE0p`CSQmT&DNx z{`$b1`grteE|oC*`N<Jy*)`ik56Y;lPQVA`KH2z^S`!E+zHMO){~`)Q|Si(xpqZc|v{t zX6L;hhZb?dBTh;{9T?&hQ&8|w+8_k?tgg~6LX<-f1Va1pur8m=?8Q#`a+_Bo!C8*< z>(L>$xyAk5rc5@Xe#QE~DgpQUXAN5FOt$CJ^)oPn+9O#~LyfM!Er3b?+xYsrw^xU1 zPLi(I#52!*FX=z-kJ}CF;6sL{UF4wXn@^_FrA1f4r>bAVDVMw6?6p@-^No%4+&yfC z-5iQESP!v&dG9}wJ$6OTXM+sd+}s3OjU^6=b>hDe;GP$g%O0|EU`U9*0u-t1VfW;c zPp~Db%qG*qkBGSBQ0DE-=L}D;N0` zs5>X2^;M>}aPDl9?c{wcS8Hkb>sNkXKGU>l?-3{0{|pEF2O{%?eXp{Zd;|0)5Z)CI ziwn|MDQ>pw`%hpJl#z%!zWo-?LHo7bg);U^-O4S$tTVbQW`GR!O?uTap+|_LZ{g&t z<|wcB-d`PWe}pIiuG`5AJuv`- zb(LV^GD=xu+dnrd?#WqPiS4wMN&u?Uo%h{-O$}D991GYNj5w6~h~Kt8)ZGH~;;#-4 zFUB9c7B8Z+#;IS0bsHhe&=j65wcfzTRh1LVFR6{CN1VM8fR-|rR5hBd zs6B^=E4jp&LCgBV4la3Sg)Kbh;YKx1?j5L9J89O;oO6g>Smy&fyKqk6iz-Hk)(QUH z?*RAp?)e+|%a5%ntCJO36-M=UeIg~v@>rW1lLAlH9Y@C2gY~&pIcVvua;8 z|`*L(5vZ!<31U9W-6dfP&tT>i;eX{!Xmf3!063ZqtXvQys zQK$(7+BrISs<75?(~nL~r`|N#8E9>NhppJ+_TXw?pLsk)EiMhvU-vGGVxEpV98E>F ziTPV?a|R)yBlwu)n)z4}YmSaA=Y8O94fbV11pSUlV5rE%>8kF>?w=Zr zMEy$=-N?iqNoKvcXX`arTty9Ji4_i4qs=sN2`h^aLk8GiC9Y5Lrw^9-`0t|(6!IB< z;VsQoU4KM1{m`LAkd7}XfxP_%AF+cq{W+i3CD+!h+4;d|gi%PN##-i~flZ%8DbM<~ zzAiUF)Stz@XNhy=iy-038rX7;G*;_Wss~h!mG?}~8>Adrz0B_N0{eZz{aKB#_H3qS z(=euIxG&@c_IscE`2ls!i23EFrE-rbp zj^2Vh-BaaQIFAnR8yC)h^(HA={lj)9R#`oE=A*Ru=%D>HCSr{vO{cv{NOxdBcBJ-` zVDg`qcRJ?2vCsW`0b4MZBPv9Y+?1sD&Di0}<@lh3?7Kcph5-T1Xn6a$wu#PIkNu?$ zz*yCT^b0>+{Epft!0{zLa7n+O*3l!K?`Ic|#YMJ#NvDu4$*{T})qa=YTJL3gwO!xV zz~#0?_KtInBDnzB6oZvH-CP*8;cl6X$vhH_i{X!s-ibe*a5 zcA;%$wHya?)^tMfl*PM#Smuzs- zk|oX-Q|j{5aVs@1O|K;mAJ9+na&M02hh^JlZVb$$GkulCGM2lE3IARD4rc6jM(W}J zMJ(JoxUaj|&UG}YJ66wjevu_!mquLgQ5gMG<0l_zJKU}y9zS_;)f{Pw2V2iG9q+kH z^GtjB`g9T}c7GFltVMj@SrL687XEm|YQ1^5S7EUclDyo4Y}wI9CI5&IoN)UY0_6`k z3kt7|hIlJNOKtuLS}a@(kP13mFJ{XhWN_69jNV=}%OZ@bE1XigXu51Y3Ega|DB8ZE zrljUWaeELjEhg1llKcI(n#7chjPO@^m*riPnZzC^t)veEcS zbXi!-OXK&^Dd?Li7YL2Z=&`58etmuSGpp{zAaarjJb#|WzW0F3!*n$A6C8Eyous}=QTpUW zl(}GiU7z1pO!@CpS^;23WhXu+c+gG)SPeLS5p!Y5p`F3<=CjQ?Ba38Ygial6 zm=Mjiy`9zhJ{>hp-*%>2D2F*y)KtFtw+A(6Pb{a)Dh~3vwwJLWQVGyU72Xj-7qiny z0F=sJSR89NT*O4m?dqEwy*IJ^nZW{odhScgIRLyPTNMWv2;j>pJF5(ke*Fc5Pe{xY zXdbH0Qx+PN)lWd=kWHHVw;r7r@@7xJi3bw%&Vci# zpLTR!M&gL<>&4`%9M((4%O7G$eoklx^&c}7&Dq0t`VztoL>2<^UhCq${(KTswZE%v z>C!$LN6NrIyFep8b`8LCc$&M<6FM8iilk!7Q5kutbIDcI#Y;fL1CVY7@rtmpPLYtV z*3@SH>d+U+zwZInNe^;d{PiDRa4`AtQ!$muLP*v5@3})CLd1S-64$sS-p78yRwuX~ z0tj?4?+r*fm0`!Cb-7Lkg6&M0hc54F#;iol_1V(7{{gDB`3cvR})O z;s&tQccpPqVFz=$BNc))R5~8)|7AM79jt}U*XDR;)r#ZJh{FF-NvhV$CsQN8Od#sP zyz1&bS#~bXKa91XVkL!3HAz-PoCUDh-Yv9EW)`Uc_?PXkvTyX2?-tBl-}Tde?J^`h z)SFlK(Er`$WEM61JZuuPO32KIPS{HJv8B~%J}I{!V{H9wHn3P=-y`_dd{_7PsKLn3 z5x+Yuk-yVl&Gw_V@Ssmg1=dHV#nhBsFXmKHtLB&#GHJlJ$yffC{!K7FiiK$f2N#_F zWf0P^t`@x74Sjj=-nsG&(VP??3lhN~FUUI?+;8q`H?&Z3dt~7K?G|0zY!o>|;ST~C zn`}glqmoTk7X#(M|3&=Bvs0QagoS0s{^;boQF-J-A|g3bm}2VBF#nozm0cQ*=fdGH zl6rgt;I~bAV)< zKXQXTh-2MtrEB>pFC?c;_pu`}Y~=(FYt~|3XE)%3^5z@9n5)jml*|@DWiB%pH{^h< ziEPn+RkVns9K8wH>S1Do5$S|=9uveKLW~-n**7a0WT2_#ky=1^ReZK@+y}(rlm4d% z1|Lv3SHaSE2RG^ROugYv5ZujH;82KRSDUA z5ltt+JB;GcC_x!k*Rt>Fp`laE5c|2?{q!&pr^3=klv}Dtg<}BI|DHH%y-;htw!IxH zkc-n?@R2@S_C^(+d;?WXC>m2|Gx49xwK+5>NipWh{QiUvzAtGf=L?p?mm zs;m|MbaeJKUGR^gMg_X+dve29adDSvhq|uDe~D826%FIk8eSJ5Gi=c2$-}|WV|i)0(K7O1o%F*i;Um5wv>Nvv4n4|SVvmEV zJxmdI$Njms>3F8uv9#7)m7){4;+@T1x%DD9xhOLyKmA8$d>lE_cW*{g`Lc66k$}IL zwyc$4Tys+Z%K#N`XXid3RngVbsXQPe`y71^PbgZVIJu6*8K9z?>b)id zSqnPdQ-LUu(JHi<_ZJH=LAjg>H**nz&w1`Gf%A;xZO=S1mt97Gv$i2?I5_23of7aJdp6Rp&^4*R3>be zTD*X6y?9J(2JwU@ZR`qQo7&m4E3Ju4AN}uN`|2u4Zf!j;>GuRD)9^t)i5c$=JNpz( zm%$B_K`rdT*)58Jmi8LJp=|UP`D_5iLij)7A`z6En-MSL|8;btPBlfo?M=a zu|Ez41Re4borQt*?xGxevh?L}sc2-at3ZwMUEVus6^?BxY7e*#nGCH6$-^6&=KiG~D1WKJCDB$`3;+1#wrsmBfXrtcr7?xoNC zwKkvcmR^3FDl_sd$bqaq)`{~M`jw=! zb9VYLh&vZ*JaK$yN>hUZk*UIwYb(s*F}V)|XyDFwD;`w;Tk~me>l> zQ9{8Or#DB-)zuQT)-yF{qav?tSAsQ*i#qbr(z@_ujF6z+dI#;p(B zn!9NeGvFZz^h`TE#{6^eh!03@E>WYRM9wQP-`d=cZ@37?D-PurB<*NW&Z&rc=KD5C zXFH313B|jFHk@(YPFGarnBy+|ZfyVMe)9r$vOy|KroO}Nk7K@c!Lk?>x6|j36=m4jB31MOb^_RB zaOVmxZ$b&oDwxwYlNRNpQ#?F)VV~-{MZNvAL_#B#M|Lqdv>=ns|9Q9|*LG1ix0rjm z+8540l>S-h0Z{94w66vc-{V3q-9PC*Ha@m=%EtD(GYW$di`0JHV}RH@=I7;*eK=s= zT`(aRQqC_}UXErEcFL^T0}fhdt5;QQK2G}13G*@PuI{^I1v}q1yD0pBnter8;lA<| z-qIBK?^$?7tVC#4tQPX0}^bi#iwaL8H$i#>iM)U^8Nznk2dlI zJ+K62yoGAT+lbdrq;PiB;990eV$N{P%Al8760fC zL$#t%P;_S0jX$3h{=0YZ)>zLy`_8QrJ}lHv?q9bj@($3cn1`yE!_W{=*%i6Jj`#+^ z-iM=3)`>9>p`zT?Th7Y`|rst`(N>D+6YI%r`|7%vA>UTB_N-C z4amhhr+Wm1q-EKai>8J&o{}>)K|Y}9@^Zx!{pGK)_rshiVIPSz1Y z%w54fMw9)&bB0HhxAj|Gt#?NK07}ZiLhYx0KS#fnIo4v+?=oP}`LzZG$TvixT&Kn4 z9pL!$w)NCA^AU0S@4VR74#Dmfsy`USjb*jEzCV1y&!wuJeTmuYR&G?~Di{_3seGV_ z?wNSu*R3tLw(f&f*-mnCx`pR)%F4(@bJD@NkNUJ(U!gWOHs$B%X9~HOx3#yItZbcnA@z6K z0b`eu}{@9%|tv843nyO}gbPezg2la+24W3!>kgh(DIFdaO{O&Qn-V(N z*=cAfym*VWwBQlO>eTR`>Qej%#s5MfEWWp4!aeIN_BNRKVRS3JY7RndIstY@!2LV=B=Go5#ls?0*rE{^dJWcXta#P!SF0{^qgb+u9-k`{t?)0O!4v zN51iS>l6ShX9_zZTzEP<_C-hE@9k-$pajU7uEgZfy*Cte{+{l7VB;#$&%}oPTc#T= z`{`9AsgQR{baCoRc!QW)S6=zCuA*vAjm7SKjfJYbP_{}D7B+SPA9a8)cyM@llmE>y zg^0-VJ`ay0ScRPC7dLV+ABv1c%{cp(_oDNH5RLbex=2x#C`Iwqty7!rI+F z)4s?|?k`IcXz#Hev%BnWPDJ`g2WXHHkX~W;1q2}1+RidEbJNpoAwc@SZ{Cm#dtcrb zWo5PBz)7RPMugk?gMQHZ!&(S0@qU&neOwAAy4K;X&fB}9y}gWgAJJ%00*WQYnAP7E zgDJ&3e!Y0SMATV-t@tdPyYihoL)42ygo_v#0`4WW3JojQZ*Fuy>ZO+6Ah(7~q1m~( z5DOSZYcapI1Lj<5Hy@L$D=S}pe$8t$Z0Q`Z(A*TwCA2_V$4k+3ER9sCb+3GNeG~Mx zh@jWMPq>#~M8s;e#lYU){=JV62zEmoMb7J(71Wu&!5@f_@J%2=a(5j6XH;1`dwX!t zAK-3u1&Ih5F9dx_mH5sh7$Mc{-IXw;S%wL-AYF@RYp5qaTlt6YJ9ZeXsu6W`4Lb_R zP3hD6c-EMA67_zfTzYm?&*(nN6}q-!Li$da@v6?J+Mt>p%VEdn{5O22O~@jxq=XBE z<(+Ntw|A z@wX~6FVRPuOgrblJpQM`vN8>K7r*0;`&u@)@(i_RmY1zpedfqS1nE932}0M3zXDid zx=tZuC>nMM8n%;j%qx`phr3x^yEKb^I`(MSi{o{g5>74$*I}e|Oj~8go?o0o30DG8 z`;He4I?F4uNTQbTHKM2|3$yx~D>&=z#pRPxXRxl{y=TMj(;IX}60V%P(b?X#2=_@b zJ9xz3$3R?-*CWqmX`yizA~6QByx#d3{I8Jj8lt_hIo;GM?-SKs<0{XN))p7awFG$m zIYj>aeJ{4J6jduPJ!3v-Ly=aqKCMCn-ALS-AQ07`FDtuz{+T82TRos{CFL2-KuO)` zdbUvWfEkGGQ3f!6nET%Prfr>HAAPO2nmzxPjDXt-@&m8A{aAp8>~K)-o@O@y?<+yk zG@1w*<=g$PuU8mmSHIu0cAG}t9qqh1R&sUj@GqKd(PSmrjBUIMyU_?Wc)1=UPvs}j z*Wxf8?1Md&dN*skd5y%)$9P?(I$`R#`7&;ui{SW0$DAE=e_Np&K}x@y>cSLDd%n7t z8ZzM7OL~TQ_RjUdpzDEEE>K?gnW}3jbV}p#((TH;E&?K90uz)-gPbP*&aLleC#p?we?6M#0<{Sd@>mLAG0?tT znmA$$=>KUawJxHM^@lD}oFARCD`2CD8mi5!-a(PuY?sv%8fPjZhDxbc^D>mUlfgKH zS9ob-z2eCyr#rx|Yqo}D{Ho^8^r|d1hgQlS?aambq-pU-e?7uy+5M3!;$7J9i+XQj zo`;Y@6?G?)KJs~EeYkWjJB=Bozaa#8`Jnn$`_*GG5wCk+sS*ytaKZ~(npepAQ&CBA zn?6%}mzrfOOVHEXr8^k2UR$HX`#Gh=yK1OAIuT^TI+pOYyeAtG>Uo?u`kOQIUc9#dKygj zj{|x#%H-}JP5EsnW7rwVxb?k1lV#S6oQ<<7gR`Iv$b2jhsw;t}prD{vvFpO8$p?kG zui<1b8w)l!3KCxi8kN2Q&N*5>zLU-#{~^t{Dym$U?tT{JFDVh%YA$4P?fQ3uGG@|$ z%Y`?nA;IWwZubQDrqD4$AtCvxEU%Z!*xnxG&>`M1AyqfY!3r|*HZ)3bGrh1LUIqts z+DR1jinu2brFGQnQ4NLs`tf{19ktP!3@l>1J?em~Q{UKh;nOtq@@E+#8{@z2PSw*6 zZH+`v8<}bdHUHb0#}0HK@)1D9F`RsCY~`z8J4?MDA{!e9!$PMlYkTpoDUye5fz+_! z~l4^JFsSRTt;ISKWNB!+$cQm2yGI>!GUahDFm`)Q!oM_pd zbJw+WQu{XmvJRB8r#pMUSusmScP-j#qTuhUL&eNJE2dj8)nAGi-th+I6Hu0G?(9yx zq42FLbqvzvwbqXTbk!r*qWw#x-i$(nzWDEF`Fzcs|9&aFI?PPzKXjGT8|i6%=V_?D zDNXnZ`c9s5X-A`)&n4%-glMvh6Y60Vw8yUhseEvt#&;J@L> zDR(>sdG$QwU)G*bK>@&?LSn3Dz9eF)-aOq%dDXN@mK5cCplp?Q83= zUI|t4138lma3mb)z*V?3M4ANQPhFgM+k+8vDlwQ`(aVLE zl??Gzs*~Noq(t<1#rFvv^QkGq`s~WxI^^BIUmFK`Rw!=Z(3We$KlabS&8-ot&oY#fAm6KSmc$pUN7v&E>{K;TEXtFWt;e1@ze*G}@4R3UWXg z@AlibqG%pRzOX@^*+;%j(2mct<6$^G9(CN*e=MF`)mVO5e97M@cI+VW}nH!kL*k}9r>bISXYV=_Z zR%LhXa1HKbUVL?8M#E5Z5N&3|PucNYbO-pyOU-NYaF2F71m(A7tFzD(?&DqRQB~^h z3aY?&98@RHp%n_DATg=Jkt6VvhD zC@VS!(Qq&%m%kp25{N1f#`%1pwZU9x{U+PYx#l*FHbZVwCVQ@A13Ny$uSjyd3RS|* z^Davh+WKB}H_=JnmdwCuvp~7B*U!p1U8Crh6D1nf>~b$Rav+3FrvI{Rz}56F4OYfy z2^@BX*Jbl5BD>|y1kVlUs<8X14X%@UE~>7AdYGuuCuA;zMKwbt$RrJBT@P*jmK2#@#3#+H=+idF>Ut_w<@bCg-g5*jPYV) zW$o1`3*Jn>vvPeoQG1V#C55GseSC$a?cp9?@(wv=-p;3ICs%2I39S>oQYqmjH0FK) z>2XWZ`*;)Y@iRl-xn0C5hd>ln`8Jt;UZjU(uxhZ*cNujI6={Pz4DM>`vU`D{&%l=O zr))$GCZEY7WhC&*u(VB;_GF2@{bANuoLRlj9f2208YG+X_`AAy;I9&Gg@LNzA9-6| z$jG7AmP6-;1rfoUs~lS&dgtxi)YQGa;o(Tr7QVXG!*_S7O34>k>Ls2upX9d&su@=> znkV9?l;Zs(4b4>5bsrh)P(}`AvejY% zijY!0u+*jj4v~*fR`yje(?}SgMpvfC`?j1|Tgs*spVNVLRbCy6RKslc(E(Sb@P0P! z-fueAXKvgRDnuGqEU;EUBvwEyq)K1s{3~f8?VS>7AIx%Jk*8-JC;4j(B)bh3;k2^; z8*T80AfHMl9guz1mORh=<^cb_SM@4TqQCZMI5%bodX}8{XrU5RF)}8kzlvQ|+~Xy} zOT-!e_T=e1mz_Ae{!v0cd^oterNRGGBVpjx1C1nnP)rPEFTJTvo=EGN&{ zpq2FIdh%1s1P!5zJWg|YuWp>FS1>VRCJTr{k#3(=ifW{z$UqeyH^-fw5Oeb#QLp>% z-d>=;zj*LE30lZ94Le2`OFvar?;1A=#gkqg4_8e7j89A)1{QQa)S4~RD`j{xEK&Ve z-=zBEtl|%yVJ$3b%2Jn@zcL$xvJC`~BG3$BKC_{m@)RPN(S`KFWAGV`F2H|JcWt0FMVA8Yxyx zf2`=iN$SJc_mh&f`lcoms?+9u_k#GwTfo{%P>SE{fZ(KbI4b>Y=b8G|bJD_j?+y8j zckLr-hI|#fnM+2K%}GpGGoL44eyy)~F#Ae6?eJp7!RgwvJl%}g!_n+PEEz4@KZD@0 zU4f??^@A6E-cgH#zot7^W*NAYCj8Y$606;L&5?)qX9CM`)8}gr#s+*KjzL{_o<{Uz z6NcX_#eTwOmc~5n z@9pd~2>d=T&-DP{4UO8s@Nj3OuXehzE~_JXqc6t%O?z``vrBn#k>D zGsNQeGI30c6Wta4>W_Ly3hfJiRI8dg7?&rYqbs=o^(=ZN%+Xta{9$KvlPE$s8@+|) z*G9%JyL0^fctK0#`ohyu)R@=R2oqbQYoiCBTfVU|>-67}3Q-PK?}X>u6-``oMQ!f9 zW;S^bw5z9)W;=i7+deKKUzC>wy83OaOXHF`Mjb-+2>(bboY?}G&oEJrm6Z%EOfrWB*OFpsOgK>$N52IxHP}uhji5^dGxoM45|w7g;tv(b6hLa3;|Y| ztwxy)j4EsfcLiVdKBF;|o+HQ5#=J%l*U;dloI^z^-)1tv2!OajG}Dp z+w*9;$MD7&AK+NoAKmfvsR?Y^g^{LI6pxw)R0f&SSG^i>P-1H@ZI|+(I z(WoRPdnV0TWfaHk?Gm7T2da%rvfXw>e^5Y>dN&|vkEA%oCqs(Adv@L@OEq(r`>vVxSZP(C~&20bhOOlv()^%iW*wO1hSfe}FE_!sXEM;{NES&TeePQF^e z$lR0?9n8TyauqJ-Mh1*R5kgcw;#|y(o9qaJ*!^9c>3pZps{|FFC^p6Q?H}MG;OXg! z+J`>%9s#n(-iWTWErqC~GZ21lV7kIJ5cT5TT7UCb0hd4kU@RAiCZ|%Ko4W%l2xNaI z_s7y2DdJ@WoqkZy-L!GrOJpkzYlJekz56*_-v%m_-=QZkzZ>ZWC~{DVo}Ibjq%J`=1f3YPOP+s@e~XYza`i_%s}E_#5GO zco`4n=D#)9jJ_yDp8Qg8z<3();a_gi-avhg2%r;*To(m(EkE{`7e# z^z(_C*YWy*L#<}ku&_u7huD9fP1Hiv$0uKbA(5H%&0Z&l$Xn1%90gm|OTWrz2rf56*xwlH=}5f+nMx@Y zF<361mCL9gi^9p7IR(4eM^br?CmKm9O?Jxs-jONP5FI5~Cmy(YIPXv4g9xQ=CuDn; zMcEsF)eKJIA@+%TLP3V_1GnY?mWdrn0i%k6yv&D&B{K?S9A9iQ!SOr?wUZ3JjrB1g zSU}8blS>obl_Oky9$v=bO&V5~7^$&uhld1fszK^nJr56@G0o#7wmO76L^DwyTj&(E%|FRmi@ zW@NKZ(JYiQ!Ev#%9;>T%{%B*GZ@st(v2Ii+ffH#_vbKLNnZ?C^#`5ZGdL%+1h1x4~ zUzPpB``F8f*uM0m`sc;xW2Fd2)vNl(dp{oRt;6}jLdDD^oUY77neKe;M{R8ZG7LUN z#i-q~qZ{&YE_2e8WUfS@kuP!^;EjWmy|$K(md&zwZ3DOSF@)Se^VK4xRdtJJ$}w#Y z0qJvJ2-Cp4<@)AwmiCT!mo(Oo?QcVxj>rgE`+q(7zPMD@F$~wbJWrQ0&HRW`lo{cZ zYayx$ClfYv9Al^Z7>sv#?|7SX@1Ox&PWu#$2Y+^%*@SWZ2ZoGV@^vbfv2r;YuSorGJF z?=vtez{u*ox;ny^Q=MH9g#OkZJ<Vr5cI?dJJ5S<^c>Qoq8uo*P)p-k@& zZHp+RU@{Z-Galo8o)ooMufG^{r3dT&+sv)ZXfOw@J>1M|<*|;ud%s3Isz&Vis-6B; zD{gd<4|_8Frk3P$d3;{%-3XCuonzv>o*vjRM(pWVo3iBJtHrFPV0JGFs5BiX^17o$4; zg4rFKk7$N!_F9Dm51zx5Vi-A1b)Vq0i zo6VYd%&+c$I^%{0ka5!5tY*v)Xv#-)>kC61)_T-46`$PITQmEl?Oz69UPaK5o+ds| z`aOR>BMY^$H^13Nbq75wWI?yWlwa*>ib~Du)r&wmG%pSxd)r4bo1`O7iFU&rzAwTHW|&QR*R zCD#-%Fx8U4{xZtz$tCxv$0Ec+@56cOwj1jFXbeZ!u5V`&xvhvI-R!BJ4=1zTCSx-? zyGTLqSNq#rTgf@YtzJR`uq<|gySDLmTnYY2#20Nh5C|{oKQ2JL(14L~Gp`kq-PZmH z04&DaFhgW)Y}%R{8pMBs7-hW&Fh8d6`4}qh8`P3>mXX=)`f_4ZD_$3|UEM_e)v9DT zmda0I#~Q~c^c57tvht0M&D~7F8lv)xq2o75W;(xd+OP}Jj6#R-^9l92S}i{q^TuD& z{_SeW=?$!{t0fo)8oJpnbS%9)44CaB%hPe4-PQ0omt-C;(Z?nBjgst$w2$qiS+t}t z3u@59dpj_AwLpWQAfD?}rs;hC7b-9Xfq8*>Q{5+}s?eeDo9L8`>M^OQOi^w)eF*K> zq_5ZwI5kpf??67CT_e-eG+e6aXlPUrZcNfohaG424Ni!Qbr;$WhyNlHJ5yvbPA#gO znUg#ijqaDm7VqTVr?uWaXHRYeH3DF?-Q)7eCcmwq6<@NG=0$DbdNLI3uJ6^Bgd`757qfFqK>biAnq7(- zX)BFJ8HF0XkL5}TkU2_CFdWL6qugKm1auP0@1J6?urXXis2U`Pb;QE=v@^Mcm*9yM zkc#p4K&(_A1Hq$>L$$FPztMb<`7h|QVFUt|&PJe)DLYW->(Wt% zc@N}W?94->sTU|xuKPOF&tQWflgbbG2usl@XB}2 zqyZ9@WV8crnu~le^=~;z!~YS}4=nK1Y4tXn`ctMUs>a5R8~-@1HBUV%SO2HKu*1Bc^o-AZN{=-8ok-@Y+^KJ|{BIDPK?)kh;a^}#7s3;R^@47@?dKP{KU zsMi=v?L_|YUtV9VE_IYat2R73kzT9OmvMHD;mKt%M6Xd>rPkIpg}GNZ>UBnaSxb9} zL8C5hN?xx~>uab3)JE^KOkp@%oYdC$m)>BQJAcWjSBAuN>)5krSEIow5_5o{NUc76 zB<|0R+w$@X(W8J)8D26Fgtu(n8&uz~T~w>~?OPcPMub2lVs$$G?!AZq`g^Bokgyxc zp_Ba`Nd4`)*3=Z%uX5EEd71GGbm#ENdJY7TLI=udg>ClvkiScJx$QMwY=~tj!^rDmhhus{T~{ zZ68{&<6YhWP)<(XzWv8g$>u+#^gorh5JCu8xN+mojT?7LuND@h`htMYLNVj!rxmBB zs7=S;ymz*o{o2=9Ds}QBTU!(YF&d3l6-BD96zcF&QwX-o;5fd&<3UFchq?JplO5|$ zt;^iWnVO<@#KUYIq3TaXnnHbl>iY}X_qYE0UK0$xT^)T$p@UUT-~4j9JSQgy>dZte z0LaP7k;~;zt3Ne`U>$$E_Why8e@LNJ4$HCu0RiXEoomykji;w)U8u5BsXTxFd_X|J z6RTUPDFmaEAVBq}LQD<|8p=Tsb=TyER+y z84yC?8Zl<_$Z;`Yeo|bRerwtEx!3xAIx#{j`Rc&sk0t!gO)r0TAnmay5R$)tU3~xH z!vpsHsPbo>S`6<|ym9&EaT7{x0xn^%Od2&ICd@~w&$x2z`|s9mOEDsF=`d>imoK#l zbpqZ{l(c90s0HWqO{NU!GkxiouXgZevJzI!`DyOS0#b64k#EF=`bhK{S5C~EyMAkm z0f9@0k>kD`*8Jf~R*qVDA)l1jnslKrg+j6H4mW3`XKMzh*aoe;`99dPdY{^@v5S{C zClUd$jM!c5*;MWp^7`D5U(#}#MB%9%@>p04!s`T(krOr8wb5+%<9t&VZ`{1n*I5^-f@#- z+j#jmYCUxNp37%#T*MocTOppI`G@SHxYS2KjU@P0F1b=o-U8Nd3Wfld3p{p+^O zj2w&*LZavqJ@3w)&?vOkfMx1YA4j(`=n>;Re8!Y_+z!1F)5<%j(;EjB(`NQ)hA`K# z?~F0BjiaL$H>^h{;?Zs0T zUR3+ZJzf77!XEvOQb^8(rVBYp)`Oh*ab8r*`S)4v)7|XU(Xc1-e_QC!9k(nO`_cc!%|e9teYGVLWsY-YWC6-cX&laa@@sBo=qar zJsi|^WSjeoKbmzS%hNTu+0E^H_j&Z_t4Prsj0VOjI4Cr{X^eaQ@RTBN)=f@VUQj5M znv4rsGxCEA@^ew+dR`JH|H-R@!oy3SawpYE=I6sQh|kPT10R3aY<)UHh^Puwj9a9L zMa0M(kxa&_jYfnJQ56<3?vWxEh|y?7QW;xBJiUBHA(Q@!8^=i)gb-q69NOiaV|4ZO z)+gV*D|HH}FX8|p1Y&m)Q~40aCm;MPdC|CW8o&ByXKlX6^_C%|LkO|;y!}KCCjE6{ zJSPP}2r)7d+3lQDe0}@7U#Z_3J$rZC0Auo%O)J+fJe;XV2qB!4mCLv{lSxI$!0VBd zj4i?nFF#R(cm6y+?!S|u-OgFX*LS@8wfe15vv#))Fy6bmY2~_whqDZ|(fkw&#UYj5 z9IUDSeDZ}O=|i7?vFXBJG2%+)lLAC?^OT~n`t@WCix5Jrk52%~KbfV&_~9W;>5}}H zYPZzqfDqwxaT9h`QG*=YBk^F#TkFkd@(U@-sXodl^IT4 z`qX@OZkF!i&%KAN$QM1FElLPa!~xpdM|ZuqeTlk=Z}Q^wzh@3fjGO@KcTVF%s&)@Iv`Q0yT(696MB;L$5y7-6pcy3Uun+reNcVctmbMJiF=fr}f z2a@0s@AMD3vTSn_%LG|Cz}z{q`oipwzkl=gPd5_sjUv~2E!z4PoVau=a6CYiu@Wkc2zAc~i%Q-GiVF4uASaCZBHIALaV2KOB)Bj=ap_l6&fdd&*KB$IlfUkcml&_E z?>~9h{W4#z>Xlco>5NV-U8QdSSpjFR`(m1Y)C&vOePp^&!kHb@cjw|@-`;PG{VG%; z1zenY^Pj0xH|7vdQC?{?*MBiXKkE4fYd;Ed25n(>!kL}Z_b73YZ|^r={VK$ClEi;L z|9oQ(5qZ$wNTEf%lTQj9Q)@EpOGxQoY#t1mM$i-jg;lr^A8FP!Xl64vl zK^*JkC$ASI;sBxI;(Hg29vxj>S(9QG-boV$x0Z=D#VO~F9-T^k{y-GmS|$dBRod)i zO;I7n2v{lWMQ>4O#0gVf{Q&mAx)`+g z<21519^Njc>qCkXa?`*iJW>n@@hWZh9gV7x#|T&{Cl7S?3*dCAg&FttIvqj)A~%Uw zBe|;#P;qh6X@erVWVIJgFG##E3Tfvg0fY-RS$8z50v^M|lLT_Q`-SN#dY!)HB;Jjk zU7gBFN>*X>R)Xr;ss`wuhPgBlwTIG zv^-`?EtJ34LxmJNgxE*)Pe6pEP|QH}S#)c2=QD3m(t_*3<#P$-l-ik+%I zI9N%c#;#3+OB9OTI_(wQ$mUP{qLZMjE@u$8&g+ifF-=9Js zKqwT7z=gtkf~t#^5=IPXA}cX@*f%L3+>$C548 zph`um_7-neFg}!hGP4`5GAltjwW(4QKqW=7aN|F7ngFWN<;)p_p_0j0)olo zHY`~6KDFd3VAic^NxK8G^aJxYvINV7#%z74T;!{){xtGqQ8QEOru~2#%5v$aODmw_Mk*yl`q3TZ^QHqeeRP{O>0PW4SeS4HG5+Xo!9VTBO!sP&+KrL%nm4OM@E-)>;d(@}5F>S_SgrdBW|2(@|b!NgUs7Gqbp z8hxIm1-5@{0Bv&%FX@m$f2gT4l<%N0^j@XZn*D|1AcCD56&(C_vgvyZsP_3PjeUXb zO=Iy2FUMAY3Z;&Wqfq7B-a66=HB?Ur9O1$8CbmHZ7(4F#6pDR!F{s0Kb@;H49W*ZW z{iy~Cq#6zw*a7OoICk#^Vc*M@O-Z2YPj6#7E>c4a@Ip}MO;&E$$69+mQ}w6nMeSeJ z#;U?}PoVv`7K&z{L4TV=)!%-l4XV-atDJ0}PFJLrvu3G4poN3#{RZqpAE^3Ms1DlW zxMI@@KVY+OEwn1sNOOSzyN1ofK2-fFR7t6=>R|P2Z$1wQsC}vWQz#Vsl5~3x`U|N& zsQObE&n`;uc=JJl_CZJL*R~4!+brxueSZqYb`nB|_L{v!)q*P4-{8S+24t%Klsf8i zQkR!Lvewd-g_1Gmk@^$br72XXEIDzFO!fz>S4{X5e(1Pdv0cDgos;_h6zUT?SR;T# zcMV&=@`c*&_cga{fT}-LW+5oJFxQm{_JuImeH8_=&Z{Pa{xuf%0dxCLEvi3_HBld& zR+iedh6@39Q)sYx`Kj+uq0kY_G0Se>VISK=)t^HBZ;F`>3AXP9AoP9)!oE+yg0LY~ ze@a~*V8CXDrQ6}v{AFt-=wC|~u*E6^0jocKFF>IKo~7RaP+QgBC}h3ugKDH1{}1eE V*Rb8G9+Ut8002ovPDHLkV1lRU-WdP@ literal 0 HcmV?d00001 diff --git a/website/EN/mesh_usage.html b/website/EN/mesh_usage.html index 2621e7ac..4b91cf6d 100644 --- a/website/EN/mesh_usage.html +++ b/website/EN/mesh_usage.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -247,17 +247,17 @@ for the JavaScript code in this tag.

Mesh Network: How to use it

@@ -268,9 +268,9 @@ When you first boot from the USB drive the system will create some encryption ke After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as Other Users and Chat.

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -280,9 +280,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -292,9 +292,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -317,9 +317,9 @@ When you are finished close the window and then select the Network Restart
-
-

Connecting to the internet

-
+
+

Connecting to the internet

+
@@ -350,9 +350,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

-
-

Connecting two meshes over the internet via a VPN tunnel

-
+
+

Connecting two meshes over the internet via a VPN tunnel

+
@@ -387,9 +387,9 @@ From a deep packet inspection point of view the traffic going over the internet
-
-

Mobile devices (phones, etc)

-
+
+

Mobile devices (phones, etc)

+
@@ -419,9 +419,9 @@ On some android devices you may need to move the downloaded APK file from the
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh.

@@ -496,9 +496,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Collaborative document editing

-
+
+

Collaborative document editing

+

The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

@@ -529,9 +529,9 @@ If you have the chat system running you can then copy and paste the URL for your
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -566,9 +566,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -583,9 +583,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then select New blog entry and Ok. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

@@ -619,8 +619,16 @@ To finish your blog entry just select Save and then close the editor. On

-You can also visit other blogs, edit or delete your previous entry and also change your blog theme. +You can also visit other blogs, edit or delete your previous entry and change your blog theme.

+ +
+ +
+

mesh_select_blog_theme.png +

+
+
From 839361d04cb2d5acf81589634a852fa509c9378c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 17:39:29 +0000 Subject: [PATCH 48/64] Add photo editor to mesh --- img/icon_photos.png | Bin 0 -> 1164 bytes src/freedombone-image-customise | 1 + src/freedombone-image-mesh | 158 ++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 img/icon_photos.png diff --git a/img/icon_photos.png b/img/icon_photos.png new file mode 100644 index 0000000000000000000000000000000000000000..86da2152fa329d56c5d895e7d370bab496721443 GIT binary patch literal 1164 zcmV;71atd|P)sXt}p)n`5oH!yk5?y`{(XIV{&%V-i96xxP`p}>A$vKFXvNF zAELu40)oe2djhP4MgW2wzGwh|Z54~NsTBYnYJ`=bM60LS1!MCz;v)#bj9ICzI_K4t zt9L|2accIpi)QIC>U-kpBbFm$n1DbgNDe|zfPsKnLpKDw(khS|fiNPXt z$TH#{`ytV%@1NhBH{Y}`Y+EV1|L!5;?%CjDmE%oKK#!;o;eN5lX|Se|rYND-2`=M_Op-;9=Gv6!dqigd+jo zwWa_F${8R^iKH~JreL2Ds;oRl6v~u_O~HSBy4!r_Wet6+oc0t$|SS zyq`v&y})%uaTuj2APCjZB|I)I_dNL(`luR*P+kKd=_{+OfJPAN(`>N4_>ozIQWh8m zCDoZlrjv2A>*38QmBHD$amDlzlLaAr@TL0qY1Hq^tdxdgAR-n6fxcr z=me9|IXh4^{Yz<}6am7{Z02oA8W1o*@Sd40MYqcR2+R)RiS8pxLlK0OhLj^vd#X8V zEn0x2N72YVN0|r1)QdY_Ic2v-7=dKwR@mpyXrD*uc}Ij)8&W;#qzPd5jG(gnm}w`{ z0)UmHZc^<#c6JUJ{Csb-Abq4my#QG{srPNLk=xO%J0O)QR&OTBrj1tp+AL}I_8srQ zu`X?|M*DM+wX#C#`w_C~n3evpvWQp(1YiJ!kkd+6N7dMQ+^aF(X@Qm4kP$FIpj-h0 zWk~}B9(VI41ZVyh8Nq=-4tYNUqhA()*&AD>;hI`v=1%23e^=A*&8xGlg_qXIT=muJ zjcmQ2Z&ic8+Mix0TL+(Yge3KU1OiDAxu$<}W?3EmQs)zphn5Aqz;BiF6sEH^?LZZx(=E+tf2{DFwm`44wh# zXjX2;NJi2_W!Di#-^waI_xA`vY7jg=M0@uuv|pkT;W-d8LU8~9VQ?+M^Tre)7>LH~ z0FV&?01yBG5CDMb<67V|2A_-o0Du4hfB*n*jQbIQpte|i7L3&|2`dc(MrptR0RsdK e5HLW%I_wW@T3@Zg(G-CI0000> /home/$MY_USERNAME/Desktop/kdenlive.desktop echo 'X-DBUS-ServiceName=org.kde.kdenlive' >> /home/$MY_USERNAME/Desktop/kdenlive.desktop + cp /root/${PROJECT_NAME}/img/icon_photos.png /usr/share/${PROJECT_NAME}/avatars/icon_photos.png + echo '#!/usr/bin/env xdg-open' > /home/$MY_USERNAME/Desktop/photos.desktop + echo '[Desktop Entry]' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Version=1.0' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ar]=شُتْ‌وِل' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[as]=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[bn_IN]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[bs]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ca]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[cs]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[da]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[de]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[el]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[en_GB]=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[es]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[et]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[eu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[fi]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[fr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[gd]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[gl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[gu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[he]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[hi]=शॉटवेल' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[hr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[hu]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[id]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[it]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ja]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[kk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[kn]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ko]=샷웰' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[lt]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[lv]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ml]=ഷോട്ട്‌‌വെല്‍' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[mr]=शॉटवेल' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[nb]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[nl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[oc]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[or]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[pa]=ਸ਼ੂਟਵੈੱਲ' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[pl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[pt]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[pt_BR]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ro]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ru]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[sk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[sl]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[sr]=Фото-бунар' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[sr@latin]=Foto-bunar' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[sv]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[ta]=ஷாட்வெல்' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[te]=షాట్‌వెల్' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[tr]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[uk]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[vi]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[zh_CN]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[zh_HK]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name[zh_TW]=Shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Name=Photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[af]=Foto Organiseerder' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ar]=مدير الصور' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo "GenericName[as]=ফ'টো ব্যৱস্থাপক" >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ast]=Xestor de semeyes' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[bg]=Мениджър на снимки' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[bn]=ফটো ম্যানেজার' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[bn_IN]=ছবি পরিচালন ব্যবস্থা' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[bs]=Organizator Slika' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ca]=Gestor fotogràfic' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[cs]=Správce fotografií' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[da]=Billedhåndtering' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[de]=Fotoverwaltung' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[el]=Διαχειριστής εικόνων' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[en_GB]=Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[es]=Gestor de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[et]=Fotohaldur' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[eu]=Argazki-kudeatzailea' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[fi]=Valokuvien hallinta' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[fr]=Gestionnaire de photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[gd]=Manaidsear dhealbhan' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[gl]=Xestor de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[gu]=ફોટો સંચાલક' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[he]=מנהל תמונות' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[hi]=फ़ोटो प्रबंधक' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[hr]=Upravitelj fotografija' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[hu]=Fényképkezelő' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ia]=Administrator de photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[id]=Manajer Foto' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[it]=Gestore di fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ja]=Shotwell 写真管理ツール' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[kk]=Фотосуреттерді басқару қолданбасы' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[km]=កម្ម​វិធី​គ្រប់​គ្រង​រូប​ថត' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[kn]=ಫೋಟೊ ವ್ಯವಸ್ಥಾಪಕ' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ko]=사진 관리자' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ky]=Фотография менеджери' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[lt]=Nuotraukų tvarkytuvė' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[lv]=Fotogrāfiju pārvaldnieks' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[mk]=Менаџер на фотографии' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ml]=ചിത്ര പാലകന്‍' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[mr]=छायाचित्र व्यवस्थापक' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[nb]=Fotobehandler' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[nl]=Fotobeheerder' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[oc]=Gestionari de fòtos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[or]=ଫୋଟୋ ପରିଚାଳକ' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[pa]=ਫੋਟੋ ਮੈਨੇਜਰ' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[pl]=Menedżer zdjęć' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[pt]=Gestor de fotografias' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[pt_BR]=Organizador de fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ro]=Administrator de fotografii' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ru]=Менеджер фотографий' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[sk]=Správca fotografií' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[sl]=Upravljalnik fotografij' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[sr]=Управник фотографија' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[sr@latin]=Upravnik fotografija' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[sv]=Bildhanterare' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[ta]=புகைப்பட அடுக்கு' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[te]=ఫోటో నిర్వాహకం' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[th]=ตัวจัดการภาพถ่าย' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[tr]=Fotoğraf Yöneticisi' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[uk]=Впорядник фотографій' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[vi]=Trình quản lý ảnh' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[zh_CN]=照片管理器' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[zh_HK]=相片管理員' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName[zh_TW]=相片管理員' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'GenericName=Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[cs]=Roztřiďte si své fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[da]=Organisér dine billeder' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[de]=Ihre Fotos organisieren' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[es]=Organice sus fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[fi]=Hallitse kuviasi' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[gd]=Cuir rian air na dealbhan agad' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[he]=ארגון התמונות שלך' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[hr]=Organizirajte svoje fotografije' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[hu]=Rendszerezze a fényképeit' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[id]=Organisasikan foto Anda' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[kk]=Фотосуреттеріңізді реттеңіз' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[kn]=ನಿಮ್ಮ ಚಿತ್ರಗಳನ್ನು ವ್ಯವಸ್ಥಿತವಾಗಿ ಜೋಡಿಸಿ' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[ko]=사진을 정리합니다.' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[lv]=Organizē savas fotogrāfijas' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[pl]=Organizowanie zdjęć' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[pt]=Organize as suas fotografias' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[pt_BR]=Organize suas fotos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[sk]=Organizuje vaše fotografie' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[sr]=Организујте ваше фотографије' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[sr@latin]=Organizujte vaše fotografije' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[sv]=Organisera dina bilder' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment[uk]=Впорядкуйте ваші фотографії' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Comment=Organize your photos' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo "Icon=/usr/share/${PROJECT_NAME}/avatars/icon_photos.png" >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Exec=shotwell %U' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'MimeType=x-content/image-dcf;' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'Categories=Graphics;Photography;GNOME;GTK;' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'X-GIO-NoFuse=true' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'X-GNOME-Gettext-Domain=shotwell' >> /home/$MY_USERNAME/Desktop/photos.desktop + echo 'X-GNOME-FullName=Shotwell Photo Manager' >> /home/$MY_USERNAME/Desktop/photos.desktop + #echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/audio.desktop #echo 'Name=Audio/Music' >> /home/$MY_USERNAME/Desktop/audio.desktop #echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/audio.desktop From db10e14f833a1928ea8c16f903436f43707676e9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 17:58:17 +0000 Subject: [PATCH 49/64] Show initial login screen in mesh documentation --- doc/EN/mesh_usage.org | 4 ++ img/mesh_initial_login.jpg | Bin 0 -> 117016 bytes website/EN/mesh_usage.html | 98 ++++++++++++++++++++----------------- 3 files changed, 57 insertions(+), 45 deletions(-) create mode 100644 img/mesh_initial_login.jpg diff --git a/doc/EN/mesh_usage.org b/doc/EN/mesh_usage.org index 7221cd50..477c0a69 100644 --- a/doc/EN/mesh_usage.org +++ b/doc/EN/mesh_usage.org @@ -28,6 +28,10 @@ When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users. +#+BEGIN_CENTER +[[file:images/mesh_initial_login.jpg]] +#+END_CENTER + After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as /Other Users/ and /Chat/. * Boot trouble diff --git a/img/mesh_initial_login.jpg b/img/mesh_initial_login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ecfaace7dd1adfb6d3c5a768353dc550f25f6f5 GIT binary patch literal 117016 zcmdqJd010t_cr?MZMKGBHHk@_brXpVF=^{O>rR?z2o5182xt`*6mhC`DvmobR0s}$ z5ntyJLBpU7g4TJcvjq|7xsEv0TBll->RHbYw!Xh!=Q`iHzVDB7o$X7KH&vgt*Sgoe z?zNt0`{B}uUy#t$FSH*b2m%@57y57&eU0jnB>o>T&ERjm^UqaM@Kf|K}C@MhmS>R`q|JT=t zLrBEub*snLAw-B25p_hwhr_4^n2N|c@bdRXkW?LB-FkfZug%~-xa;r#hzJtypzen& zsD2&zgTgvOgot+o5(h=y?LBJ}>QNojVjPX|&;Plr+n_N+o44zBabaPf7T>I&*{y*mDu3%|)y3;#XPzF`xwnJN`SSmeeLWVfS)SXxaNK7bmY=!5@8+qeH8&@JK;<{@ z&wV?)@8ET(HZ7TRvCpp3$cuHK?K=9h*}CiFa@NggI4b4Nn?c>)Hr_aV_UfJee!ks4 zB>nie>+U2!<{$M=96I9Lbqkeuwv~O^c9VtuKVxUhF?s9tubcg+dPKtq-|rn<{>RJ- zd$v~uB(_T~@2+_K=)1A6CakV#nz-y_tMvj2a+59zGOInLJyfDfGZO|{X{E9x$b-xx zqnDK+(k!9GETWKrkO%+)i1huJoqQIV5u&vW4ZtEPMxHG}G}22P$%uy-wU%^JM#RWy z-8nwNlhvu7U9Lnv*=0!=@n0j?|K7)Tv1O+~4Pl~!Bcro@D94jTm~DX)N{Kvy6q}`G z2n{bwmxTl#uS6nZBwztkyFQH&7{pxwO~eSzj6REp0!fcrEI=&FxUmhi(9NVXI%hIL zW(EnYI;2$v9nl~uc~zd&XW^3fyPm!6Hstx>ZHpWaliZ|RU@Y-Tk)%|ZrIXo5Cs9a3 z#Ic?b&I~;^qsZfNQLr4`G(vp*QhSjseBi+kOK0;`B!h}nX#_!9qX$e;!n)vp0U}usd<4T-Fa?{0)1B68 z`C=za#8^c}7v~u_9|a+&m!~Er!3L-Vv&);!u z-_{vx4q;PNtQ$pp5Lj}Az?PgMbPhH!Mr$<*DRZRRY=HG}M1+VUli>aDizftQJYWy} zH=c)0(J`o4CkvpE4#~|X8aa_JTxj5%(-CbsYT3d#QO2{eF3}`@UqemrIZqXbm|l&G z-&Fs0yHet@7*=SNs7$XEIDC=d5X$cmGCIJj;>@rp0VFs&tboGSaDjq%ygDNJLhKdz zNMb|GV2D{3pd?9xw1fj#NO5u!%Yh|1CBiEtTSQj+^0Fm=HGekaW#1;mi_;Tc6ka`m zt*`|t(MgAd(p9R>IUGvBn1FbN*~dt=qqwNx)xiibzyqKDxp1O@9bl#qAv;COtwJ0c zivT%EUbcrJlEDmzQuo7G$gbDthx3V_mRM~T!H}0-kKH_5GuhN)>WhZ4HLw3D3SqKS zRSvTtns3euG>CL=NM)}?sYKg(SvEfDQ!7ItX*oO0DwadZKW5-hV2Y4oDS!yjy+9}B z)8r9;WH3gp$;1PwKwyga)?g&(lBZ6pMB@w5-nchs&l83F;mdWcsvu+XvK0st7Y76~ zg~Np#iK_&8P82PZNL)$;3y_319>3#@O!mJMI{!QUw-J1?L+CRinTnrFK~ThLI4DB5 zUQJ2^5I-kbmm^#xQ$gw~yY@S~VUXs|hOSX(TlRXqaZhE4+!w%v#0Tj-c`~Ji6`&FT zEs`Br0qjwV9bv|fpd|tim#Ij?;Kd;bG=3*=1|dG;iSX}YkWfL(&1uAFk2=i^7WfoG zq$2|KMh_uJOipr=&)IETKA2I@vvNa^8~1-dHgr?3>(gJS{T&aVD#;}QT8$H8T#Tn| zI+Pb_wkSQw1Ao6V&mWA)e>e=U4|ou;@XkX*J^ThfBI)cPvje%TYB4rL;Ws13Z-!TH z^DUB1*O~}}+9UCDRPl)es7x{mBOy=0mzq#^I0MYdBVF9>6Z(I66fcY~8c__qu_T|R z5b!)t;xvho8kQFPYw4mO)6y1a{(E7h5@d}|Qc@^t6fhJQf3mVDM{Z|0zn9`0N0A&U zp^r$wcMKQL?|+uWcg;DUZ^W5tR0@H{-3-C!`RsD1(#VR!MDm9%x|ez+ftpzj3kLk& zs=;+CS0;0MB&A47nTvI9l2sRh&oy>cijK0dssm;SIA5vZJYK|=55OU0rT-Gby~4%g z?w&^J5Pu=!X^naxEu(ZNC}3`JMluTGDMUPTl8zxm#)L%te!I$Hk1II6|L2-B^WG-p z-#?XGR5qYe5RC*$9-t+H2{QsM0QzivDr=O9(5-}KnB#YDXlZypXLL}mO za0vWCA9&*q)B65LFp#@AB zLK&fhm+k$Sj*EesIv!i%3W-BkH($7W;bQwe%N9N!9$+RClFhzo%H;v5sFh}OV2mlx zDFCX*aL^je;Qm0I{s35{g!{xF;nv}z5n==+pn?Zwi$I`$gpdh`6Lc%iqcYi?-iPMou9|Xu%LSfC=Hnw*N~YS1SJAOi{aEeq6j=T6&$ z?Yj?lUG-%vtz2E^5I{`SRhb>oL6p#pK)2XPi9~F6AsK7M>tpTYza03D zR0?TAnaQ$A&}~4iCd^1E)PvRsp^#$M#;l0Ru=7E<(7=;L00ZNq7L~^X`O%Xb{VJZ@ z_NM39DDs;klz7xmGb)whrAzV4 z-Ub&?<)NTDuVtkh*sEeBxOq&*j1i~T+9 z@qn|pdw4y0ISw~Sl_Y^VaJ0=z+tkW%z@;`!$0C^kK{I9(da_~zk%nRriiRcqHsBAq zZomZ|AtVe-msGMzTEu5CZSr`*Buit6W|K#tlKNA0G*4ldv)x{Jia^MB?46$5$x4~B zM&~kqhT5*M;i`?-H>n&f4n_!IGl>cel2G9~1keCS;3Yq~XjmP7)I3I<63>u)l0tI{iQEDXI)YQjA^jMi{>?+BLuaHu&VDqo`q;)Z$6Uh` zr$3*+bi|9si<+(L{%YsU9X+=0dD(L6M{fm9(go^V1__1eoGb=K0+V8?zeFdy0`wle-5jxvvpm()q74T?M z8DC>o9bzTOaUSLqw1;#z8gIq)`zUMu)~N@@Q5vmqmJ4@NcACr0)f}# zH$vbkp^zEp@23|bA)y2H@}Z`pGz?SmDV@+qGYpqLateb~q+-+-KZ)Qve_-vjvGEXz zm!X}HwcM9Ec;zI4nIm;F+En7PDf0!uqn1h!QcIA9jYg{DhQE!lQE5uj{x_-rV@VN@ zAfsuPa|R*f1;l0XtwNf{x#A2a?Z9P12hL%M4i{PI#70jo2UnzJz1-Qoar#$<|9J?# z2xfDT7Eyv6=_pJe(cpA9*q}PHus1W5r9z<2aXy`g4MH?*~3Tt<^T3|D;t$ZZ@PwS;uot-2K-{Q_l19L@k>K@X!q13^J%*IqoNAd_L3eE@ri zW-?QNNq8(VN~myKgUpN*u_nZ(e*zSs4tq>px__%l8dSLXP0tCtM}4{Bo2pqGN3M%I z8!$8d#nPH5CzF&aC2&Zj8EBmc^hq9MLKrEN6&tB?v4IT1kh!q}3fF%X666UZ35Ke* z2i{l`xdVBu-y}J2JLEGEn*4xWUBn`8 z!YcDoK;V9;5GEp?5+6Dk0mBm@u)JWe-N0a^YCHGQWCE4=0aN!Y0gt44!9ZuB%wf(aKgp^jDx2k?3G|QDL`*d09gkozchn-q@-Zfy z3#e?jSp(T3U^Q73>+$$k2b2=EcCbR9ECA;ZdB84C{nUgszX?IK2c}7SD0QJ^vKD%2 z{?{!kDUd$<7OsqW(7e(8x6l-%QN^k}k=0wE6nw;nTi})C%MV(u*bzj0lq3*xMT%rq zfdU{^FaW=Bm){hIZ-sam5RyB1kiV&e1U8qKf zk98JERR!j^?^|@Pm~lGu(P*W`!IhQB@xUOM#h}njJT_!YkIC0T>M8*dW~C3}K}-sW z0l~@@8UHIzX9OTXh^9?yG0q_uldMStq%f3|$&7ZY7$GaH1!{`1NwV7N%J6$+)N0T` zzK}mAb~jGXzkg-*EleWY4+Ta@G@r&rATuQ8FqDTvvW##80287DLq0GA1EW@XfB}ex zZ{Us3cSi;TrQpz9qWKt~hcT&T6EKYT@O6w5@;KQ@WfWxClSSl#uj`*NmqzB9=Y^@4 zt$8%V0F_0YR|4#!{KOe#N^JOe2nfMQ!{qh^9Ft)dP(qx*08@A#hz$-74PSvFER;!}IIurRwcj6H;yQyRd>&I@k1?vJQ$qFiTE*wu!s;@uN1RIO6Yfn?YEo=w z7qGgH6-MVEsIfVu59k!K6hmXYLJ|!#XGW9l0T)1uLPG~r1mHM?kRAiY&VV62FpUR+ z;d@|@Kpq&2Xq+sNt}u*cq3Uw{ff+tZb%JVQ7l9d*0HwLw!CT@gHqcczWk5WzMR)|x z)jTsOQ{Ys4gu$_ek0WAJyC@$bJ%I@@3di7t!7D37Dz>(X(IY;K!l5?e$dIH$W`w-O z4gr9Ok!Um^l~3!C7DfwcW-u+qf(xEksLw8HkyxfGuqnGdD_>GRZh5oYH~MW%BrmOq z(3z9Y*0+U5vaf2bi_6%tj3P2cQjItb1%yL4A!lCW-7sYFuZ<;JRq-@=U$JP(!YPy`OCXk z{`{&s_l5!IZxjmGvEs}m(4mx4%0Tu;ILS(qjV@8jJP0;BR6!=}8Z&a!QYH`h3+(Y< zpqun0O^Fyzi|C{>Ex5p)?@+ehU@GIzo^oP<`}BzsZsPC8@^>5)}MT3E0^LMR!P%L5_efD5kx8H79% zy$GoVT$F^hZb`?U=5WIfZU?ko5oL}p z%2NuUoAeNIAF+B4MU$*5)8KbRm;le^N!G{5Hn5mR!twHu#VkfDMTvM!xCF#9BKX!Q zT8+pME_cKzl>~klrv)L}&B;~1Lt#`~)09pTd22Q3Qcu*FtNOyGx=Sl;0SPQDDn747 zQBc`xeNl=$vI2}%DS5>Tijg5%MXePQRK$S;+W{TF2aqa}=#z=jEDJUTiM`n(n16}_ z5-?;_q0V@;q!6dhQK&KsxtNH}=Mekj*fL6~+*Wz7w6}X|>)@+PG_owINp&cRD{@8V zTC65u643y$n~{ntQ@87FT6=YE)SjryoMlBdPp8c30jZ*58ANEo4r~*5fl*2tep>hV zBXMrw=EY2;2SAH-kWq4$XOR!%0fY$|9j0M8ClOfFb4~&kdzhcz26`Eb3w#^+_k15^t|NBtM%ji4{LV&@#+2RVpgx3)v2C5{@kRW2WlU( zAAi^AX>0o*pSONW@?Rr)TA@tIhg)LhCotgkVKH{ZW95hSyL1X#M-oaQ^oktPmIPs> zt#EFn1?uA8HeNgye||%+bAMFT{FLB~U;yE~lSwEX5>FG9r2@?Rw=_Li4DH`XcwCMc0^*Y(*u5jth&*;*&6lZ{3U;d?PxG@`o}*Rl-IT1vA@=jggZiNtR(rM6%;Zu;UQiP^rhWz2T(H8IMbzw(fZCg{s6;W{5O{ zBFjTE;Mizgrd7&8B`-=6&DPJ`ykLjs1KM$_+y~3oU3u!k*~Gndww)eXyszHnzacXMPqhBS@%`t4djW^jJF4;W4XM<}yccg(8^@gmk zIlbsIy>98ezGLQoS@3VeK7K>?1I?&7c(Gf>tuspp4m!6ndzSWWPZkmQ<-e~t4Y!?o_T`orPiD=Y_Tbq= zWVttPTHzOqTBXnFdAiSYVbJ-bKejKz#3}>Ls^88CNk%QlM1rLeukKfXj1YG&Z*JI3{#J+=JitXW*nUL2k2*pMI+`_^q$ds>duO?fD0oBx9nCGU$4Wc$x&mXE-&r;u*aB+F~gs~dew2~jZ=^Q zAtLU^>)h>g^UK5g3Qt#GnAgAZ*~@M(U%c;YWk*b^K0mKv!XYp47X=tQ)5__3C!ce*U&+^NQ2^Tg|&0 z_fz4+!V~is|97Z9{eS=5#*KOX_aE)iVs?D5^#$Lx*tNd!!Jm7UmA}5#{N~6t%cEZG z`*OG$GDoK{gi4S+Ltn-LQy-Sir$>KG93e1Ibf3Gq;*V$5QEgS-cWf{`c|P-POycRr`5TXI>AHS@m$PRM z|F7J~dosL(?zxpgEoWcd+;8}xf#Zgp-aKwo&n7>;N2O#Axo`w!^zpXP5^xFPW+d~BWZ=Ejq!h2=$0PW8Y0azeM6ch9|A@b!_q^QY`? za^r1H&F+dt#~uogeE-5@2ZGXM@I4R02GE@9qUVjvtnTroI{Ib)+43h-T83=>c2e<{af9Y= z8)iILXgOG3@MPN--Q=7z5l=d=x^O4z#kQ!;-W$DY&XwOh3do$ z(=N1}T2@i^@a#923o3Ss_PpviZ*1|cP49k)nAvg5p@hfZtl9hc)bd4>7Y&%vc1MrX zD_4$dvHNuP%FL0=-_>mR?Ctyp^QzCjtC=5GJtu45t2evXbq9bI*1tKV7IaIV7M|Yr zaw?iS_D$<`zbP5OT_)6gtXOC!02z`qqwW5R59E%g23oA9nw-?I7U!#a=iARu%FNqy zenY3LM-s5gJ`Vy{YYNmxKuf5N=cLLxWR+c&Z#(x#-@ykEYOqp+4QM*^{rcvGL)Rj7 zKJneRZ}zs{@&R@KW0C0MC+SaA%s2J5uJwHKRmin^C;ochchS7Q4g0)!xc7bE&tL4l zbaeLml~?cHSs8locN4b(SUJPyDA^vu1gu%Qzky!h>}`BUqU=}~9!{ilo8?0>wV;;*c#t}&n7Mu%RZ zj~g8LLMK2nPM*L{EQaP)C+1o6gEt05m@UrI5wY)H z_dGK=`Q_SZT%bUdf%rCU*fm{0EU<459RubtQX0Fl-Vc|7<1ygOCz_N*UVJtwxP<@;-|-=9`KU(oZq zb4u?K^9PPQ{rz4>QY@EYSPESkO5AOv(L8pzPLWySPGEw= z%4f14@9ER`8K>!4%hKn}-7k52v+stem-~Rc+;84r7Dq;3f4k@17d3M?RJ(vMyoIU$^xfNQ0!okbA~V4--JD^(E&5pp!B2f@m++eOP}SD9STurVg33 z=0V5r+wN+Y_2h_-ZKMLx2d(WW{dPealw~RpCaaFCW+gG`1DZTy`SrWP7xP<>9K6z$ zO-Ecjb8Ob57q6Zbw*Tc1!R!SKmTgG9`0eBT-{xnLQADsRU z-`5A!GoyU}<{ws`dU%u{yfb0)ygu_lMmQ(#e*W9^`=~|t3u{h2P#cq6EbZrFnOso< z9dlr^zBoLD(^SC*5};~t7E0a`tpTtW`P24o11LX1%qW6agt z`5%#>W0r{fwKIv&B#6)BIbdckBQw`$p>I!BRXQpqAiO-Jr)(6QxYK2+?&<|HxU+!x zEL*+4n)e6(Y#sA2W9zstHQPBmVC#jMQ8$|n9Cx<-v+ji(nx7k4Qr9&iX-!yHvHjlX zN3V_qbANkYGxYJ?Utn%&N^*oDI1Nb4M9`o40l_64?%2aLagcBy5pk-S-kRS&(*a{T zLo5J7keNiLXiX}+Ej_|hN>TaHfdO;GT3B$isg$+}vlu{t>_ELSnIF)|nubOHvY0s2 zlZJ+pD45&o+9QOB3p;P@yY%Ms9jBg+EPSy7+C`q53!O`yqjHi2q~$zRsSczM=$ivU7&I5TlYA05$*Z$v!T!5|2peV2 zk0ICA>;O{wWgh!4^Zx##VaA+28)R>9_AW>2^hm(7xBD+ued*kNWOe6sPQL9kB%2I=51TlY6p zUVT6Z-u=D&zdy7Nex2Ay^XmP#VfZXMd7KBw0C*-QWNK`&4)$4t`5wR=^f98*{$dCE z)#*saRXsi{3Q|?)IFrH?2y-;-9SJ@LP!+A*4%6rAqaTo|=1U)E ziIN8s=}#|00Mjbey4xRb_C>ww1qXYw5lzH$kyBt`Nr4laT***U$%`j}h?XBn&klge zrvfxJOi0^{q@vLHvH<8mu(seZ#bzG5D~txYq&r7Cw_k1sRA^q2unJDPI-I596JbPd z!e@LK6i!iQ0?`OIS>WO!K1?9ZJT2aMM?ykPV~7XfjC8XJ!Nweh=IliJaY~6lH0{VwBrq zQ&CwY0MvvlVb;lHF~Yom07Gl>K}3m158FoA6gX>!f;|~>J8VUVjMjl#(tbg07iruK+YiW zpGU~5*dVJJJEZm^=_G=OEOs%WBq3ZfD-18(VxU7F8>v@Y`6$__My?F#Wj@U#utdZ+ zioA;Le%^+(j)b%h|HLP-{pnFkOe^ByNSuVctV@lNkX6beI5tThGQ>A^<$H(_BQ4j0d8b`V;< z5q8rE40{47G@j zXci^2`EY}fl~Bucd5zj8>>$VW1TK!jMzBi(w~QbTMQpe2fz4*hVgPk3#b zTMVQsbRwp=6sa;DGc6{3(3d=aiN?X9lzD>M>SHd$fDHlhmK)&|csxxb!zYrgC6xlW z#$lH@TzDG^&?>C;2|^4dNW;X7M2L2LG(`nnx;a#hn+5<%GUV~!!4V%3*QL4KVIe@C zOdp&c$4UWo%uivU6sRm{XSaK#6zq0U)|??h5mFE_8ZS&E4jp7**U97o(*UaiGt%%_ zs&*TPz`>z>EJ*@(=~_#8r2GH?MQp^7-BDq05e(V-mosCRdU{_j{uzgczMXaWV{RVGqOYIu3)2wl*k$ zKqfw1|3K?Y8JKvQCFX+jAf1#U6ETy7gu~NP0200-T;@h_dN42);ZxY)3kJ9yEc|uEanh8(~ zvWYw%oJo@Wx?Y`%M*^pcLSvnH*uUnhGlP%xQ{vSEJ3>f~eQ*g~wwZAoU!CCD5& zm*im0)GB2Vm1RIE2bHG5NnGUd{L?EE;b4rAASSXwwO&bwo|PQV(1A371>2HtO7^px zXo(NIMeXLW!nwtiR$w;>$l5ek9nS-z^P{%bD}KygMV=fPoN$p@a`_sld?5_QhZ6^+ zBb7r6_6jBwCChSt;n9d>9D+z3AO}!wfHK1%B$>`)5$vP{h#1%M=3D|rDbw2X#P$@R zS)IZdVXit+GCcC`ywgI|!(SXEnG0!ShpaoDT#z&@A}G zj1A!~z-uHQ(PSV3w=_~{DYa2SlAtDO@qt>mK#26gGC#e^@vudU3*ir6VZmgmt;SfO zP(`4WbPlXzbGCa~Z_?N;m}X@sq3nQ4GGmg(=Uo9R0-@4OXbk`sY=j5W7%r&E3MYgJ zjzkNQoaE5L3iXi$q2OSvmiJ4eh3%~j*88M(stC7iPO-gy3@$#YxbkQ$c3@equRI6w z39}hh?P#SLOSa=S?3C?<7NZt8HqBA#Wl1;bghT9>R8AInuoZAI02IV4Vo8ja_J|My zwYWI1ybA<2z#FT#0AZO)X>O$Q1S&(qw6=`9 zj!Lcv5@cR&!zi<&@^z|1K7S5{!4ajv5UVgV30ihf7MX-3-UHwf$YcO8Tr6Y|xQ2px z9!bQ|G}654qaVIE;B6HAU31buotpJr`#Tq|0 zQ0MitK4=unc?t9xt2)K198iz_uoVy!f#57IKU9sNx*6)I0qP)D?^|XI%LIT@rIedsOsk}#}!#j zLH01{^g-jhxFV$0hK-u!U@gGQ1UFf0&QH`5=dfOvRv&TMvJO@}2*NQ6>?6kJY&Z`1HG!{IM@kInw-yGp`OpRsxOrFeXflW= zDGv59T(kf>j4@>D*iLqoTw>%55`Sut9t=8VIpl*GKCq1;yq0YsUQ$Rap!9gn3&HV4$I6*s!gp-yN0U?IiNhRhBM)|faU!RQk+*T6mF$b z3S|6?=e(AzTC^Mmza13*%z~)`#;^Z~&za1zi)y=gWY2 zumIMnxbp4%$2l%srufd_#_b@@v5Kh6l&ZMK1P{jqnZ7J0uRL00mEcYQS`z_>WPhlz zEQe7KWpVL*2xPDaU<9_XU=0hu3`#w1_eYCjv2)zTG|(ST_3Vs8TyAlUtW(;U^O)T)qLAltCi5m4=v0(g=Z z2}n1HEzTSUQY#2JnWbDJ6-+KckTY_~u8;8o^13IEDzE>Su5m{3wy`t5DX7ja%Hqc9;z3Shp-l1{C8%h@^nHI1PTra$UC3-E=$YR z^V*taIiEfWW-s0(kQN~jEJ>*b?m|^Fppr^e(fcEu6CtJ)gl<~wUWnD zi5tuWtdFIdGEiSoDtsYWVmRDUTBc;hfIPQZ;_>0Z;y?BPlpszY@r)!qg22T~zC!4r zdAv-JeR`UgOrJ9+va zVMoQc5kbBIM?=&|Ce3m?MbEalQP1xb$Z-~!^~5sjr}e`_0c3- zdK3?)S5}Wy6Rxwz`AI1A%tT4kK(1cMEH2V5l`>q`SzHP*37$Tbz?>ENd5DLFkA%nP zGc=z(0@Mio1M3Kce-uNf4RgV>SYgQ=G4kCDBey}|Al1~y5?(OB$i+z@KTjL_xApp9 zQW2=^0D~-P2BiLZ6Q`Q}G}JV5n7?SKbB3sLJRw>gRDBp$+;6u9X>e7AV8(-9w3e!bP(2)W zMhHziz=^vA;3$>?SUX@qo~`4vLNT<#KuGDloD}RP{-DB$*Fb%87>sF|ZrC zq*2BZuGU+y78-jM25k`*jZZls7m9rd_{6XwYN12rM?SK2p#)rsh;e0x1 zSOQ3Cm^qsYvM}&0fDrF4knoVcka8{7^Rey_Mq*~-h(O`24PSB*S4RA1eWApXkpnr& z91c@Nofyr9F9Z*}I!=Po0oIIC*}XPe1|p~t2%=>NwP_^|dz@;O4gL)y0ifI~5UAYY zDgnwfo0UR=z)T{KCYSS8UIq_A&45P{=^!4TXr`x=`Me(;AY4(fwyxIzU_Mj}^|0D{ z;u>HRf>cw(aD}4-TyFzf>~eV&1*{DFYsG4q!5QM@R~+7J+3`v#^o7tDL46Cs6dsk4 zmg)0^m_QR?HDEdO(JnYuE2IS3TmnLgyG+A_AS|n7oHR?zS2Rh6k`~DaFOfkUEjS`| zq$yMlk7ht?#_FSj!=-IibTCZiIG%zXMO=5CD_2GVxMER>+gs47;5;}C`VR+a>?AV3 zJLYmf;^BG!VXE{vWtK^xhLofzI2oP=vMq%1XtgH9WLa5E3~f4Fg=g9qc%pT zKN01N84)ZePS&cS1P5pO3m$IMT+5}{UrRc;7i)Q57@xx4!xC}Wsam@Fw_PW>8soRC z2-4!8K!WmCWv0Ny!QvM1BoYs8_TUHh@x?+4(h?nsvV=|SBpDK`<@^P}2Y(eo;s1y) zJLj%o1C$nyLxCJz9O~=qi!Fw~#{ItcKh59oy7YA9S2a%;wOG_A<@?|kSH8X5z4X>` zqC9)0YtW=_-y!1V$eoX`%~BR4KA?&_ zSE{>w^XftG>kE3gr z;;ZFxRlm)7`h3drmHv7Uf2PjMW1BbUUH?C_KAL-a{roz|=+DaM%{p7j`DNx(A8HN% zJYH8J%+l+SJc^`vbx<9=9RAnw2#Kt&NZhD#$9h63{jE7BsLfaHJII3-ojNmVUD!(a zxAXV}sC|mGO|NX&cDQKlwjb`#`9l1nL(<@DtCOr76w}5Zt^a!5?z1!8cQ<~$GG+Jr zxL$c#rUhruNv`i6q!^k$(beEm?vVc577Vt&sz-&LYatDe=%96++}(4$bm{Xhd0iI2 zs@JRWQrGGR!#}6#jSak$S~Mx16uY)>o6UosuKfO0r-$D>Y+OND6}wk{b~8P0 z<0bWP+TFGRFH<{5?^zhr$- zMA4~k(x3q*&#H_G;?x<<4tpJ$4+SMtY-eLGw@FWpEgze7WY_SJ;)xjtI~`ANaHPc9 zQ}#%nJ;%1Z*ECyw>9T~9O=EseFP=117C)`gvV;_sYesIEuJN7sji!w()@jB4luNU` zl=rvPA={_Q_F7-fYMbBr-1N!1xxKuT?=7F@ZWEgkD$}f4vD+FgjUDpsx+YyiT68wt z>aAF*X#1IYa8=Ya*TLe(r$6sEr$@&VXVwo|{CxVj|yt6RsN2iH~n{pGn|DmK@h(XC_d!F7Y`Kl*mukcB<+@nC@$u{(Pxo?9pjmI<6{STfX@I#D9G`aPjSl;~I_Wwx;RfOBHR8PVLe$ zrFiYXzf3G%Q(pf@{MZ*?cU|3dPi6W2qf{>PX94^IB*`TwQBRn&hpaomtGJ=WC5{oi2tH*Bs| zKPrwbP2J}nDEQOXk$JYd__uu%EBpRX`2EInt_w_|?c#!(-S?A|RVQb{nPNcV! zE~&q5RjX0W_1@!eFYEI2-p5xRySJ_Sw?--5&%U&{4pk;>s%YA8cK(@n7w<1=Fve16 z@%!>gA5fha5zbA&x2VH@+kn{m0r6X}E*0E+xwONwhtgXu;+nnr?n0aUn@+Fo*lGve zdonZo8vAM|y7gkwhR#17tFjm(Rq6{e$@4)?$G=kjk)F4;|HN~#3s!rw!=$Q{Qx{mq zbUD;#@%>dt)7M@Z=z6flG^OTL{F$K@&HtQpa`Ghci36Dn6ZwVZv6?}#Cx5Uzle-vv zWzz#?=GBAD87EF2Td(SWe~au;MzhqRp{p%3NyYfw-Xn##O6m{YKIgW{5d5@!M5}iC zS8dKcN-eLSvu51>mACFTQXN0_r}NR$8I8-s2Ty3;CU1Jy-STW@YI3=8#fTr$k3Z;k z{zA{BeG}~GpT_XNNo?|H>s+HM#2DJ$J@rN0qCZ!}T&T_wj20Z&s~Xv*^ZF=f7qhKp zewTG$A1iOOcE|_RaoE@Uz8@+Y9Np;t^^lEc%9cM<`f^*|?)}Y|zCC^NH(QFse(Lom zujR7blix4<+#26$_@i$#hP`igVeq-l?-R~6kG=BCu`Zh>qGrDzKdhYGvF6;Fs>SQN zP5xj}Bc3!&|1L}7lyDqmu-hisJOCLS_ zzJG|SwCB<42UZqeXY74>|kWm&*iYEi**7%G))FFZ|D)k)rg0 zdCTv%>y?r4)!K2*UJW#vng)z*f4gJ&?6?-smAm&2o%?98dDF{o>n07!&~=w8J{Qgn zzP@AjhWBH#(=Uei4pfeg$*5c44E%Ff&E=fFWnt%~QQfLa+70Ze@?J@Lo*nhHeB%Dk z4f^9h@3i$Vc{}guT66iGeG^k_{%ZEa*2yO`p5EH@xaZ*hXZLp*Ki<;M$i&B<3Tj^W zdg{(7sbWLT)yOZ-y)a{vOTcf;|r`=L9WAphzIgZ(J zYsR0ykgrtji;6s7)y~=A{DM`(5;omkKCaK|iT`dGKfkI@Ozm)Q}kt4g+vy_^5FvF38~enrvWZ?&9D zpFVSM$cu!n>1@@mN!5A!n(JMRxjVjE(k7_!o07IYN(z@A?7Vip^j1W6)Y(=U_qSwU zPG7yDbEgjaso$8EC~u6<7iT|QBj4QZMBS>vf>(oUehv#$ZIn)5e)nq4<$AKHaixnF zbx&>Lp3qSL&9#J-Rc-#7o8A6MqxSZzO4Io^RqLm3dNuCWE9;cArHcktwd`q}{v_zX zKMoeR>}8z(Ea>dvMgQOb*cWAsKcGqD`*a$f)2YgvaCgc2b^Xd8jDB>^YJ8CUYOCOP z@8M(AGEKYK4NXIJmZYq?*SFuhcw+xMl+(Wa0~%l98MymVXcubswZ}~#e^>B6R2I-R zQ`=9~ORJK;8zLB(9i>=LU(4$?d4=*>9Xi#yHvQ#``08`(CyxJa@8lVUSEpUB@ZMVR zPI_bGJBd9-*HHMb^`!Budm3fT-7eX?qdQFb^Ju@G>BB6?`*$1vYPNi~^UlGm>AEMT z`3q0Ks#)^^6*aORUtgBHvzR6FWUVEFC$hSM~m+8AD@#n0e{J_=~}9 zyZusd^GJ_QdEX9h+VZnr_c~oTTR7f9{`!E5{}l8cb-VSLCr3Lr9HYEk z9Ne3`{mTAZ+a z&bZf-JoD2Z*ZR+CZu4!Unr{(Y%zSbx_F>N!S8}4GO8Tc2Og_FM&{E9;{* z8HeHLNYw5=(l%GEd8Laq!l-q|D_atjNAp%(RU`)q?`D6$HF#}NRPgb`nf@yCe>(c==80Ahx<0SpbMTzj zW4FcJ)<(QB-go*5)6Y$}9f^z1F|12(JF#s-?!34y;~yP< zRqwmFvCj&w^dEArDzvX{(ussOjW?ca{(P@(%aON|f&F><2PZpE)5i|*rY~LmYGLBc zt&10LjJwd!R`O{5q&B-|wT+n4+g8~7RQ9S(Hzu|Dp(5jZQ)uuiab$k5bIq(yy{^ug zIob7WSBHTYBTuEJHj65bFI_Y9m#QVcjrebJFQ1XAe$i-|b<)JkRfCSZU4iPw`9lMH zE^pU$$=IqM>$7hxZFBcz&8d@R6Z5uNvsQ=gm~OpyCBI+A+3)*3fAWp3X}?nii}T~o ztFLz4`(qfOf_OS0GO?s<7gkbLc_*}k1d24adRp*$N!rl{$ug@N`zTT5Td&f&2uW5BgU;q2E?)8OH zbz_r;-!-)yB2ABI6A|8EuXgvL^2Svy&g@EWkXUdh;rz+=rcLKd!%B8fk$8=Tg1n?9 z<0Engb^dPO1UMT~YtriCFD`tuFm83;qxL5brRP^x-1_;~oJEl*JR3sx4C&gi&80&v ze;g&)IK=XQvG>+-bu`U_FbM<*?hxGFg9L)h!QI`RgS!TTySpFs;4VReySoSX5ZnUU zljnJ5_wM`d-hJGSKUuIZ|-sp{^Tsp+X<5)rSp12e92_^d~hWu=SM^61fy z?Z?GLspYST^BMx=DhiButS>)I$LOcy*fS??@5Q1CF2K77`};3(Igi0nVHFI`;}@;N zz6gifELGc|hP~Z0BxaA&(5(WsM6;%r3LS&QF_AJCIBl)YOEDi_K8IofLOA6Vzy5-X z?YKDV`MS!mTTm#STG@Z%=(VQbjQbx0;6DmY@Co`o)b~homv-2(=tM4T-?aP(0Z<=< z0h9krjc7Z=Qy{^oVFq#OHoom*>Ey4!$FqF2GL=JKi=r+qeOpM$GOvx=mk9Bg5IYk& z%RUSlmE#ahMG|G3{^469X&P}|Y#aX^zQ7{h#HBgv=MbD)XSb! z_|uum=eGpNA-zU5OSWA95`bH>#|{z9BN%cPfb?0e(Rtnn$T@(&q$9SzVIQoc@U|@2 zg2Y!2yiet`cK1AH^^kY47dOAnYFEN!KqG|@CfmF;Q@8{KTU%G-tq)J)uS*k?fs+Ok z^e(5)QdKW1C$v1E1>dJ}*>!Jc(n)j5$GH7Va{le;{*AyU7JPny7vWed)7HZ4M^uHp zKQg7%R{}$(0~dtWjr#0(b%EO zyanHKbJHHUq|?@Kkk4e!-b|f8i%0u6tx0u#6e$J`?D1Vnky`a7!SN=YV#GS^4Z9OW_r^Z_g8GA{{Vymvi0^k!li&&1d+XvOzO&YD zE61yhy(>=4{GIj^o(5F})3HUpYhz&XXYr0>i&M8K-!(m9#XEIAJ8pvDu7mb=;nSbe zq5j9T9~q3j5-8^4i3`JSC?(3s`K8d0C1aJvyb?$woY$sRYWz<`7eXshwTT<}Exo30 z@=t`JiRNNc!}xQ<70-PWw^1#&RX=W;-hW=cPbTTMEoL-hGog!oC#yMPJfMQZo>rUG z9|b|8o6ttS6Vn_aA5g+!535ZQk1F_2h5U=0HgxI7I3B~)0NhdHOtawA`GjZgI;SPE?L zm>=KV!8aoZ<~Ltk&`-Yqf?8>|Uy8L~0by;FW`JQEt4ks8jB&*r^%a(&+x0ONT+AO+ zM#b+ICdE=wCi8@4ZXU{w)}fmpJF-Ya6PBsf#_P&di_Jq;oKrd{yVGTaI)O%NAx~s< zhSvX-VzziE^!`dKH<0<8_y?25K3bmI|gk1z-ARuR5mmbG7c>0p?L3HM9MP#~t#G8^Kre{PxP!HlAj`S3Be!DLi=x-AVhe z3U0k5d6|KXsd;)oTu8iZZ9ZGwX^>bPbO@deObV%d?=mmB%G!Dw9NcAs_|VWV7z+4* z)D&9KzeVHDGnI}QdL>!NXGHW1iqgGAmxj{Ip2z=PSV9xI+-63^ z5BqX3E^q-y@}{sIcaK1G7?cJw{Sk2m@*2Y~nr(bSrI zO{w!W_jc1nvyJ;{0IE++o;F?UziO8U02>&%XKJywq*kxJ^M%IkW0(UexH+(OT(NV-h5r0UBsGJzyfF&a>h@atJO*Cl%# zY6oXfYu*{DTk@@ikB3*m4BJVCxEu|X@F{&W9LKKkDP7Qe)V|rJH0>VLbBmh)gFcTmqxgDwObm>Xp&JT+53i>m@>qd8 zwLC?|sJbiMAx9jh-)M8UVsnk;B4~N;3$C6)#aAA;X^Cq%$>T1t-voE>k_J@(-?mm1 zz*hLIOUoKp5|cmkzRj%9yEkDH3E4NUp9K-VleP6VIJ?&7YB-|6IlD91^!7cPV4)g( zhK-W6Ty=6lmWQE779x7?QPI{5j4{#6x{u#mH1tIi-$nE0SJCBwL^~@bo_vrisz$lJ zYl!76aMqIgNHaOFz*afpzow822@$jVh72yS&%Gk`9CYR8&LNR+4mn6G>f?6S| zx5fDk1Pj+EVH-HZnj69Q*6y5*N#9N7=YH>&-*1VvILq*hRl$aFX(injD3O?1n239B z+?O$-a&TsU#V04q@ifenA1Qw**Zn12BJXfTWX8GD#16r8%uT9=+XXb`c8OWd5?vGh zJxM`y#Rmr~%l^9prsBAjeFB>buZWw7VaO+cn=K;ZA~T+gK*}t?dcb7U6xyn-omD<2i?Cyl)skIPNvk8>*) zy;`*F5wasCHzzs095$XDC)9U&{F)9R#R0$01MC*>t-^$XQk|dEQ+1Gw>k5iet2VM( zH+cH5sr17~)S(q}{1-P|5|7^P@RUwRs*<{D)jPOsil#3M>d7~A0Gb6yc@L`dm2)la z_i{QrZN4hea^5s}KZ1)LW;o9XtiHo|mK;Gh#QN`i?^JZK=kUXOG4%C2_e`WnfyoEa z)&!gTfk9{u1{>TuQSA9)ITyP|y2R7<#NEW)mDrPJT0b|^xomIst5&CjR=)}UxVuV; zeOb+pzFLpyJnF~WpTK?aQ7L{H@bhk>(Vz5>zo*$Ws5`%m5PAR31^lhwDX$nju9H<9tJp&9P*v-;pNQ^DHh0)soAw++q3KvIFg^xgeh*y z5nbkv5wfCXMN*nJjkH=Uc)94@9M+`(l`YwrJlyMHg16|s-B7s8Z4!0%F9}jbrKG?ME7`mo`p7p zT#8>kU-*%85%-Oamos>Qg)X{8a?`HfAveoN_>0d2nMYiMaoua%&a{1I@G;WmHkI2jVtYz9$q=h4dr8 z4^08*M`U|bYm?$L2^2sgHmF}x87r9L>LtPW9Bhu?(52W-#nBs5KTWZ`jj*ylyLZ^h zzpoxO^=&6(+8H*Aq^`j@1vWe4o}i?YAHActYjK|7WP|UMd}rmwxcI0jGP-JK~IiU`F`g0F` zoax=97k3l)<70_|s&Apam9;ysg}W1XoBAT*&R6O+Mb>XBJi%WQ-#~Fwo;>*~wL?4{ z25Rh5Je7fNj2+KEx^S)p$LSVtA4~KJ-@o6a-BiE-{tB2RcZrUR6ZJy7v9x(|9DQ?6 zEJSk^0Bzq*9MAIzRZOHgfJqi(Gy-Q@Ny1j~&P!za3elYjuPDDXjXAde+mR+g{Z$gc zfP3Vp&hSOjhE>v%O*1u~^V{Vga_Ar%r)!~&*`x0^1e*2p1^nQ#S|%^GhHqvd)A-q;q~T&BHf3U07V(AstWv7MGHS@GF?l4I?v!tZ3-h|shh~u5!**HY zGW;9-h#BDtl} zMZMQs!)E{1-Qe{|euV4?BxZit_-yTAxWYGdDKrOr!C%&XiO&^&aV>ig$1OeWJSx2M z>f%~xsPyG6WE$i~?>e7ApPoDAQLsJ1Z%C^o<`?15+Z?i&NGPzEn!EC$4N>GIJ~3qBpy0va3Y+6*F&RQqBwA}=YZm(ZR3{svJ3L@efT}{ zLzzw^2Yw%lRpCgZI(S|?zc7&`L6hE9U}KAxBZadU!=zz-C6cA6D=h&R^ke1hAyJGhEa*qd574;qZym#!DiFUux- zU#l%61rJuo#)3D1RdhN#CQ-G7&5FStSRx{v#XF<8JQm@k8Ib zZrUmCeNai)3FZg}Yi`qSRMgIT<9|UVzM%5^P=My&^NOC!1(zsc3iR;#Ds}F(yA2jB ziG;&g5Dj<|;=VKo`J)Ex5^TFMj6HpcD(#e@fW*A}N$hnmAptgb3EeFE{w<3}s*sTx zHHw?1uuJ?o7yCN(u&aK%GvOKc)<VEMv8$}jRsfZ>Q`+TWtzm+Fz_ z^uGE}lJ4UzLY63HZMw+kw!d)xZLs6?KeTzxTWldoznW3m3jW_`Gc0w;J*>)ue{6ctef`#r_4tFn~vizsGYIlU}ad>o?wIoHpP6gwS1BAR*_%? zEIoQGTE%<_gvok*bMFKYtjTiaRwZNe3YwmTTy4B=`VbwzU+~>dnt6ZsQ&)QY4=A1s6_nbv>T~^QLD0a4$gK z&J%nk@7x4K?8nUX;K{Rqr9e04j70SCljS<%+hn0%O_&0dI$;DWI(?X^&`)(pbec#^ zCM?JM4uwFof*3*EvL78v>i`~z-@p_JkJv5NHv$&Ls&}^B8h?y1_gc28(2vD;RfQ>) zBtpP1JSB`^>pT2fNTl!!#aD{@_{tv$S97TL1q}-n76o<97VT<7_<=M8^D5f;?F3#d zH*ZtY2*y-gX;)**E<|Rge||a^pVvItIz%W0YNW(CjM0lyyt6?i-@*zwucwru6~-~x zR)SLIPlH&f*o&{niW!RN(A}&2+lGN(w&$CMXd(f4?SUJRKfNG4SFYc7vvBkBk4sfI zZRU%+2v8l;fPfiK{x*s{3c*J-BYya>B~@eN%z`PnFDfqDP6=?~<#q2~FTZJ`Cs1m-@d%L=2P~B` z%qdPoc&NQDomT>b)BxaUHGD9qs`Wo8>ZmrA0hL#Z8fC0g=9$3%&Z4w+(im2;VbS|H zbZK<5-O}a=Dy+)sfqx>oe@*JGOWs4 zfeB++|5=fL)z2St{x6jFPmcYsIw zJfj#Y`M?q9=Dc#DS^tXoUi2$SqUudNX-pm*n33744-!bsDx&bsM2U$X!$<8+mb=ct zz*v4z7|(eqf3s;U|Br*RX(VRc`@U|tP#oBwLODZT#W)>PaGMzgK2x(Dw>NSQKJ;g? zu17Jbq@1!SWy(vr*_%5bxA%A zXVz=t_KTU<`)YX2tzRGLyP`Gq;N05KLu0k`txVFj_aT#F9LV9@jQIBX5fgvk9er() z>928`2r_Ur=EmTHMx`je$fW1a)kxjz9`M zctn#IOuT(1_E`7Mi9N;Tm*$U6&ENp67`I+~2V#S>L~LU37?nx84Ii#jQ^MP1VjnVW zc;|&yPC%y@?c7zEeSGPQ zx_bIwP^0rIxH7N@YrI58r$JsKHlkv1{68Qc9PgcUn^T|jJcG{)y4rN-ze{pF_ zr`~#CY(+imWD_91T_Hi^8OV&xN=wAu484n*%O4UoBPIeB=GsTXe0`gtxmXV%y12#s zoYS)ew0ABj(>_>$wj$~yp@hv`55I&SeXchKO;r04=0UQ5g<&Rzy8}-cb-sNi)$_KAc9hCaVBi z4@0dxTW~DDx)l=$t7@~t?k+V(5eO>;IEH?|XYQJHP}E?=5&*&%D=lzWuZrgV6)R-(+i4VPs^_Nq`6+3~FXK<}bGojNFvc5Mr^k>0#g-Bw45O?GU zF={2X=G!;%Z1M%&GH%jxqA8>tU*16Dmra1lRWemma%h|Q(%&?Z*@)H-HxUY3g(%s8 zUxXUx{WQ8=FZGK)M#0!BXD3%Mw@N!D?a_^>B$d!`H2s3gFI&+c;(BU>EUL3hh&0~c zQtNGk=UhSNhL4$s8TlYw)gsX@vWs^HWoPf#FU^2+DbYzBo`GscimQdv0*1wZFRrtN za!xVL9@P{R{U!VM)x0}>=>gh~ukrUOiP0rQ9q2)79FX)>rX*o;^CdW}U&Sx64MpAN z>$=fPt{PB8?#>k;fQFE=AVB<>xW%4W(h7gN5Z%#vzT`hd~ zR&%aM5Cy0lRl!lV_5d^nv8S)&xvDzsU4GR@*Xv5~WAie~P0d`l4|Or|<8=FIjhcY; zsP%F0rU5-#7y%Lb`u2h(Vo-VBhZuOG;qZTwm4?uBG)lw#6; zLAgGU8df^EyTG|9wYWUpMc}jsL2A9uFrGqX8EIke1lScG~a@s_^^gYYmvip>?C=(~7VV^%JC!pGn;G zdisW?ay2`ch|-P~CjGFlIKM8j&){V>2pOd0UT07FMSRORpl}TV2rLmMMcx0M%m8#k zzsYU_#w+HniNy*Fqmvhj?pK`tU2&Ko9X@ztC!v2N%$_Nr36vGsQ| z6o4u)Obukfh#N;TAO#H5g+|zJZ?aRqWdzPjX5seSI(5U&ov8FKlc5v72Kjj}3jyX= zE4NofXi`gIHR|-R8{$MJq3gUofVUSwTM-W=7xX%|rRYE^kr~#} zuQ!tt#efr}3SS!(X@JOdd~?(vdX>=zXJM-Zf*lkE#S-6mfx$r>erDqEs}HIf%e4OF zaouIxj1Y~Od~WlB7qjGV>7AS>fJD&_EW*SWQr!%*g1_%Pj$81~S|u-F_y~=1SiE$& zO}2q)oBGr5r7VM!hhmdNbyk_k_x6F53;?GP0je#$bzSkjEY?yML@-OH`0@O#WNY;O z0!G&6a(&uA;uq8IJ|Xs zQM^x6wfUWAB44M2d{ipY01LP7G)J6MD`j#{k}H`|UL9yPiD8fs4~DNaKtQLtVkHF^Y?1O3R;)r(swn^qi&|h^NW5!M5 zYwW@*bkg2Zz{mjRyd1dClIGvR2^j} zU!nPSft99Yy~Ap|#t}DZ2jdQLgf%+-199u&HDo~anVe`UL2YF9%&i;6?dE@pIOz;0 zXHe5t%eR49?KEcjnc4}a=Ao6J94h*VE*Nq#1Q``x2cTIB&QLTwyyCVxZyOjGqPWe3 zkUdGmRcv?T@-NtWOW^N<;%McDpKFDLeon-20=E+pXLInQ$)eOAEafLCJ(50QUEDJZ ziaYQ-Psg|QMl7lg?e~3#aEaKHDZlmu2iy2rNtE~bQt8Bdx`sxJS0~HWbfG z`@;u>qNgfm*OFY)Wr%kjL-)*~L|fR4_Rh0v>U@q(?G)EW;)ofXofj!%>x=1q<67cH zOkA!$8};#9bfDk}(a!uUXTV}_H=?#Y+(8zm0flSmyV&4#Imk?++SVlzj|C%O1-N9~ z7Sy~rtR9kuQEC{ZKtj<5r1dLX6O&E{acKvqnh@9Io9Sylo$9vNp2$rT*2V_nXg7(b z2t1)JMApW(<1F3WROxHpKle(;T?B_%nhDl!`8lM-1ExW)% z4uvZ~S|^!0|B)fkW*7F29Qel^? zM5Rq}2RT2hvOgQ=n^m^{cv$te$`ithUgu7= z2k1Gdkr}C}sVNVE!Qe6@dPoiiYekWQ!KHO*AO0vovb=B*`u=UMnlR+YYK6MgepJeg z>L<+=(L-m8#Bx({ESFi;u=JJ_}GimDLFK@HL z3cl8(0GsmwOd4h>9Vy`nm=m#_LIlQ*y z9)#mRmo2Go9L-LmqIU zv24~P@^e-G`ra0I!N1}YQHH@~qXb&8V?=H~ZA+B*BmaD4AS(v|nN0rE-Tb|KIm&lm z6O0s^b*Vkn>?UeaOnoi{if3qV9ndc*`hJBYttib(w9oWQQ47s_C)k2T=4{3dB1q-N z@3q(6^HZ$i= z+jhI6>X?H+WDEX+Qp>y6Em#;&-So>yML&WG>OTz9QeSpn1wV6?hbPELp4RRS8S@+T zdwbS+1ce}d0GM0F{oDoVgUT-|VA%M!)d99OFs)F(poqa=C5o?|Y2zBeIJ;$yA=78o z;^F(YaiNoFG2iXn_J7jz99V>4hjHXYgKR5jy|2B&H<1HUI3z@9P|3*^7n-&P*L2?i z4{HF?U`ks!d-Ij{nGx0%aWOU+hVS+>tMi&i2^#SoREZ34>ee6hNPLZ5hnj{#3BJTO zDYbJQ*wJAo+Eaa0>eH3Oi>1fQ;QY8_=77#P9zmeUD^qn0!ecKH47kVRQcOe~dwsH| z-Ax&{7Z*ytim}wjs;);)!8t)!Pc;_EV#2O_FuRz^`**Nzq%X1c_x{;vy$n?a3?m-N z-A3s<8R~c`2Ur2~sTb8W;WX?=@#$6Nb6nQd)Po#W^gajR?Hw~uAw$ogX+&fjf}+-1wH?Wk(U-z0K5bO?nK}W6 zjXuVqVZ_3?t;fxBf+c_goK#+;*viy0;OzG*?Jd#qY-8RYmQ!UfO6z(FX3ts*(7pYv zANabS7!$p?@0eFGTjzLgV?;cz24T5F#r~!#gDU))fOF@A#Bh?Uj@~b*#kM*rT#(T) zGPT9n<OQc@lnsU zgcV@^GD|wXsx^y>A+R>`37@gWBRSHXl5}-Z+ZV>m|BO9qy+H$zE@Mu?qM-Lq1rqHtqz@?M>Ee|M91>go3QPDP5kOO@HS2~NlVINQZ0`9Wl@+LvsoSxy>Q z_o+{q@SE)nsf~I#xmfJ&>*He0nhQYX2>d7gh;Af@vPH{zS<(AG}P!_}gX_d}<2$xL= zm#5!cd>~xTAzXZaH`EDf=nm4*e^vRLUVMJ*B?qFHtKWM0ZGcIL>K=Zpjt`=`1BmMW ztIGdIFMo8Y|F!D=R^`7s=KnMr|KYF~tc*l{eUKq)hCSNjWALoO^7g|2M%m~Ba4<@mdL%Md+PrS ziqNsjN$?YceA@6U4d}VH7tT&&0lG(P9g_QK9R>R#`*Yl*>R(VJo1w#yyZY*#>xCmn zN2-&g#!>l|y%L~PN<1^OY1gcdCACLAaKy$ZvqNWh{dkl5T>XLDDXSs)-04S%DCr@{+PVpZ6b4a2`K*_7ly@p=)K?rP=ZCD$n@3Jnq8eGPcX zc}Vk9&%ol{!Ygb?(o;%eM5>*z4@(_@CqQAD$Q731 zxo|_J*FYjW<3T$w^_GzPs&w6dTjcGFzntUeN6XQl)%U80ZsqYmPe$=J!W@1`l!O}35cYSM<1On9#}*_RJgP{I69?%|!f zk9~Z6(Q`S2?{fN?&UX_k^ z|^1bNnlo26kME8XO8;zGT0*rf?ls1l;B7*`UJU7hJTCc0;x1?OGaa{_Soaj}lGvnJ zrxebv6{bpL+Ue)4f^od&s^Q1Ss+^OJs3zBeK!5R~&Yh&vI*Z&FZT30V#oL z_)_`l4xOrMkQJ7KCslP(%>LUNIF*9Qdy+MW%!=F_R_&>~OVfFyaUG4Q?j*%is>u|E z>S_b6B!lKphe+yFdrFTq78bLzaZRK~A_E2=nfk2=xN>LY34~Mi&NMwthw)OB-a68A ziO$)&k{Fe!4zp^BX+)^nYi_Kf))i_5g~TYmg8F=t6R@aM7B1zL&pIu z^;(>--iy+vaQZ8&(r6yTJv_7Rybs~E{V3MzHSWpQ$LP4^Ba~szHB1#8x@x3^M+^|= zm7VsYWQ{iH%NRE?74K8P0!iVys4>vmR38zk?S{rsvm0s32>2#^Kq%NW{sqMw&Dx7e zPN?eosfzc&1%G3BKTn8T5+ zGdc;W5b-AVKr@}flPnQ)LaaqnLT+-xDb~zr_qD7(IiJXANeWDOU39^*yvFyaVhuR?xt+qY$X7#Q;eWmF^@<$orR8}S1NE2`MceBzok}1?8pQ-bk?tTiM#g*Zw zy3Jt&>V=CmYap+S+K^(KCL$b^nO7fu&=7zAqUY_G=~J?Yh;(l$V4D*{qg3kr@V3^0 z9htJ8f+K-AfuJC&>r_^qBb{JjtXs*8Q5=aG$7=V|gpLV^MqkN}lP^9m`rWXa-X~u! zPw_{yK1$z=V@6^`Z2ntHqZ@<|Zhdkgt~_-X^HuGQdse6ume7i?aiyE`QT7s;Tf;4Yr z`TM-I_O}Y@u0T1jK2I53mrFZ*z*PBV5$SPRt@35o=`oRk+)|Kc!-|aA*kjUDDHpYZ zs*{PHv_QtUo+$MMI>>_v>H$Qjrmn{h###VE7sY#U>SJDJ^Rf&ml*=+|XMr#P@??QN zY^YVNEE}>^R}dlagM4yfZ!GJQUjNK7;!F*{hmOn()ZE{5Da7PJ+^9@{G^GJkubtVya=|kr-ez=5p@wyUetEa)zxE>>OdHI z7Un?LdkXc>hcV7@sogpjf>M7)VpVbx5NJQ4|18)qNb82t7H`_p1eFY zX<2+;dRWovdVrP85xj?}5Aet_`YJj3DzQ{qVjoK5hRAdJK0vHg=&2MFi%#alPD6{v z9J=D9hMtau#wyEt^D|r?!}DKyG~fc|oCOv>2qz zu}ob%8EyBJlJJ5IqF zGqdkHY7(U9LyYQ|-=omtEYPW{{eG`mlU6})r7p`l0)I?iK^=!$;g^};Er(h-8Lh&f zb{zABZ2U74q?y(?!#La+wrFy_iFLB)5;#o{zd}84?PGP>hsit8ZKB3|rB`Wr3v?yAbQ> z=@2dtB7G|2g8E$rZ@x(mOw#@d#Zjf~I63Jvt*1!MMZNLGNSnA1fVxMvs@18g>F%t8 zix?(HmfgxFmK6R#vej4dZDX+U0(4lCTqqkfrFF)4!LZ|b|0T!OFjap+S_2@Cv=%^5$5+Q zKHvYS)K}^epqXWj4#aDD*3qgijR+lnk!@1%t$L3(;rfMG8Zv53UFk;8f z+SU9oQT=Oe{UfT%f4}f*Ooh=8EcWZ|@>GuKMnSAula!t}MB2fK4+<~_Wj`~IZx@r< zFpbIk;Ce-BIf%i#7R&ZEizyrmslp*W5{^@@wt1Baf{dhdgNl7I)s?adbP{^v^3#vs zZ|C)!%e7Z-yseMRX&VU;4JOki$`4{sP&t!jNX%UQI|R@jTC&7SU-4qWUE~p)hTrJ( z;KAaaU>RxcSV($xs6*>#nbwHkZSVkIM&y{{*yEJna=#O7i+~u1Lzt$@>V@`hJ4oFBFp@=Le?p% zH?3%z*^|froD{i4O}cL6eP3%XTVtpmnTR$GuFeAD3HR1hb65t6cq|GaM#?cO*7c16 z%Qx2VEJm=n^Jk-)^?Y#?S`N!PD0c8)UO0b24T}U~oA#D0acW$f3RKlo_bXWOV-xBe zBxAjzX6Kg%-o3Qw=~gB==ZqlQ=#)RETn*lYX0os9SGs65W&59Nre7%T_u>rzP=WqN z6{eF2hqBUfUo=hNIW_`#Y4~?KV#yd4~_AQ z+5?TKZSi+rZ@Ez8I3D9)@;MFEQ!<~?w$yEcR+Y_qN^@sjB7}7gPew4SUa={Sqlqyd zGXk4xX1Iv>3UE;i*ixYBo@|CLMk48ZzRyHPGTo|EDYJrRIfjV_E4ti)#)T=|u`)pU z;p$U8)hLxmZcrU=XYaHoH=OiqsiHoA^a@@Xf}eA(*QJNB>tEh0`UnsXqUU~0*CGNg z2uf-sPl6bXsdG7~w{N>H3*mr`zo6O~{Kgr_*{dSc>NfQ^bt=5+pmo?!Y-~FWJL~;O zzIap!(7ZW{rYJ9^9tDT~f+{d_b*4tFA?7XOx$!|6$!W04~~(Ks%A_ zM#{^q8Oi0eCx2}M#FZv9BJ(QB7q#O^e;rqn$MWn>kC&R~k#1k}pMq`<$cR=Qj9RYR zlit`*U#wD)?lX<$31yiqDDs$BQnYZc!e_8G3pH@bs*tOz73XC#SQmYXK(5~0r3Y?|Q(dR#$_tf3!SW=3W24RugRNIfG4G;egcHVr!n8MWqp zIco~6h=AqG<$4Mjc)Fq^iSp^NUubn){do91;kc~6k_9~$Nav=|!~ zFI#D~&8O3J&ERT#4u4J0J&{|>)Q?YakJzE{rfm~IVo>$7c42aLGFELPLv$3&r3?4N zTI<>Al?1xLmrdG}MoCrl_%ZWmlQCjrA@dRTGGm1nbr%%a$*kzOTM|C_uNxLaOy6mK zT=n2#7Wv{e8{D9Uz#JI>m=+(a-`r&WxYE>+7=Z$EP9NOZ6tpq?{)gD*u30Hd=19dI zIYfQIkkLL^uK5Ku!vOOdHv!3@&}Kr*Fc$80^5dEJZst%I~hze^?_A=x9Ek$PklVI9Zlh zrRe6hr&s!HG=YxKS}WPbX?{VqG_k@q)2LVbny~h5cMw~NZOdWotG{d15vVkEj8gDc=-?)aXAguan(U_rR-e_oaR#tfXgU5j`d_U4mEbxM^t)yclTNeB; zD^yuQDl(03+)Gg3FvVva2qeZq&wXqHg{IwczVbJ3Gsl(GY7 zIELCwU$2ck_}aD(Oq!K7G|K{V*~eHb##0_Uoo*Z37~pFyV2rW$g`GNAsC||yYLMz= z1DETG^R0Ui+BF+H<2$gc9=oJvmLmRA4uO>0OgqA=sm*#uS{j{8k_O!Nc!!S`H3`!^ zjr;Qjk{QU}H4;2-7FEsfwl5hI)?%)^CfCkwjIN}x0OIpvi5&6i_U~1&dnNhOkD#&y zq9UvG{7TeqtP7PwUAwakO~cCGsW5lwy}sdd6iA>9GL&fZ$QD|sE$p^?>@`UI|YWi&?0;J(M`MQagGaf_P}Ibf0NIXb!wO}0e(JePj0fF$&6PIsN&~PU20X`?o@y+pJabIkfQ2KzJd!f~?+C$=d7SK>eqb&`P4w=Gyq1DJa z%{5ww*2qb!igoLfTVWYo^Mk`~MRAawg0u2FHl;I{24;iE5U^QoVsw^cCekWOl$@wT z|B?NG3prsK#dclGZT3)yOEkHvQ1iKga`HHJ`joGHWj=q#>!HqoZZxx;YjiqMu#|FI ze=ylwrwOEC^A1JrHoNg%jP446wk@WPYvGNs6ppKtmTGji8qx%m1ul;jj1y*Vf;21g z?Nl`77lJ(=N%cFTkRU6nrA@jKk>-|D&fo~x$)dP?D&(-*-JI;?&;XFzObAc>yGnb9 zN|eNf@q`C?-F2-d{rZsw+?twJnk5FTOU{BAC44P;ljCUhRj)}*bEu^?&Ch38&~U( zOs*&Mk`!@SKNFNb**7&vkCEi@+5TpbZzVN8{LpmM@man8v{E2(|H^DPa}&I3FJ54? zv=j(W`Xmg(z%_AV0ogW_^xG)@p_Us-F5~?cL)hQnGE48WTsrJ z-~+Qm5v}Cm5#}hY9Ee5O!`6}PMl10LHdg)V*@mgobhyEi2A+pcHYE51E3&+67|}_O z&BysC%hz6_uJlX`EDb90WUo}DPACwoHCq;M)jjI5PUyv-7Yosc*g#>}{GcvWE zDoMfij!Tw+1l`P~JszDkH++<;(+b-{u>-bS>qX&(TZl##jEdpMz8Wk{H|gmC7C7l9 zMnSr##9S(NU(mHooTPNO55)&HJ6Cjh*Hx+GSA{O!bk0lbhjS#tWUiFhT22~SCd?<& z2h^A#9eRnL(ezf)7(+m*R1pyOS`p&ul{_jT7kNz`w+|rxEveFA=3=~aY18yeY%Vh7 z%((>_$+>iUp7qGt`jD|1oAz{~*x^J_*NVKX8**A{?Jek}PeC2Qp*!|f|I;%5G4yrT zv@Z2qrn4{j#ED2wG}3z`HnR?H*KzzRvo~_sM#h}zj{}qSd61I^H}@5{#tqymIC0Zo zfPf5If_=z-j_v}#4o}Q)btBJ=fg%itM(<-Er%Pbxu&`@t-SnQtFLpz<)!R9KNYkNi4F&8QYF$OOkw9Wd(P*Q+A#GIpQMy_|(F zXH|~lNMhcWh-Vh^(HN$@$cBZ2Dg3a)$?=cmy^`n-E;ng%}-D+J2 z{)HEFu3Ta30K~wp-1*qJg zHp36;f}rw{=B9#xA;!Q#=8;Pu@sxY_v0H%w{4dtK2u7HBrk9Hkv{y>P-{dBB?-% z($Onmnr}}HyZlxI@T4hymA}7{ZjJ$Nj}V#?42@Jr_yt&A+@~BE*S@?9Bpq~dR%P)4Fr<`p^BUl{;eJSGy^6SL0dt^a0EnbYU!z?#G3 zI!Z!_brpWtR&bF>V9kjCf?`Y9nEI+8q#4c;Tdj9~Yf#*QE=!NW7e9fwf9uus)7sn^ zB=9c(ro@xqWVWitNzbVl5wLNU8vO1%yCo82bQCZv?)6mQxAjxU{x|mC11gH8YZUDn z1{|V*f|3SFk`X}= zkTkv;J?Gu;yX*e{TX((xzPsLAue+yvy1IJrT|3q8s_JU(uYQY+GfuL4>q)j7A5EPY zY}LwM?g?fsaz8MNJ3ldzMzQ|LY|rkL+^r;&iy2cr^TDk>+!IBkN28B?p?a+H>xTI( z9CTyox_xK#FQ|BBO`>7S)yHbg($W87SIybbyIZ#!rm9|TN|^A)Fe#KB%mVG>&dD+8 z`VxN;@_@F26KF7JxMfXIo}0y#31;4r35m{cp2SeX;<=M82lvBIyk%tatclr2`nKPM zfMFZIAkGVmr<~x8Uyvzx!Dcbe_w0jj3lTq)iXYypm-*lLlNJ_FB!01U9MJPy%#Td$ zJ@k&vP*C-x=z6VoNUzjR(v|Oiu)Wzzc1a{E-* z{;_K|aByjPS4W7|nst)%2QM!{Wn|ItwT-PQ%KXi>i)NnU*zn1+r_;h~5e2grPAfn2 z!!L(RakXm?Js5tocY9jpmR4>P)bEOE02RSPiQ7S1Guf|+2QM1(((cU;T{Q2RLj}n5 zbrmcxjFnoP@#`j%qPD=W+V_!#UT$_qaBUvOi8BHHXtm~E=fcb(pQo#lKOLb2w7NpL z(Y;6TnC0+lNv8Qvz4s5s&Z*R_-g}|Pb(@c^M96j=zf`nxH;F%8FXhA~E3^7%Pm0$& zf}ZaGHt=nY+U!8pw_^Oc*;CHTrB$1!EUaJmU`wS`22A48X;nyO-5RzoG|Cj69g59K zt~IWc9B1wC@(*6!8hZ9LZ@cBgkxiq`%G0M+yY6+>=(n3J2VMNkv4jcCY%caXj;N+w zi(?jS#n{@p_kX&SrexL2i5VIF;wWg5n9Zt~|Hhkh@B-pR&7z^jr*|)o8n$JRIX{0P z{MJ8~>yFKOCGJ}hyIQX9ZKP6x`@U*rRr1-#iT4&$8&lKeHwf20KFX_4FA8zLX!r1% z(!|Yc=_0-kzo5On%cBb|zo6?4e`WuEDwk-Op7yZ0(b z6}`udKBmeb^Zl>0)c3pHg^{x8k;Dr!+CU9;>+#proVZY{F;bX%xOkyKje6s)3 z;pg{{QI`7y!(jWAvlkmOtd`a^UQJ27dVg|VsQ+MytPQv&v4b@3_?g<$Z5_ zJ1%?_;%tz+Vj66@`~N5ZKgJWzHssh7b&ctKtrwaH!4Od2miJGd)_9~APepvPZK@MG zO1Hjkv2F39*x9nR0OEf*l1_AWZ%JvBF6hm-9=L7&Mm*#4Xo6Sp=O&ZTALO#y^wWm= zY!^;Gdp`BGJGMVq$Ze3jz^q0Y*Sr?jE~zYTaUEMEdf6GQ$NYI_ z{(QeBl0}jFc{QEkn&2uGGvgQoAxH-O*j083c3VpnMYn^S+al7OA zjQH%2*!fCt-`Ei^=V1LWIQ~ghzQHlJ>i*WBNv*KzYaito^@seQC4J{lqGs|;^}QpB zciRh=VdH&ZZO#h!@Z%d8#{5I3Cve}6)Yi&`yxF`HUMK}V1wYgZ001Bf@JH1!cX)Y*@r3_ ztsi7DALa^}a(kC5@c7=2EZ*9YCqSq-()_J3H(zOs`~8Mj_I1VW2j{?>imNC0)92}1 zza|<<%F=EyB99f-Vf1gYh&W|NwNHy~MJbhww(wu^r`#2K(=sJQ84QixTCulj*q`eG znlN2|LEys-v0G^aM~(R1leM?3tH+*VyOM(NEL+uZGTS z(QroJ(>i6GbYHP}|Ft(Xm|?8(WT5qv!_ECwnoo2ye)|6OXY1TSENtxq@8$|ko(ldg z@GOlI4I7@RF0|XRl=}sHoRyRVe$Pr*vZL^!ks~r*yW$f#`w3Ns;a?DawdKH1lV-S~ z+2?nzCn+>(l4kxs^~$j+Etq0SoJVVieUgv$^SLj$44E3W{^|H{$;vOCUgiBKi6(J9 zC$M?+o+?ZKLeFK=|H--EjlZYj(ne*1FSg(&H~7Z5N&P?TqO0C~Rjxnc`0RTSvv0zn z7xm)s2H)rasec1pto*86SL*m|30(9V^a}d_z{USoPHSKNyGAM5D9gP{C-~ zSkA!)eDLb$nlDw8oL@# zd-A`ayI}tOh=tI*yP1?HTQTh!R(hUH$%;o$G8q_lOUb{WA&t@7yGn|e zeM>)M1yrp;Gr)BJ*@n)950~>;1{l0OupEI`OztSb*O4tl=WKaT3R%Wm5NJ1N>ua*Q z+vc__%uApn4JX$J(xaoCo1ZcZ#KSc+f+v*|KQI_XnVvjo3U`*~P%@sb5@SVRK^=)g zW&W_AeHH$X0_AO1ab~9$E_4g8Mibx&i8H=Ki&c8Zu}sda@=>D-wHckoR{Bq)^)32N z36wq6XL0-Bb0+87d1pP0g6sO)o4kf9IY-?kXC^5n=Zz#d&Xxq2B5~0nu&E3LNPquEgJp|kgE;3hc>0ng%zdvO7vO#mP zU>{@HI-Gh4d2^)l$?Lg{cV?ENXUO(>gEGqVdACm=%VrH7^~=?h?iYW%D3mvNcK17l zYfFvo7j#nN&1%l}!x;_n&?1WCY6EzILYDdh1%h@TEdngRzb}ShgG5+`<&SDy%t5O)o-!*tj5L z3x#MiKbEh+Nyi33VtVS#&bFiQo>D>}M2F6;kjT*OMIyg$nteG*IQdwBz+TwuP_Nf|iB5%&^`WjX zl*ZJagF26QGr1Hac~vpI1rZ0AU5xKf;S;hJ`5Ub&c{WRP*o zyR*8|nx=6&x3V9dE#&ryGGv%zjMUfUG@@y;p$mEE7jLM5<@wY>=;B8Dhc^0a*j=P8 zj0tbNk1%ayy>%9GtuP?|;axP1uqKPp51RFenD8W9QKduL2DN8ORxppUx@TN@quTEw zn)eqde&cYfxX;Y?H548Dk-5u5Nm5aE+V&mo0hz%@o-iqyT=g~eCx$uBjee2mWJ7XZ zKi0z1{%AJ~nAmTPB$3#n*aLc9q8ue&Jb>lzm==)y#7$WbN_HiAl|*hehDn;f#n2pc zKUVpCm4B95KTb4Z984+Hck9Gjm)e))nw{nP#pkbaf@1$B0U z&AqUuZw)nq-LPwjz4cSM(cIV8j6c`n(U&gdC&YSES|eY~x$P@f^9?ZbKE3@KH|VOYEuljN)lE{t~&wn_<#XiV^V~Cf8 zX}Ow7mR(gKLNwmi$J*Ff?>%@`=|h{C+hnF!Aqn=*veyEAKVE3)nnT_ZTBV@C`_T2d z30DeBODrm$eHF=-&U^cM-(HS{2vcNe1?oL?_~Ku=EjZEm)r0`aQc2Rl_nby4`ExbR ztl^PTq|2X+9jqCdFXHAe+PB|-5Dd{49=zb7sUshKzR|liO3Cobx8~Zbi@f2k6R1HX znu)L9^?-sPhcv?Kb2>WRVV492`c}S>>A;)mahU1B#l_4{az78pjZ~(h-hFK3Aw8)q zHJ_$^d5r|2f?lph##Ue_TUp-|y_!=iT{Yuf?yxE^D&9YEmLN1g8oy9ay8WrFFn2iJ z%sYOe*=k^&(b=k>y&4wdnl;lSmAI0QELk$ty!eP?|E)<>El6+zV+RF&KVyZ>-I+)5 z--Lw@L^JW7V%&`oPj>vOs_syt9R6I^l}kEa?wKBkb-b*rzqc2yPjAghrnUqh{~sEC zaf#m$7bC;Q>2n2~$~yZl+PfTk)TLy93kz)>NpgJa9)I}I$e~?^>KB%L30DhA{nFJ9 zF(rtwty`5cWrw=WcVu^3!|V|O+BuJs*!vWeG!B56a*EEqb74him&VJAOS;9H(ZTw( ztOejtG9dZId21uK3--;A7p@Q9(yq5Dw3xfEXPMf&NB$GxGW#NGjJ& zuXQ0#M6pfOTC69Qme9uMCit2;mC){DTTTV_bs=bHWro-k&ug zi0vLoYq~JyyMC-fO~nh_EoMHCx%gVGjecrEpF8Ni8Md3voFsFH(g7&3kc&7lnTl+w ztXO33NW84r?sxP?@k9B?usw!t*S68x$Q39ZPC5bMP~7p8)OsTr@#At*+HHp)f;SI! zNr(xZa-t707J76?lHOuGt%o(hx3WwY*wHWtwWLSB#4`{Uqo1@y1)~ClpM0dqnmEud z)Z9>OM4=0lGtnF~ zZgQh9Zhr!9d4D!Dza4ESf+MXMyV?n4XQG1lt?qI#~rz#;0!-Hwz z7qZ5WEjQPc7B3?7VsjHNfihp)jdICH#}a79!w*a`2^jE*9+-Qw!mwRS;^IrVT$tNz z&9K^n+fftziGq~T>{oi3-8rPt0;AsfIap45jj~(9x9K*5C-dvrfAm@VPhT|?F(6D) z#$QTZG%;r}*D)(Il`0Zo;5ljh$tXfpNHW^$`rU6zZY=xd@0z`5#_`f!&X-G8Gro`( zDIS~J<;Rq&|AgPO6$6FKXq=HZmv_)>BWg|={CpD$bN*9OJ>afxuLoYVZzQxoq2-8k zm)22u&aS93$dWl=9k6~S*^mx=Wroh}fYYF@2NX7NEKB=gsW1b={m!`}gJd^ut=q-L z`leS$-4ye~+&Hpw%x4^+6Y&_%)?0)~^PD$CR^^C7$q$tgEv#~Mg0^9IFH|&_h+$mn z4qh%ld`sq;Z^9W#j25dD2SVgR%Fif;hYRLb&!pBqKV4|CvRDt#Z86iUECk*iu&`l# zVYLQmDo~~cS+T^b`RdR}>(dLZ;6sW)Xx`G2xv$L}ib0-+7|9Dy=^N?qC>;z@qhqf? z{en_n@;6HDUTy+HZp>`~&?r0;GLw*G541m7@6&XL(t=TpPS%d)xW7W>nK)YCX%fB zV%wj>I*~YsquC3)V3Fw*_S~+YD{=7W#im`S`WNSMaeDEk&!T)H0*0^aKOh;>U7PgH zFuPlJ_Ju&;eF`iVOG?Kn#LIHVmL8c%W=%v|xLnUEc!`Kw(?uA&Az3f;@Tx!mD8+lv zPtiFeyy6h49*FTMZ_B(&T)0`v1o35ibVj+0_LI8@Pl$!i**4}FuW_U^ zC(5n`NV|Nvn=jGTh(=krY=mJ%I2c6YeWPGmTCPbmdoxFw4rX7SM8%{}jdhi5sECUK zBCePUE*e9^oU;Y1#I+1n1wnRkId}FNW_CgP&FEYAH7g(olwlX+$rEpyo7G6GPH)j#lT^q3OQfX@!<}4(fKfp_Gpx}1q$+{qWM}O~d(q5SEYLfFf_ahg{&$E$jaPCLT&?b`xb+eI7KpV! zmbHF57T>MrWpQZYIbBzME3=3jA z5xQLUB}uww`zNPksRrs)n492;LykUS`mC1IaXS-r_{MJIR0GFs(QZPh%)(>~hUya$JX_Ipl`ipT%M|=Ka(_LHOwYoGW_gj*N4@i3EWV z*MwF7yDI-TYWvtp?UL6c6_jU$&5@uyxLdes(m4vVuz9MTn>d%6?3~#5Z^^Ng4{Uo64(ppmU|IMyvv%+r6X-A!6d-=M{?~&^$r#MBT)|p~S zOJ}j5Jo>Vum-Kz?8&=vpr6rK6pB3-sI3O=v{Q_Z89_0iv(->F=n%>Wf&a@rWNnB80 zt$O8OM(8a37*3CjRZl9qd3cKE>lfCeO}B%?(iPRCc!bs!c>R!|JJa38Nvqra30l+v z(RxGS-eCr$iNrDgDBV#ldso*3@$&L*0`+cZr0;Z(o9Sq{e2;E1Zfv56r}zuq)#7;U zs{Pb=LHHZJFntdBX5VkH>XEijUN$og$4BRIez$v^IGR%1edvDacNuBnOA-MS0aZ3b z$%xkqDVK4=kso^==gSos+pl&Z3Y}xH9_~Hpa&5gCixuJS6ZbtiR51pHMVv+Ma zdjxqk%+TEMQPf!dvZA3ZmJK?XHp9B9l##!m@GP6m_kh#=o*{g*^0IwCT~syL#J(1VrxPh;#*% zk}&$z!M>yKHe6oZwlE00p;IXHu!7CyYQquv9}%c`Bl6b_>8;HKFWgI7k#9_3(iB@a zS&8grTC;!_exOM-i3-H^1y^i3D!l`Y8`SsNQ&>)~^s;%sw=kS{=~Tu5TeObNnx%$yaZg6h@=B zYJ9TwdT5SuB2%AdJPk$)9E>u3ROnu;D`mg=Gc}(6JSU{??tp2ofb9cR*AuP?;|W{l3R&L4k~gjLI)&Am=^+PvVe_sf}M ziuLZnP2()IHC_E)XEl4W_j58kv{Je`(mK26X(abV=hS{iV&3mrVQ9>Xp7Ks}B(P2J z;BEr0;^>dB2xu9rbi^2lN!qo6SoACBYJ{Pz5yn5HPo27NvOnbgfqM6E& z?5zSy^?oUqT!<5LtRy<8+HObM*HVg2&`~=F1-k2*v}i_?b|~c0``Kn|(0L$mkLlCI z`XhqRBiL)-sTjg%Cx*jxna$5>MLD4M=SGJ{S@_h$BR)^X<>y@Dz-+H|$+yzwK0X^} z`Dn(A4^~u8&Swc_yMKzgD6J;)933g%DgSh-#e>XdW;gez1X@>i z+unoWgMKoFY^z|5RVN~+IZI8`(b&b^eEp`R2wRkb{j5bZN8$gt`w^lbC@Z5C!FAANg6Sl%8U&@#rg~4 zy|33@yZ7aV-f5Sx$L=}L7nTHMLuk__3`Rsm*{WTUMdi!c#~+y9zAquNroKP(U2vDq z43id$aQ#cN?|p((B3pGEO82xtX$tGxebH9?8&X=Y*WJna!qeH5fY2&D`to^RRD;*g z=RM7DKiUcuo|@ocyIVCMNVs!Ov zNoPPEEM(}@DnpWxmsybGh26M~hIlCfv#3+yEf%J!4iTL$6TZE_AUI^__^ETpduo#D zn^aA{2gv8;-6=(9+oXkPGk)Xp!3s6%pdxclK4<)L#gi1N%i3NLJ9|~PEbON#JDs)z z@$#OcT*MRw^^!8%%C;k#+UuM_k_OR=4^nucgBh%nE&}FyP_&%j6*E)5 zn3tKx9PuA7p}O~BWWt_S<%(V5)5)@hEbpFHV$+2tAsRWi<}mN`tdBI+3(uRA1m~?C z%?)B7MD$JGLl4d%pe&vbt|_j zy0dCeAMP^MMNb@eKbt=qBW1iU5dIKq;^P>Z(mAYOZjdA(MelslDbJL_UHYOA+6{p+ zVOH0k!Jz#V_X#27@6#g%n3~=;8bdks-7HwvLTQ1CMgm=A;EsvcFDUg6X@p03T$JY> zf*6R7l#$B6ckX~*f$4M(8?75U_Cz8!=M|z6m784uOqLb<10^M9 zSiPsY7@v9wDfhZ^(e;@jXkx|LE8^qb9;sJ^6vhg%NHSev%ZS@|;t#)gF1!w7p>y~$ zE`H#VgJX&t%PFK=VFr`rZAlLWGl|uDO-L7|F6M6aGXiy**(eernx(lvSbqh1-nDiA zWxhlnMgu#ugdXJK6jaz^y4d|g&o2p?K4ST9dNikRhhfh`Ql`jtstwuqSZ=eT`Cnf_USy}|n^dHx%7*i7+ zP{q+Gq0Ewm4N5hp1jPxAJCcVVOLMm~(-2D(m$ze9f_NjMRgYGho#S%^lRb70ebcC= zbuo???q=xWP1qeAP|voA$kgBr8!ri%qrGApXImWZsPC4qzryF5B0PQDOmgHekxX`} z)CpdzD-KS=XBAK1XtkYy*i7{_t2GJQajvfFZjn5dK1CnWWEZ7{;_pg5w)7alnloey zb84rCtEEfNv^Vj7rK=D>z}gm|KRYs!&66v-!aGq zusZB}o?m3fuHdi|CUw{)oVZkpj=1{FPt@zK<)PewbOZF{36azD%6bkuRw8S!N85;I zH{4k#SO4sUJH+4^(+o644|R-aB13R6q3V8 zMyf+e_!s2B$>xtW2!Y@ z;dl#ei_@;CB8gRo#Ch6|6@i_wRXe`Gq<$dzs$nBY!5`en{2i z_XHw}L!U&GqQb}k*Elc!cJB{m8hqx}*UKs|Py zRZ<|D<_Y5I&%_{aJhzTB|Jizcj%#e2Gb6Deon!1iZ4dn~X=KYub*Jo|W_uYN2{g?hFyiO#*J1@=w zmXRW8FkeI#+r1plpB9a{|L|tlhxC(AY4zT}SHrMm7mlh)I3Bk@#4J&LLnrz&H{#T7 z`NpJuZLSi%dcmU933v4T5;G%(^b-uk$H(zgyZ5tQ}i|3?2WKU&OLX+z9Jzk(X{*R z$CF2A5tXCdO3Isu<_%BlDvwI!`yu8})1t{1B#$$=qxXrKMwv0dMFQ}S) ziS~c}$=`UAj;Dqx-_{{%AUi_yj1`)LHu!QB`YV@a(s6fZ2Iv{#dm(MteCvQ->WsWT z+C#fJ$Kab%f%V)~QFp1vbDtioY0VgVvNCxSc%xX1{Cl*}!i>CJBGq%)7GdPUdA*}H zXDzd&xSvOc>FbUwh+*{t8Y5XX55&b1``Ogy(j+UB!;0b%u9?0me<4DH97#0I7lGf<8*aeHZ%^J0#(Y3Xo>j_!ZH{E%44IUAcSlHF3D-!Hi zFd~(&2Nf3N;@eXYBIu2)C zcwa8$sL?c;L&%q()`PtxJRDw|7e_jpr3uH`>grdgRH%nnJPUYTsd)c&n(>P3>yeqIJGCpH z^D6jTw+5pouKMU>Z?`yq6Zq>k?QPz$yD5g&?`GJ9ldp8gNU}JD8Aj%_nZ8TP2`e60 zbq^HZTKO1%Ijl*b){Ndz>)0)iANnE+@6~2HUl|uisiLqXb5(87$$)%cv zOf=6HJHP%wlJ-|tIp)H?^Q6g!%?jF!)AD=&R2Hm9rN zi5E*HJl+!xh}LIa`)~qmt4BE@l$Id<7hlhbU1&trWX+>S{>{Wy2j+=kH83uHIKWq{ zSX-+RnFo z+V>6N1qbf*m<0N>s!5+?qe}M7+~C_4BPY-_4q7!!pZ)aZf8wZ`6x|YREyp7|S0le~ z<@9QTmsQ4|TJ%=6FEE~Xl}E2K+N;7xoGeW{z=Jr49dC zE6e@nyGJXxzC8K%ba?JyI_}43mF$8($Kf-QwX!^iocQZ5SlwRd`UoiWJHys|T&mhH zxr=&}pY7pYx#n5pXA(U@8uUx*3BJh1#1^h{w8r97phF?Gk1V`Y zrr1}_05$A$?|>s|&|5{|&{c2ICaTiuKu$^BrG;Rmgira^3I6E$ijlv+RX-tk*IJfm zvL{wGz83xzUB%X_a!=>?-Tcul6^Tbd7YTBOXEdTl@yEn?=g< z7fj8d9rUd3vaD2KXdd%HIVKX+V7EvneW>3c5M1YG3F|dsh1`Ef^$IFZwb@_^>)N6RhR9 z^+(`oY8W~q-sd--9X%gC-^fk({%`^iwk%gtj(7a0=-m2Taxz=JPxhHEyebPlX-s~C zU$3d0F?YPe8Wf?KTOT5GHN$CY{ za0bP9F}s_+3kQo99uzIyE@DfIbC$~>RCJ;0GZsn%J zBMxNkr?C9A{PojC3y~>jWf8{l8dL1@QsLDRXHJMHBH5<3jj98`ztg^q5^0aTk5qioO&Sedx4~MZsS+j<0 zNX<@R506Ct3-vUhEWfwTv8_43sk5IHk)Ix|oNaI9wECp{-AawauweE#0xlHRHF8p6??Um_&Dd)!R>k(QTGg7SyCv^$35W^Z&xVn!s;h!M6Km2%^|i&6BMEMZl5u zujIZkX9|BmAe;iBYWyJYzaK6BZ^PFgrg}) z2r42(K@bT6DQH3vDgo^NWnt73h9G(eB;)`gBYDOlVT3~?0Rms?(?n~ckkJsNFT7Os z3mW@@0khRWSRwEg@-lMJ=28U_3%9{GnCfif21=HV%i11Hc0rQyFxi`k1$zt;2ljZR z5gy(S#MJoyf|lXD{0yAu$qJ%LL&zHb&M#=kNt1}xz{B9BkCj-WA(Fn~;a(ZpK4eKL z&7{v0#vT?YFaLrH%G#F6_%baj=nN`?zqc}gU>F0FgHDunf(gLuhgpa?&)exlY}IlN zzKl9PP}UHM)mW<9H1R*Ss>x~s&@5$;7e9Dn(p=dAmGl)mpixk^`~#qz3t+(EE8x9~ z3;@3k-sl90Fd5H|!`H4FUHt`7)&ht|a&Q(AtFpIg0^9$Bexzs`YTz3h&Y4ivisL{L{jFP4#M<0($|wNn`a zFv(afCa5Q<2!kRB6RCG~;Fs$+h*(t<7%TRs@5r8VM&Jfn7$&>I4LFzK--Y~FB>(*1 z&Bo$KmtY(|7l)tCuxr@cSj#7pJ&Q2e_+^-^0g5L{kD(-xg$Ab(s4-9s96n?gCgLlw z8CVgO58$&-t`9=sCOq8Xc?~uJbFTd7>y}c+XE(soIJv3^M&K>&{wx%cY@&?G!q@#E z|3%q&O#s?@ksN62fW`o(m63fL@D)U#1aG3z2cW=fHtsuk5)Ply*Wm_O|IfPgxC$sS zeh)SQ_xxGcus-GZ46-gfij{r%3knMCwegh5Cz@2%XZ!quM&G5QfC`ao%p0`;&3hT- zkR700SNpt)+VfSr{WjmIiY52B|DO`=J#N6mV_(Vmx&|`7stQPix^7ie*#XwElY?Yy zLKpGJuyXQL>sntE19Y?r=Z{gwQg1fXgOeqgyiCT5XX|HT?mPr<=2T{c!h>>fhu5>L z&_A&Hm*B4;;~yItqmaq?k}>L)-7H)I8DC+9uZ2wj#zL$ZYzb6ptlk9}_g)2x8w`vf zVj*x1O!*3fTZVz20dttumm&WGX`)1!jH(sDld(*f$LHOr`C}sSb*l#6x^I*|jpm z^AC!FrB}ZoU@3SaR*vdXfENJ_^Tj{^b6KfusSKFsstw>e+?Njz8F^yJrz80Rm9H?OVwDhvI-);YMJ~O&>BEIe@6oaCjWwNU{%@*u$WWi z9UBcG){Y?Hqrn#e+^+-IidyN6A08hEwl}jjfKNeRR2A)v$d}Z-yGTlH6Ag=B)=ES zZ;J!K|7>M9u`1b`qFAvEvU3#>V%s%Pn~=AF587=4CeVvjT_%e)jIJ6&(#BNt0;=C@ z0<_YoQ)ss=6o{#!A8>we<2XJ8ixJK?!Q5Y_5>5oNr3Y07zG`YJ&4k28+7_%ej>AJ~8PDS*ebF1;RrKk(-z z0I2sf@DTYKz7#*=uqV*`25;aV*r5Zqqisk2+N;REN_I)v@okgX@rK*IsD5>5sjLly z8umO0s-l$ND)V;@L7{3VCQUeld}Gy<6bE<}3M$=I;7wgCGCur*y4Z18DNOd-R#j*U zWHe4D2bJRU$pvIg%)^^NZD`?s6Dn&|g1pPHT1vgwmSB2%01=S*+Y+ePs4He{3#7`^ z<6pL6no&fY_r^ntXF-QIOdM(m(Z+f_!;pPH!(%C;e^q|X4h_PKe^wg80B6}dq%wrh zpvrdnAy7+GJmwbJn-x$@`8V+YprIZmRmQbgSgnH8AP)i&JNpMF zsDA#Vm8xJsafdLev{mX#;g~Y=Nnr5A?E@7QsNkt9g^Wc4ZPTPz8T*s)`>-`dH0Bze0^tYF z3-EWl6Yjxd(su4)GFoi04fSMt*{An%%DjmtH7>-18l4iraQnfeLOT!1F6r!^oG=3-LP%yuApV$SPJIcO}b_9fyAaC^S*AmCMfxU5(5b*2coS zLt@nGw5kqH^F4=2>7ihcfQo1Xh&1?m8zz5P4^LqK!?sW=to$?7u=cmvWaEkCn~We8 z#KnMPZI~u}FCK}ND<1$JOdR;%G~b;w8GSfx)$CdjutL|;^@{AvLztLbtJv$Hrg;T! z@`c+Zl~Q*cP*h(1hO@1^L>xB4r{MwpOYkrmlkHM9{<|yy(+5l%ZDpH$oEZFSc?(1K zuG(1I@$AJhV?hj;?WM63B3y^bE@;D?2qhZ933$xdFX-h`h9SMu_8gN>`hTQ854C*@B6h8H*~ZV(q zMcgU9b`>}o;Hx(W@W4dH;aKbmDqKMBd{Rd5P{Y3?`PZ|(>NMAS=07PwNa4fzcTr{J zrG}|Ad|5wEy(HyaPzVyl*(VDTd2KcO+FxpgbEYIGfOa01q`#eFNB*p8b=wJ2m8E|L3F)6NbOy z$qpi;Ur-u|AF--?BrN_}el`#`jGJ}CR>=|1;Op{tJYY+p*drTlVwfH>M6Eoi>sC?* zn6L5A>Ovs{K~Uor1mN~kdC+eXC}pnIp}*xil_vJoQxuD*jBPJvB!qfXrswfom~408 zM{yujJmyW*!SA{6=#^E4Qog`#i2SS}dH`q#m|c(@_(NSOLB3PSVXC2GF)47E#Ev^C zE+8Wgo&W*{u7~JQg_Xz3)dN!O%Z7YqA8y2nRph6I?!gN`4r%rQD?QQ?IxKhl6?o*e z%Q(%P2Sb0Xhw`8Uyar5Nr#Ds+mkgmlNC*hbGo*bv?$0H0atyc+)If$@i{c2eDst%J zb(|cA{G&-OcOwnIbZ6z+DT5ks;tL9nGUWYijI#5UXpU9RWd~Ibpzcu_HTDE%;+s>6 zL26Q2^?N}Pu(lH9QtG9(v_Fzr#VXiNHDO>-`ZhPRYf1UeoqRZj=)0b=SwZwT;8HiX zYQNFp3La86#$1T(M$e$M-*z$owemMd9*!c+5yF4K|Gh_}q7Li=DnRV-S{}Mg2^2TF zFo?<+3*8bY>ot_!9K=*yB;rA!2NPX}Fa;oF4uBl z{miY(RnUb{J7_{oo^~Nd=1`{1!KmI0$OMVkn}!wG1c_xBgvH zOp4q&2O>@|bp4fF#>NLQ2rDCd*aW}4RE_>PBr-`U!)FYCruwQODe=)8-z95 z*dv?IiXCBW(8K8lZ@3r87Z0~-VfvA0H2{lGRz3u7eKR_T06?*0RfxY05ZGX^Nj{O< zaKn23>;u5eG+Dr{-BrU%lW?r}1~BxpUhLi+vFC<~-15Bm{#>j{1MvPHF!AgT9zKmd zQpO%irTeQZh+6@cX|yl|X<^bp0DrxgjHi%YvUl(mSy*9!R!d6-z#er4Ee!w>ma9nK zi0ZQMc*FKX4c_czLu}BNr^-ncLtxym^x)pm9ekO&;SwtmXhx6+K=Z+0Qxk&1u}aza z(J?BJdBCMV=s{hX4;Y7_)g1!~^!1@Y9BrbXFmd?$hV9Q4wrve{$86=WzM-C&lf;W} z_r%C@89;k>mWV_H57cix>h1uN+8I613L#KLPq@<;zz^;HE$D`MD)y!PUM0`$q9>S2w->Jh^yiNy-~b}*;{g!!7Z4!`k~uX-Id>T->Tc@cY!p0p zwhhJ|5vTkx@)o% zmrN}eb=~N!05M8M@8a%87O*+YKA=VIKK5gvju7kfAPz0>`3%e9A6Csv)ol=svr*Ax z;$GR1r^eR}EcQ?ZJHSA(2?Fx%h6oTnhFm%TIOLse4^W2wg8~=~D5a+yJnRV`Ry{Eg z#F+{1FxdePfavB76Y6XVAh|FdImxwyx739XFd>CUIxkkPX>tyfRY)X?@Wkt5n8FBF+z+IS!u7#B87qbYa`!*&(jV@TG5KlM^i&$Y`iA}j zDg+i<5lxM5aAZeO&;Gjw@vgHXBTzUa2UXHR>2u%Q!Z7BC;UA0*xWZ*0dVf@ilT+gz z*~EtBDjv@4xMJep0R{a9IRgz9286Fb5RIvFBG-<1sBlwU%o^$6p(A`zaABxE8GQXQ zJ9JnUm>H(+LYNrbkhWAd>brwV$4o0+)SJIKM0F75WDMqdGa&jG#6L!9g!YdU5s{4m z%YU>WLTRE`#w=hW#9r>ZV*t3bn;QIoQ1{+pO=Vr9coIVB5PI(j$bizMh(KsUlsYyL zfgoKHnu>xVp$JGXiu9_81w=|fX#o*LdXW|(AgF*esnRlc2WQ@y-}`>|KKHrb?~i-Q zc}@;HCu^;}_G){reRlc}RgiYD;MXpf3{%y{lMRCBbUIuBw<+!7)s>u7;6EpTl0qP- zgg%4>PyR2!LvoSFeY(hmeiZBi&^MMIV1$z75~T>kU=nSQ-mxdhFeERDoc53Lmf3DV zn-%39Smy{}tQs&7Cl(6irz46fs*EN}kH-Wq$(13+b%k`&D;&laJK3(?p z{U#8TpvLW2yL%}LwT1-1ShM@KKv5@?2@A;*J{Fs{ryCbG-!mMeMk#yhji4StC7J@% z5h*5iTecgr-iu($9`L;W%zh$9f_@%mSodHPrOOkG?1Dgd&=3YTpn__Eud7D=@YFGi zEl50SPbMpxJ(OS)thDjaC6}9+EQIHhztjVx9Igm~&@tj65F$YG_g~`Qmq1Vb=srf> z6?0hzUO=3@U$_j+j`K_R)SlojLdSOF>7i=p#OBMv!Z}{3O;xPFJ8`Jrl$)u!bNv?3W9*p410xi(V%D>$Iq($6XsvniBL2*1#&@+bh=&& z4|OH)jZ)*$2VFeiz1@G*=0+XIt`ykGQgR<;CbqyFM2@Pc%ZEYW$^emo+)2UFYJ`c2 z(b9MPo1p*69lZ+363SjI8GYkXB1E3FnNUwb^8$0c2y$ZqGIN2ME;FWA7J1GDlVQ3QTeUV^rKtrU_aUF6v{0Z zH9|80J_J0p2MUH(LAfqBl1H8YliyG(covYZgFYpUoCd-G01z60HW@ckuv8;yr+C^e zSpI{;*L{h0@!ZF?Mt8|yN2R0&fe{F9&IL{x!hx+gVsh znq^;MO#TQ+$h9*ZDg&l~s;#%B;2gMJEVy+))rRn&JUZwJ;E@;P^(G1TPMAtlYQNp0 z7?ibfwukK8;mjc4_+`{+CTFGH5~f!}*c0me7wC<(LyqxqzS@Sh#{ zn`u@$BwSfRBbaZFot~3|GE~o1fZn9rhbU~$)Ed>1^G@&Y>-4#(Zxh~|$%g}iS#*II z!_)7OK$rf2bn@fW{+Hl|NM@BtAd`PUY)>zWL72$<{8V#%tq(`oBjHNOUrgM-AL;Ov z+1oTh7X#QP5@FQ9>d-g8X$kI7L1~p@IC+y*g#WK*wg2S}pM|=ez~tf<{~N z9}rmxgBqIJLqazpGe7|f0$k;M=}gyZ@2W;XJB~o`-fFP*c=T)-mpTHEBaobos7x$r zoJfQm4PI{px_>AUc=1eJb;{tTw?(D34W&Mr!;@;z7=vFxAZFF*TB=N5uO$7HVp}P`k(PXHovadkc3z#TpHy{KEbYgu`M0+X!;2 z**LYFL_r+kO?ZlHt>@o>sTe#P-jFj*a6hn{lvr?SxN1~QN_F8* zxl<7sR4`<*Jrh1e1l&#~@4_LVxb8wVoZoSksRg6BBB<2p63D;;p#3N?frcN@U%B($ zBmX){q0E$I_Nai$$%nQmNaGzKh^r{jTAUM^GJ&8 z7R3!zHXo>U;Lf3oZdFkMns9)r1c1%}r6L;muJGvDu1ndyU>t!L*ruVe9Tbe6GN4T{ zd1;t>V|S5v^;S=6Q0n>Mm(Jm-z%A_o!*&S|Pp6OoU)F%8OWgx@7lwYb=nuf9QBwfA zz+Hg6IZ_Z{v)Hff6~q$sjxG{D12bOU|J@y85d1?FsCl`2YVaeyuLhEb76>E|4NDCHv|pa=u0y3e9(6QsTB&8C#c+g= z@D#5t9AOM2^{{gS0QmLVB>gy%Y^X-Uy`+qtS}Y%d2p9D_0I(PB+##oe$J`pwU@_>f z-$Hps;Oz=99gh}b~Yk=q|2JI5>&A;GN-$_BQ zMbJoFT=iH78q{JSApdYLc*oXrP7Jb0kpz9@o=qkBeJZcMb18TBRm$e>;i9r!vVtx- zk3p?nJvjKQQBl8%paLOZdcTx}%i}*U0!rJpw-yR;)tf~fxM%3$aWD`vxj}%;zmWW0kXZ!rS53Jg zffTgys1(%Z5F`&{0NZn43c~US#B{4&xt*g2SOb9OOQTU-ZuKboSR~M7tv?{45Ogj& zm%Pu3YkaI`Yj(yP49Ez>JYW^z7_f+&$zV?O_vkcyMgtd7UHO27!|RgV6@nLWhw`8f zjV(8}CAN9U!2reb%&rkAAp;le4u<=?=f*4y-H59NbbL1}Ib2S9>}rYu_(O>oTq@Bd92o0eg_24rBPhiMZ%fqui2-Ed2q5=lf-RN- zzQAFR1BOlZqU=hNaN=eJ5}X9er)A01c{1QjzR1&TnWZ#%T%kpl36i7zz^fTfJ zkX;;YDKOc=GkEbvs;N}Yq9PzrdLGxxzW_6o59mj_Ap9gRqd3fVT!4@}|5CgnQYpy; zz7GZi&^P-i+2+uJ@?n$FMF0vA4xw}$VZ!zTj=*rs>@g_8Jz9q_RnJi|#Bq@BfX{kf z?8v+A6W&|s$u!yq*C1ieDgMBgA14K4fa0l*`-6J+!4Pcqp%no6RQO=ALA%t2;H~}I z6a~UW$CdrmUS3@BL-Lm@0_3;h?VN4pIT*>yj4)v#Gp4Y$v#Rgps7ql5&qhF!y-C1( z%&UE&Hv&=D<54zPB=T|- zFV6cjep|w$z;+2t>nxs(;;JdDXUrU_w~y`j;yI6GR#Vc|#@-7m6q|v?C?gg_2YgUX zwZ$E*iU8CD9=RkNH3A*!HzABIdjO>n!&L*z`MBy+B3yK~XInZz;sCxw$*2opj{a!| z?Nwm0;P8|?=|P*umE`w=I7?tqE1MkvmAgiVQmM5l49$L?cTgC0l36S_I1YUM$_@&H~xZd zZU&&c^?B5K!Q9i3`#q0@(J+)B>4$*?@s_!A

Yo%s0GCRVPdpeBDJGmh;XVnYTa-)= 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 @v`ofX2HbjRkUNC3ffC#OrX1% zd{0XRjFX$XV@PFiCBUC{?v7?w;?!w@`Q_#0bd)$ zDj+74SL9;bEi*0%t0_)cghT`((CB1q*>*ftJ1gY;sdrYpm57miNW>fdXCz(UAS(HG z(zJVB#{|<#=U{bnd@!K^enqzbh+D>7jmFioVNog*KQp9l|Iud^hiEORcOJ%4L5%Rm zFl|zF&2${9Mg-dBvTp#zgtXg;xm^Da1dzS775;Oz(IJdu@y|)?+7=}B)b54jx1lQjq|1-1%7&c)!bGAUNR8^m&U7s?!RapR>uz>ym`kpem9era=ATIN~(3EfET;snJ zBI*m}8PK&SE9@vGq(s@#n*-3n#ifXw=h)6HU#`aYP*suO{nQO&t(zb$S`K`~-?1kr zCXH!_N5D;y`;^PTHHuIL606T9*0Z#u?Gvj7n(CQF)^x%E61sz$p6P?DtZNNBogF26 z#BhO&3|reDtJ+UGrke5=!A&sHLU%@lrl4LiB19l%MUlwVnly=t&}zZXxk>riA%R{M zwEbMJn#es4*w&^*x;&dG*0^H&Asqc{iR*~G8S)iKR}#{ZDZp{PHVDhri7x=?8cD>R zQKqcoJP{ZLwJQ9FF^m@xF4=Ka=u^9mKHM%9wu4~re2XxrAmV@%JT&Jb>{a9G+$E5* zC}0L+djTXY3$ni9!m7e7SlK(1CqbKOmY35086P80szT!S-p6-M;QMdpJB;CbN&9O* zKujEM7c}DXP=aG0Ii~J$G!AfVGdvYYjBgg`yvMP9Q$Zj!!JQs+L(iP4)%ICK(HxTt zpXh>2ef9+dI5~i&97_-)}0!+J2%H9wgwrl21Y2&`1Y|%Pb;i7$Cu~_PAEOrhb5#ItU0`UT|3T_yOIh7cK z%ASJ+ONN$FQk$wdy+@VN>SVNaRd8NhmN9{ow^YOSLo<|@q!$ux;Rpg3&?93L)DA$x zNS=eh>$|rIdLg64r%4yJYX*mud=mTU;yf0Xb&nB}E6VSgtE?*dCiIz-gGj9U)ny zCr^$OH*5ng!<*ROsG{>9N-LmAMF%HI)`eeA+{UT1b-Y_%sM#GpGQYz<`mTgzE4C7M z$@k#oeUsql`$TWc4R1v~RJ>8q8Tcd3V2Wh)da$-B??n@VS@x&hsgiE)P5Ui%O}qXD zDU08zK@6HmR~4jQQ12p0`&_iY;HyP!)@;(9U`#)KF#TYsiFO|IPOB8B+z!)zL;C0w zY)e?e_v2;H^QbL4D|2eXf3Ql3^k`Wm-6dHbIBM`TKw+BMz_Re4<}2aMYvxKXl5Ph) zVDwPBsCqPyG(F?MP?Gn+{@9XSzMo6dz}*&hUv}fl61OVULc<1LRX3UD=E^NoC%;}o zc3x{K3VCEuoN84jwdKHT`Dj$azoB%*Nr88e#W - + @@ -247,30 +247,38 @@ for the JavaScript code in this tag.

Mesh Network: How to use it

When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

+
+ +
+

mesh_initial_login.jpg +

+
+
+

After a minute or two if you are within wifi range and there is at least one other user on the network then you should see additional icons appear on the desktop, such as Other Users and Chat.

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -280,9 +288,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -292,9 +300,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -317,9 +325,9 @@ When you are finished close the window and then select the Network Restart
-
-

Connecting to the internet

-
+
+

Connecting to the internet

+
@@ -350,9 +358,9 @@ Where myclient.ovpn comes from your VPN provider and with the password "<

-
-

Connecting two meshes over the internet via a VPN tunnel

-
+
+

Connecting two meshes over the internet via a VPN tunnel

+
@@ -387,9 +395,9 @@ From a deep packet inspection point of view the traffic going over the internet
-
-

Mobile devices (phones, etc)

-
+
+

Mobile devices (phones, etc)

+
@@ -419,9 +427,9 @@ On some android devices you may need to move the downloaded APK file from the
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh.

@@ -496,9 +504,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Collaborative document editing

-
+
+

Collaborative document editing

+

The mesh system includes the ability to collaboratively edit various sorts of documents using CryptPad. CryptPad is an almost peer-to-peer system in that it is designed for a client/server environment but that the server aspect of it is very minimal and limited to orchestrating the connected clients. With CryptPad installed on each mesh peer it effectively enables peer-to-peer collaborative editing. Documents are ephemeral and forgotten unless they're exported or copy-pasted to permanent storage.

@@ -529,9 +537,9 @@ If you have the chat system running you can then copy and paste the URL for your
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -566,9 +574,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -583,9 +591,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then select New blog entry and Ok. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From bafaec7e676ba29fdfd83b2193c69b67f68c6409 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 9 Dec 2017 23:07:47 +0000 Subject: [PATCH 50/64] Update mesh image hashes --- doc/EN/mesh_images.org | 4 ++-- website/EN/mesh_images.html | 42 ++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/doc/EN/mesh_images.org b/doc/EN/mesh_images.org index 0a3833da..8646716e 100644 --- a/doc/EN/mesh_images.org +++ b/doc/EN/mesh_images.org @@ -45,7 +45,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.x wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig gpg --verify freedombone-meshclient-i386.img.xz.sig sha256sum freedombone-meshclient-i386.img.xz -376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8 +3e88205461bb2061dc172ff0a1e65e5cae1013f8f7dc26c6d5cbe1c986c98555 unxz freedombone-meshclient-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync @@ -61,7 +61,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig sha256sum freedombone-meshclient-insecure-i386.img.xz -81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf +09c059664daf56d210134735d37e8117bb7b755acc8b9b253cdfa42052249ccb unxz freedombone-meshclient-insecure-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync diff --git a/website/EN/mesh_images.html b/website/EN/mesh_images.html index 4215d387..9a01bbc0 100644 --- a/website/EN/mesh_images.html +++ b/website/EN/mesh_images.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -246,13 +246,13 @@ for the JavaScript code in this tag.

Mesh Network: Images

-
-

Pre-built Disk Images

-
+
+

Pre-built Disk Images

+
-
-

Writing many images quickly

-
+
+

Writing many images quickly

+

There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

@@ -280,9 +280,9 @@ The MultiWriter tool is also available within mesh client images, so that you ca

-
-

Client images

-
+
+

Client images

+
@@ -301,7 +301,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.x wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig gpg --verify freedombone-meshclient-i386.img.xz.sig sha256sum freedombone-meshclient-i386.img.xz -376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8 +3e88205461bb2061dc172ff0a1e65e5cae1013f8f7dc26c6d5cbe1c986c98555 unxz freedombone-meshclient-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync @@ -322,7 +322,7 @@ wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig sha256sum freedombone-meshclient-insecure-i386.img.xz -81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf +09c059664daf56d210134735d37e8117bb7b755acc8b9b253cdfa42052249ccb unxz freedombone-meshclient-insecure-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync @@ -331,16 +331,16 @@ sudo dd bs=1M -

Router images

-
+
+

Router images

+

Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.

-
-

Beaglebone Black

-
+
+

Beaglebone Black

+
@@ -377,9 +377,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
-
-

Building Disk Images

-
+
+

Building Disk Images

+

It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.

From df33a127028040f5ba132fc47e9c8936f6df760e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 10 Dec 2017 12:22:39 +0000 Subject: [PATCH 51/64] Wait longer when initialising scuttlebot pub on mesh peer --- src/freedombone-image-mesh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index 44d3d940..7659b057 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -1292,10 +1292,11 @@ function initialise_scuttlebot_pub { systemctl daemon-reload systemctl start scuttlebot.service - sleep 3 + sleep 10 if [ ! -d /etc/scuttlebot/.ssb ]; then echo $'Scuttlebot config not generated' >> /var/log/${PROJECT_NAME}.log + systemctl status scuttlebot -l >> /var/log/${PROJECT_NAME}.log exit 73528 fi @@ -1320,6 +1321,7 @@ function initialise_scuttlebot_pub { echo '}' >> /etc/scuttlebot/.ssb/config chown scuttlebot:scuttlebot /etc/scuttlebot/.ssb/config systemctl restart scuttlebot.service + echo "scuttlebot pub started" >> /var/log/${PROJECT_NAME}.log } # whether to reset the identity From c9189104d5aca5e7ae7c83e744500d41c1b2fae4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 10 Dec 2017 15:20:13 +0000 Subject: [PATCH 52/64] vpn firewall settings appear to be needed for Patchwork to discover local peers --- src/freedombone-mesh-batman | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/freedombone-mesh-batman b/src/freedombone-mesh-batman index f385fe26..e44d58e7 100755 --- a/src/freedombone-mesh-batman +++ b/src/freedombone-mesh-batman @@ -454,22 +454,22 @@ function start { iptables -A INPUT -p tcp --dport 8008 -j ACCEPT iptables -A INPUT -p udp --dport 8010 -j ACCEPT iptables -A INPUT -p tcp --dport 8010 -j ACCEPT - if [[ "$ethernet_connected" != "0" ]]; then - # vpn over the internet - iptables -A INPUT -p tcp --dport 653 -j ACCEPT - iptables -A INPUT -p udp --dport 653 -j ACCEPT - iptables -A INPUT -i ${EIFACE} -m state --state NEW -p tcp --dport 1194 -j ACCEPT - iptables -A INPUT -i tun+ -j ACCEPT - iptables -A FORWARD -i tun+ -j ACCEPT - iptables -A FORWARD -i tun+ -o ${EIFACE} -m state --state RELATED,ESTABLISHED -j ACCEPT - iptables -A FORWARD -i ${EIFACE} -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT - iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ${EIFACE} -j MASQUERADE - iptables -A OUTPUT -o tun+ -j ACCEPT - echo 1 > /proc/sys/net/ipv4/ip_forward - sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf - sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf - sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf - fi + # vpn over the internet + # Note: the vpn firewall settings are needed in order for Patchwork + # to discover local peers + iptables -A INPUT -p tcp --dport 653 -j ACCEPT + iptables -A INPUT -p udp --dport 653 -j ACCEPT + iptables -A INPUT -i ${EIFACE} -m state --state NEW -p tcp --dport 1194 -j ACCEPT + iptables -A INPUT -i tun+ -j ACCEPT + iptables -A FORWARD -i tun+ -j ACCEPT + iptables -A FORWARD -i tun+ -o ${EIFACE} -m state --state RELATED,ESTABLISHED -j ACCEPT + iptables -A FORWARD -i ${EIFACE} -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT + iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ${EIFACE} -j MASQUERADE + iptables -A OUTPUT -o tun+ -j ACCEPT + echo 1 > /proc/sys/net/ipv4/ip_forward + sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf + sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf + sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf systemctl restart avahi-daemon From 1c377298ce10977aedc86cede8ee80dd633efd2a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 14:06:15 +0000 Subject: [PATCH 53/64] Bump riot version --- src/freedombone-app-riot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-riot b/src/freedombone-app-riot index c3e014d1..e0917123 100755 --- a/src/freedombone-app-riot +++ b/src/freedombone-app-riot @@ -33,7 +33,7 @@ VARIANTS='full full-vim chat' IN_DEFAULT_INSTALL=0 SHOW_ON_ABOUT=1 -RIOT_VERSION='0.13.0' +RIOT_VERSION='0.13.3' RIOT_FILENAME="riot-v${RIOT_VERSION}" RIOT_HASH='b65535c4c3bfe6407b491f55df238847884ab83a9d5cbdd1f8b4d6e31cbb5870' RIOT_DOWNLOAD_URL="https://github.com/vector-im/riot-web/releases/download/v${RIOT_VERSION}" From 57d5344d5b67058ada779ca495bf94063d2ff8b3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 14:08:23 +0000 Subject: [PATCH 54/64] Update riot hash --- src/freedombone-app-riot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-riot b/src/freedombone-app-riot index e0917123..a116aa4c 100755 --- a/src/freedombone-app-riot +++ b/src/freedombone-app-riot @@ -35,7 +35,7 @@ SHOW_ON_ABOUT=1 RIOT_VERSION='0.13.3' RIOT_FILENAME="riot-v${RIOT_VERSION}" -RIOT_HASH='b65535c4c3bfe6407b491f55df238847884ab83a9d5cbdd1f8b4d6e31cbb5870' +RIOT_HASH='bcd6c2f4be018612ac76a71b58749a5edab1e02de7d145a22d9b9aa6e6a89129' RIOT_DOWNLOAD_URL="https://github.com/vector-im/riot-web/releases/download/v${RIOT_VERSION}" RIOT_ONION_PORT=8115 RIOT_ONION_HOSTNAME= From ace9d9c5f994da7d013f68ed2e435374621dbd2b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 16:01:54 +0000 Subject: [PATCH 55/64] Script to remove users from matrix --- src/freedombone-app-matrix | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/freedombone-app-matrix b/src/freedombone-app-matrix index b1eae4fc..f3124072 100755 --- a/src/freedombone-app-matrix +++ b/src/freedombone-app-matrix @@ -334,7 +334,23 @@ function remove_user_matrix { ${PROJECT_NAME}-pass -u $remove_username --rmapp matrix - # TODO: There is no user removal script within synapse + read_config_param MY_USERNAME + read_config_param MATRIX_DOMAIN_NAME + + matrix_remove_user=/usr/bin/matrix-remove-user + echo '#!/bin/bash' > $matrix_remove_user + echo "cd $MATRIX_DATA_DIR" >> $matrix_remove_user + echo 'remove_username=$1' >> $matrix_remove_user + echo "ADMIN=\"@${MY_USERNAME}:$MATRIX_DOMAIN_NAME\"" >> $matrix_remove_user + echo 'BUSY="pragma busy_timeout=20000"' >> $matrix_remove_user + echo "BUFFER=\$(sqlite3 homeserver.db \"\$BUSY;select token from access_tokens where user_id like '\$ADMIN' order by id desc limit 1;\")" >> $matrix_remove_user + echo "TOKEN=\$(echo \$BUFFER|awk '{print \$2}')" >> $matrix_remove_user + echo 'set -x' >> $matrix_remove_user + echo "curl -X POST 'https://$MATRIX_DOMAIN_NAME/_matrix/client/r0/admin/deactivate/%40\$remove_username%3A$MATRIX_DOMAIN_NAME?access_token=\$TOKEN' --data '{}'" >> $matrix_remove_user + + chmod +x $matrix_remove_user + + $matrix_remove_user "$remove_username" } function add_user_matrix { From 3fb870a6fffc36abe7cc84c64778159dd0fb86c4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 16:06:44 +0000 Subject: [PATCH 56/64] Separate matrix user removal script generation --- src/freedombone-app-matrix | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/freedombone-app-matrix b/src/freedombone-app-matrix index f3124072..31d8c1af 100755 --- a/src/freedombone-app-matrix +++ b/src/freedombone-app-matrix @@ -329,11 +329,7 @@ function matrix_generate { matrix_configure_homeserver_yaml "${turnkey}" $homeserver_config } -function remove_user_matrix { - remove_username="$1" - - ${PROJECT_NAME}-pass -u $remove_username --rmapp matrix - +function create_matrix_user_removal_script { read_config_param MY_USERNAME read_config_param MATRIX_DOMAIN_NAME @@ -349,7 +345,13 @@ function remove_user_matrix { echo "curl -X POST 'https://$MATRIX_DOMAIN_NAME/_matrix/client/r0/admin/deactivate/%40\$remove_username%3A$MATRIX_DOMAIN_NAME?access_token=\$TOKEN' --data '{}'" >> $matrix_remove_user chmod +x $matrix_remove_user +} +function remove_user_matrix { + remove_username="$1" + + create_matrix_user_removal_script + ${PROJECT_NAME}-pass -u $remove_username --rmapp matrix $matrix_remove_user "$remove_username" } @@ -796,6 +798,7 @@ function install_matrix { echo $'Failed to add matrix admin user'; exit 879352 fi + create_matrix_user_removal_script set_completion_param "matrix domain" "$MATRIX_DOMAIN_NAME" From ae60e38cc7eb3bafd208883f771b03339676b393 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 20:15:05 +0000 Subject: [PATCH 57/64] Install git-ssb with scuttlebot --- src/freedombone-app-scuttlebot | 9 ++++++++- src/freedombone-image-customise | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index 85e58e60..cdfe6440 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -197,9 +197,13 @@ function remove_scuttlebot { } function mesh_install_scuttlebot { + get_npm_arch + cat < $rootdir/usr/bin/install_scuttlebot #!/bin/bash -npm install -g scuttlebot@${SCUTTLEBOT_VERSION} +npm install --arch=$NPM_ARCH -g scuttlebot@${SCUTTLEBOT_VERSION} +npm install --arch=$NPM_ARCH -g git-ssb +npm install --arch=$NPM_ARCH -g git-remote-ssb EOF chroot "$rootdir" /bin/chmod +x /usr/bin/install_scuttlebot chroot "$rootdir" /usr/bin/install_scuttlebot @@ -245,6 +249,9 @@ function install_scuttlebot { exit 528253 fi + npm install -g git-ssb + npm install -g git-remote-ssb + if [ ! -d /etc/scuttlebot ]; then mkdir -p /etc/scuttlebot fi diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index c745299f..b0fb7868 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -588,7 +588,8 @@ cd /etc/patchwork npm install --arch=$NPM_ARCH --build-from-source npm install --arch=$NPM_ARCH --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild -npm install --arch=$NPM_ARCH git-ssb +npm install --arch=$NPM_ARCH -g git-ssb --registry=http://localhost:8043/ +#npm install --arch=$NPM_ARCH git-ssb EOF chroot "$rootdir" /bin/chmod +x /usr/bin/install_patchwork chroot "$rootdir" /usr/bin/install_patchwork From 2370f3232360cf5f2d11683812bd6e39c271b446 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 11 Dec 2017 22:05:50 +0000 Subject: [PATCH 58/64] Deprecate smilodon for now --- src/freedombone-app-smilodon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-app-smilodon b/src/freedombone-app-smilodon index 76724073..6d759e07 100755 --- a/src/freedombone-app-smilodon +++ b/src/freedombone-app-smilodon @@ -28,7 +28,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -VARIANTS='full full-vim social' +VARIANTS='' IN_DEFAULT_INSTALL=0 SHOW_ON_ABOUT=1 From 70b0430bc54d55d172914af3b26a019872dec390 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 12 Dec 2017 16:35:14 +0000 Subject: [PATCH 59/64] Enable web user interface for git ssb via scuttlebot app --- src/freedombone-app-scuttlebot | 99 +++++++++++++++++++++++++++++++++- src/freedombone-mesh-batman | 4 ++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index cdfe6440..03b1e421 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -35,8 +35,13 @@ IN_DEFAULT_INSTALL=0 SHOW_ON_ABOUT=0 SHOW_ICANN_ADDRESS_ON_ABOUT=0 +SCUTTLEBOT_DOMAIN_NAME= +SCUTTLEBOT_CODE= SCUTTLEBOT_VERSION='10.4.6' SCUTTLEBOT_PORT=8010 +SCUTTLEBOT_ONION_PORT=8623 +GIT_SSB_PORT=7718 +NGINX_GIT_SSB_PORT=7719 scuttlebot_variables=(MY_USERNAME DEFAULT_DOMAIN_NAME @@ -91,7 +96,13 @@ function add_user_scuttlebot { } function install_interactive_scuttlebot { - echo -n '' + if [[ $ONION_ONLY != "no" ]]; then + SCUTTLEBOT_DOMAIN_NAME='scuttlebot.local' + write_config_param "SCUTTLEBOT_DOMAIN_NAME" "$SCUTTLEBOT_DOMAIN_NAME" + else + function_check interactive_site_details + interactive_site_details scuttlebot + fi APP_INSTALLED=1 } @@ -180,6 +191,10 @@ function restore_remote_scuttlebot { function remove_scuttlebot { firewall_remove ${SCUTTLEBOT_PORT} + firewall_remove ${GIT_SSB_PORT} + + nginx_dissite ${SCUTTLEBOT_DOMAIN_NAME} + rm /etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} systemctl stop scuttlebot systemctl disable scuttlebot @@ -196,7 +211,81 @@ function remove_scuttlebot { sed -i '/scuttlebot /d' $COMPLETION_FILE } +function scuttlebot_git_setup { + if [[ "$1" == "mesh" ]]; then + git_ssb_nginx_site=$rootdir/etc/nginx/sites-available/git_ssb + echo 'server {' > $git_ssb_nginx_site + echo " listen $NGINX_GIT_SSB_PORT default_server;" >> $git_ssb_nginx_site + echo " server_name P${PEER_ID}.local;" >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + echo ' access_log /dev/null;' >> $git_ssb_nginx_site + echo ' error_log /dev/null;' >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + echo ' add_header X-XSS-Protection "1; mode=block";' >> $git_ssb_nginx_site + echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site + echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site + else + git_ssb_nginx_site=/etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} + function_check nginx_http_redirect + nginx_http_redirect $SCUTTLEBOT_DOMAIN_NAME "index index.html" + echo 'server {' >> $git_ssb_nginx_site + echo ' listen 443 ssl;' >> $git_ssb_nginx_site + echo ' listen [::]:443 ssl;' >> $git_ssb_nginx_site + echo " server_name $SCUTTLEBOT_DOMAIN_NAME;" >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + function_check nginx_compress + nginx_compress $SCUTTLEBOT_DOMAIN_NAME + echo '' >> $git_ssb_nginx_site + echo ' # Security' >> $git_ssb_nginx_site + function_check nginx_ssl + nginx_ssl $SCUTTLEBOT_DOMAIN_NAME + + function_check nginx_disable_sniffing + nginx_disable_sniffing $SCUTTLEBOT_DOMAIN_NAME + fi + + echo '' >> $git_ssb_nginx_site + echo ' location = / {' >> $git_ssb_nginx_site + echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site + echo ' proxy_set_header X-Real-IP $remote_addr;' >> $git_ssb_nginx_site + echo ' proxy_set_header Host $host;' >> $git_ssb_nginx_site + echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $git_ssb_nginx_site + echo ' proxy_http_version 1.1;' >> $git_ssb_nginx_site + echo ' proxy_set_header Upgrade $http_upgrade;' >> $git_ssb_nginx_site + echo ' proxy_set_header Connection upgrade;' >> $git_ssb_nginx_site + echo ' }' >> $git_ssb_nginx_site + echo '}' >> $git_ssb_nginx_site + + if [ $SCUTTLEBOT_ONION_HOSTNAME ]; then + echo '' >> $git_ssb_nginx_site + echo 'server {' >> $git_ssb_nginx_site + echo " listen 127.0.0.1:${SCUTTLEBOT_ONION_PORT} default_server;" >> $git_ssb_nginx_site + echo " server_name ${SCUTTLEBOT_ONION_HOSTNAME};" >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + echo ' access_log /dev/null;' >> $git_ssb_nginx_site + echo ' error_log /dev/null;' >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + echo ' add_header X-XSS-Protection "1; mode=block";' >> $git_ssb_nginx_site + echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site + echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site + echo ' location = / {' >> $git_ssb_nginx_site + echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site + echo ' proxy_set_header X-Real-IP $remote_addr;' >> $git_ssb_nginx_site + echo ' proxy_set_header Host $host;' >> $git_ssb_nginx_site + echo ' proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' >> $git_ssb_nginx_site + echo ' proxy_http_version 1.1;' >> $git_ssb_nginx_site + echo ' proxy_set_header Upgrade $http_upgrade;' >> $git_ssb_nginx_site + echo ' proxy_set_header Connection upgrade;' >> $git_ssb_nginx_site + echo ' }' >> $git_ssb_nginx_site + echo '}' >> $git_ssb_nginx_site + fi + nginx_ensite git_ssb +} + function mesh_install_scuttlebot { + SCUTTLEBOT_ONION_HOSTNAME= + get_npm_arch cat < $rootdir/usr/bin/install_scuttlebot @@ -238,6 +327,8 @@ EOF echo '' >> $rootdir/etc/systemd/system/scuttlebot.service echo '[Install]' >> $rootdir/etc/systemd/system/scuttlebot.service echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/scuttlebot.service + + scuttlebot_git_setup mesh } function install_scuttlebot { @@ -316,6 +407,12 @@ function install_scuttlebot { systemctl restart scuttlebot.service firewall_add scuttlebot ${SCUTTLEBOT_PORT} + firewall_add git_ssb ${GIT_SSB_PORT} + + + SCUTTLEBOT_ONION_HOSTNAME=$(add_onion_service scuttlebot 80 ${SCUTTLEBOT_ONION_PORT}) + scuttlebot_git_setup + systemctl restart nginx if ! grep -q "scuttlebot version:" ${COMPLETION_FILE}; then echo "scuttlebot version:${SCUTTLEBOT_VERSION}" >> ${COMPLETION_FILE} diff --git a/src/freedombone-mesh-batman b/src/freedombone-mesh-batman index e44d58e7..63015531 100755 --- a/src/freedombone-mesh-batman +++ b/src/freedombone-mesh-batman @@ -71,6 +71,8 @@ TOX_PORT=33445 TRACKER_PORT=6969 LIBREVAULT_PORT=42345 TAHOELAFS_PORT=50213 +GIT_SSB_PORT=7718 +NGINX_GIT_SSB_PORT=7719 # Ethernet bridge definition (bridged to bat0) BRIDGE=br-mesh @@ -178,6 +180,7 @@ function stop { iptables -D INPUT -p udp --dport $LIBREVAULT_PORT -j ACCEPT iptables -D INPUT -p tcp --dport $TAHOELAFS_PORT -j ACCEPT # SSB/Scuttlebot/Patchwork + iptables -D INPUT -p tcp --dport $GIT_SSB_PORT -j ACCEPT iptables -D INPUT -p udp --dport 8008 -j ACCEPT iptables -D INPUT -p tcp --dport 8008 -j ACCEPT iptables -D INPUT -p udp --dport 8010 -j ACCEPT @@ -450,6 +453,7 @@ function start { iptables -A INPUT -p udp --dport $LIBREVAULT_PORT -j ACCEPT iptables -A INPUT -p tcp --dport $TAHOELAFS_PORT -j ACCEPT # SSB/Scuttlebot/Patchwork + iptables -A INPUT -p tcp --dport $GIT_SSB_PORT -j ACCEPT iptables -A INPUT -p udp --dport 8008 -j ACCEPT iptables -A INPUT -p tcp --dport 8008 -j ACCEPT iptables -A INPUT -p udp --dport 8010 -j ACCEPT From 8d069c53ee202b95ee621f5b244570c738c44669 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 12 Dec 2017 17:35:26 +0000 Subject: [PATCH 60/64] Create tls cert for scuttlebot --- src/freedombone-app-scuttlebot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index 03b1e421..c2a20dcd 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -412,6 +412,10 @@ function install_scuttlebot { SCUTTLEBOT_ONION_HOSTNAME=$(add_onion_service scuttlebot 80 ${SCUTTLEBOT_ONION_PORT}) scuttlebot_git_setup + + function_check create_site_certificate + create_site_certificate ${SCUTTLEBOT_DOMAIN_NAME} 'yes' + systemctl restart nginx if ! grep -q "scuttlebot version:" ${COMPLETION_FILE}; then From 59121900409ad28baed360a0edd3c9403ffee6c5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 12 Dec 2017 17:46:38 +0000 Subject: [PATCH 61/64] scuttlebot domain variables --- src/freedombone-app-scuttlebot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index c2a20dcd..b96403b2 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -44,6 +44,8 @@ GIT_SSB_PORT=7718 NGINX_GIT_SSB_PORT=7719 scuttlebot_variables=(MY_USERNAME + SCUTTLEBOT_DOMAIN_NAME + SCUTTLEBOT_CODE DEFAULT_DOMAIN_NAME SYSTEM_TYPE) @@ -225,6 +227,9 @@ function scuttlebot_git_setup { echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site else + if [ ! $SCUTTLEBOT_DOMAIN_NAME ]; then + exit 7357225 + fi git_ssb_nginx_site=/etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} function_check nginx_http_redirect nginx_http_redirect $SCUTTLEBOT_DOMAIN_NAME "index index.html" From 92a26a388c59cb1db05e4e0333898e0901d9f470 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 12 Dec 2017 17:47:39 +0000 Subject: [PATCH 62/64] Disable scuttlebot site if it exists --- src/freedombone-app-scuttlebot | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index b96403b2..a77949c3 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -195,8 +195,10 @@ function remove_scuttlebot { firewall_remove ${SCUTTLEBOT_PORT} firewall_remove ${GIT_SSB_PORT} - nginx_dissite ${SCUTTLEBOT_DOMAIN_NAME} - rm /etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} + if [ $SCUTTLEBOT_DOMAIN_NAME ]; then + nginx_dissite ${SCUTTLEBOT_DOMAIN_NAME} + rm /etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} + fi systemctl stop scuttlebot systemctl disable scuttlebot From 42f0a4befc0d1072b20bacf433ed530f4d30e2ac Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 12 Dec 2017 22:22:08 +0000 Subject: [PATCH 63/64] Script to create git-ssb repos --- src/freedombone-app-scuttlebot | 71 ++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index a77949c3..0289adaf 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -200,8 +200,11 @@ function remove_scuttlebot { rm /etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} fi + systemctl stop git_ssb systemctl stop scuttlebot + systemctl disable git_ssb systemctl disable scuttlebot + rm /etc/systemd/system/git_ssb.service rm /etc/systemd/system/scuttlebot.service systemctl daemon-reload @@ -210,13 +213,44 @@ function remove_scuttlebot { if [ -d /etc/scuttlebot ]; then rm -rf /etc/scuttlebot fi + if [ -f /usr/bin/git-ssb-create ]; then + rm /usr/bin/git-ssb-create + fi remove_completion_param install_scuttlebot sed -i '/scuttlebot /d' $COMPLETION_FILE } +function git_ssb_script { + if [[ "$1" == "mesh" ]]; then + git_ssb_script_name=$rootdir/usr/bin/git-ssb-create + else + git_ssb_script_name=/usr/bin/git-ssb-create + fi + echo '#!/bin/bash' > $git_ssb_script_name + echo 'reponame="$1"' >> $git_ssb_script_name + echo '' >> $git_ssb_script_name + echo 'if [[ "$reponame" != "" ]]; then' >> $git_ssb_script_name + echo ' mkdir $reponame' >> $git_ssb_script_name + echo ' cd $reponame' >> $git_ssb_script_name + echo ' git ssb create ssb $reponame' >> $git_ssb_script_name + echo ' git push --tags ssb master' >> $git_ssb_script_name + echo 'fi' >> $git_ssb_script_name + echo 'exit 0' >> $git_ssb_script_name + chmod +x $git_ssb_script_name +} + function scuttlebot_git_setup { if [[ "$1" == "mesh" ]]; then + if [ ! -d $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight ]; then + mkdir $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight + fi + if [ ! -f $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css ]; then + echo $'Could not find foundation.css' + exit 347687245 + fi + cp $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css $rootdir/usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight/foundation.css + git_ssb_nginx_site=$rootdir/etc/nginx/sites-available/git_ssb echo 'server {' > $git_ssb_nginx_site echo " listen $NGINX_GIT_SSB_PORT default_server;" >> $git_ssb_nginx_site @@ -232,6 +266,16 @@ function scuttlebot_git_setup { if [ ! $SCUTTLEBOT_DOMAIN_NAME ]; then exit 7357225 fi + + if [ ! -d /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight ]; then + mkdir /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight + fi + if [ ! -f /usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css ]; then + echo $'Could not find foundation.css' + exit 347687245 + fi + cp /usr/local/lib/node_modules/git-ssb/node_modules/highlight.js/styles/foundation.css /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web/highlight/foundation.css + git_ssb_nginx_site=/etc/nginx/sites-available/${SCUTTLEBOT_DOMAIN_NAME} function_check nginx_http_redirect nginx_http_redirect $SCUTTLEBOT_DOMAIN_NAME "index index.html" @@ -251,6 +295,8 @@ function scuttlebot_git_setup { nginx_disable_sniffing $SCUTTLEBOT_DOMAIN_NAME fi + echo '' >> $git_ssb_nginx_site + echo ' root /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web;' >> $git_ssb_nginx_site echo '' >> $git_ssb_nginx_site echo ' location = / {' >> $git_ssb_nginx_site echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site @@ -276,6 +322,8 @@ function scuttlebot_git_setup { echo ' add_header X-Content-Type-Options nosniff;' >> $git_ssb_nginx_site echo ' add_header X-Frame-Options SAMEORIGIN;' >> $git_ssb_nginx_site echo '' >> $git_ssb_nginx_site + echo ' root /usr/local/lib/node_modules/git-ssb/node_modules/git-ssb-web;' >> $git_ssb_nginx_site + echo '' >> $git_ssb_nginx_site echo ' location = / {' >> $git_ssb_nginx_site echo " proxy_pass http://localhost:${GIT_SSB_PORT};" >> $git_ssb_nginx_site echo ' proxy_set_header X-Real-IP $remote_addr;' >> $git_ssb_nginx_site @@ -336,6 +384,7 @@ EOF echo 'WantedBy=multi-user.target' >> $rootdir/etc/systemd/system/scuttlebot.service scuttlebot_git_setup mesh + git_ssb_script mesh } function install_scuttlebot { @@ -375,6 +424,24 @@ function install_scuttlebot { echo '[Install]' >> /etc/systemd/system/scuttlebot.service echo 'WantedBy=multi-user.target' >> /etc/systemd/system/scuttlebot.service + echo '[Unit]' > /etc/systemd/system/git_ssb.service + echo 'Description=Git SSB (SSB git web interface)' >> /etc/systemd/system/git_ssb.service + echo 'After=syslog.target' >> /etc/systemd/system/git_ssb.service + echo 'After=network.target' >> /etc/systemd/system/git_ssb.service + echo 'After=scuttlebot.target' >> /etc/systemd/system/git_ssb.service + echo '' >> /etc/systemd/system/git_ssb.service + echo '[Service]' >> /etc/systemd/system/git_ssb.service + echo 'Type=simple' >> /etc/systemd/system/git_ssb.service + echo 'User=scuttlebot' >> /etc/systemd/system/git_ssb.service + echo 'Group=scuttlebot' >> /etc/systemd/system/git_ssb.service + echo "WorkingDirectory=/etc/scuttlebot" >> /etc/systemd/system/git_ssb.service + echo "ExecStart=/usr/bin/git ssb web --public localhost:$GIT_SSB_PORT" >> /etc/systemd/system/git_ssb.service + echo 'Restart=always' >> /etc/systemd/system/git_ssb.service + echo 'Environment="USER=scuttlebot"' >> /etc/systemd/system/git_ssb.service + echo '' >> /etc/systemd/system/git_ssb.service + echo '[Install]' >> /etc/systemd/system/git_ssb.service + echo 'WantedBy=multi-user.target' >> /etc/systemd/system/git_ssb.service + chown -R scuttlebot:scuttlebot /etc/scuttlebot # files gw_name myhostname mdns4_minimal [NOTFOUND=return] dns @@ -384,6 +451,9 @@ function install_scuttlebot { systemctl enable scuttlebot.service systemctl daemon-reload systemctl start scuttlebot.service + systemctl enable git_ssb.service + systemctl daemon-reload + systemctl start git_ssb.service sleep 3 @@ -419,6 +489,7 @@ function install_scuttlebot { SCUTTLEBOT_ONION_HOSTNAME=$(add_onion_service scuttlebot 80 ${SCUTTLEBOT_ONION_PORT}) scuttlebot_git_setup + git_ssb_script function_check create_site_certificate create_site_certificate ${SCUTTLEBOT_DOMAIN_NAME} 'yes' From 26827ae286c8e1f453add999f29520d33165db41 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 15 Dec 2017 16:20:42 +0000 Subject: [PATCH 64/64] Change a couple of xmpp server addresses --- src/freedombone-app-scuttlebot | 1 + src/freedombone-app-xmpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/freedombone-app-scuttlebot b/src/freedombone-app-scuttlebot index 0289adaf..97b60433 100755 --- a/src/freedombone-app-scuttlebot +++ b/src/freedombone-app-scuttlebot @@ -233,6 +233,7 @@ function git_ssb_script { echo 'if [[ "$reponame" != "" ]]; then' >> $git_ssb_script_name echo ' mkdir $reponame' >> $git_ssb_script_name echo ' cd $reponame' >> $git_ssb_script_name + echo ' git init' >> $git_ssb_script_name echo ' git ssb create ssb $reponame' >> $git_ssb_script_name echo ' git push --tags ssb master' >> $git_ssb_script_name echo 'fi' >> $git_ssb_script_name diff --git a/src/freedombone-app-xmpp b/src/freedombone-app-xmpp index f141533a..eb5323cc 100755 --- a/src/freedombone-app-xmpp +++ b/src/freedombone-app-xmpp @@ -645,9 +645,9 @@ function xmpp_onion_addresses { echo ' ["jabber-germany.de"] = "dbbrphko5tqcpar3.onion";' >> $filename echo ' ["kode.im"] = "ihkw7qy3tok45dun.onion";' >> $filename echo ' ["im.koderoot.net"] = "ihkw7qy3tok45dun.onion";' >> $filename - echo ' ["adb-centralen.se"] = "37x6i3wgr2jyublb.onion";' >> $filename + echo ' ["adb-centralen.se"] = "qai7jjjnhbrdiexf.onion";' >> $filename echo ' ["joelpurra.se"] = "37x6i3wgr2jyublb.onion";' >> $filename - echo ' ["nordberg.se"] = "37x6i3wgr2jyublb.onion";' >> $filename + echo ' ["nordberg.se"] = "qai7jjjnhbrdiexf.onion";' >> $filename echo ' ["jabber.lqdn.fr"] = "jabber63t4r2qi57.onion";' >> $filename echo ' ["jabber.otr.im"] = "5rgdtlawqkcplz75.onion";' >> $filename echo ' ["otromundo.cf"] = "arauemwe2utqqzye.onion";' >> $filename