prey.orig/0000775000175100017510000000000012250331650012341 5ustar guerreguerreprey.orig/core/0000775000175100017510000000000012250331650013271 5ustar guerreguerreprey.orig/core/base0000664000175100017510000000102312250331650014122 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Base File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### . "$base_path/core/framework" . "$base_path/core/setup" . "$base_path/core/functions" . "$base_path/core/pull" . "$base_path/core/updater" . "$base_path/core/response" . "$base_path/core/modules" . "$base_path/core/push" . "$base_path/core/actions" . "$base_path/core/on_demand" prey.orig/core/pull0000664000175100017510000000635212250331650014176 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Pull Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### readonly cipher_algorithm="aes-128-cbc" # returns if we have have network access, otherwise 0 check_net_status(){ log ' -- Looking for connection...' local net_check_target="www.google.com" if [ "$os" == "windows" ]; then local ping_cmd="$SYSTEMROOT/system32/ping -n" else local ping_cmd="ping -q -c" fi connected=$($ping_cmd 1 $net_check_target &> /dev/null && echo 1 || echo 0) # if there's no connection with ping, lets try to see if curl gets through # since some routers/networks block ICMP requests if [ $connected == 0 ]; then log ' -- Trying alternate method...' send_request "$net_check_target" "--connect-timeout 3" [ -n "$response_status" ] && connected=1 fi } randomize_subdomain(){ check_url=$(echo $check_url | sed "s/\/\//\/\/$RANDOM./") } # we could eventually use a different method for status checking check_device_status(){ if [ "$post_method" == 'http' ]; then request_headers="-H X-Encrypt-Response:${cipher_algorithm}" if [ -n "$device_key" ]; then local check_url="$check_url/devices/$device_key.xml" else error_exit "You need to enter your Device Key for querying the Control Panel!" fi [ "$randomize_check_host" == 'y' ] && randomize_subdomain fi send_request "$check_url" "$request_headers" check_encrypted_response } check_encrypted_response(){ [[ "$response_status" != "200" && "$response_status" != "404" ]] && return 1 local content_type=$(get_header_value 'Content-Type') if [[ -n "$(find_in "$content_type" 'xml')" && -z "$(find_in "$response_body" ' /dev/null) [ $? == 1 ] && error_exit "Unable to decrypt response correctly! Exiting..." fi } verify_keys(){ send_request "$control_panel_url/devices.xml" "-u $api_key:x" if [[ "$response_status" == "200" || "$response_status" == "404" ]]; then log ' ** API key is valid. Your user account is correctly set up.' local device_state=$(echo "$response_body" | grep $device_key -A1 | tail -1 | sed 's/<[^>]*>//g;s/ //g') if [ -n "$device_state" ]; then log " ** Device key is valid. Good. Current status is ${bold}${device_state}${bold_end}.\n" return 0 else log " !! Device key not valid!\n -> We couldn't find this device on your Control Panel account. Please reconfigure your settings, or reinstall if necessary.\n" fi elif [ "$response_status" == "401" ]; then log " !! API key not valid! Got $response_status status code.\n -> Remember to check your inbox to verify your account. If you already have you should reconfigure your settings, or reinstall if necessary.\n" else log " !! Got unexpected response status: ${response_status}.\n" [ -z "$response_headers" ] && log "It seems your PC is unable to reach the Control Panel. Please check your firewall settings so that Curl can connect to $control_panel_url over port 80 (HTTP).\n" fi return 1 } prey.orig/core/push0000664000175100017510000001032012250331650014167 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Push Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### update_device_info_with(){ [ -z "$device_key" ] && return 1 log ' -- Updating device info...' send_request "$check_url/devices/$device_key.xml" "--connect-timeout 10 -X PUT -u $api_key:x -d "$1"" if [ "$response_status" == "200" ]; then log " -- Device updated." elif [ "$response_status" == "422" ]; then log " -- Couldn't update your device. Seems some data was missing or incorrectly sent." else log " -- Couldn't update your device. Got status code ${response_status}." fi } deactivate_modules_on_panel(){ [ -z "$device_key" ] && return 1 log " -- Deactivating module(s) ${1} on Control Panel..." local param_string="" until [ -z "$1" ]; do local param_string="${param_string}device[deactivate_modules][]=$1&" shift done update_device_info_with "$param_string" } send_report(){ log ' -- Packing all gathered traces...' [ "$post_method" == "http" ] && trace_list=$(generate_query_string 'traces') || trace_list=$(generate_list 'traces') file_list=$(list_files) if [[ $trace_list || $file_list ]]; then if [ -n "$test_mode" ]; then log ' ** This is where the data gets sent. Not in test mode though!' else trace_file="$tmpdir/prey_traces.tmp" echo -e "$trace_list" > "$trace_file" log " -- Posting data via $post_method..." eval 'send_via_'"${post_method}"'' local rs=$? rm -f "$trace_file" 2> /dev/null fi remove_traces remove_files else log " -- No data to send. It seems you didn't activate any report modules. Skipping..." fi return $rs } send_via_email(){ local complete_subject="$mail_subject @ $(date +"%a, %e %B %Y %T %z")" local decrypted_pass=$(decrypt "$smtp_password") echo -e "${EMAIL_NOTICE}${EMAIL_HEADER}$(urldecode "$trace_list")${EMAIL_FOOTER}" > "$trace_file.msg" # only add user/pass if set if [ -n "$smtp_username" ]; then response=$(mailsender -f "$mail_from" -t "$mail_to" -u "$complete_subject" -s $smtp_server -a $file_list -o message-file="$trace_file.msg" tls=auto username="$smtp_username" password="$decrypted_pass") else response=$(mailsender -f "$mail_from" -t "$mail_to" -u "$complete_subject" -s $smtp_server -a $file_list -o message-file="$trace_file.msg" tls=auto) fi if [ -n "$(find_in "$response" 'ERROR')" ]; then log "$STRING_ERROR_EMAIL" log "\n This is the complete error message: \n $response\n" else log ' -- Report successfully sent! Check your inbox now.' fi rm "$trace_file.msg" } send_via_http(){ if [ -z "$api_key" ]; then log ' -- API key not set! Cannot post data to server.' return 1 else local args="-u $api_key:x" fi if [ -n $(find_in "$post_url" "https:") ]; then log " -- Using SSL encryption." [ -z $(find_in "$post_url" "$control_panel_url") ] && args="$args -k" fi send_request "$post_url" "$args -K "$trace_file" $file_list" log " -- $response_body" } send_via_scp(){ if [[ -n "$scp_server" && -n "$scp_path" ]]; then log " -- Uploading the stuff to $scp_path in $scp_server..." local new_folder="prey_data_$(echo $start_time | sed 'y/ :/_-/')" ssh $scp_user@$scp_server mkdir $scp_path/$new_folder response=$(scp $ssh_options "$trace_file" $file_list $scp_user@$scp_server:$scp_path/$new_folder) else log ' !! You need to set up a server in order to send the report via SCP!' fi } # SFTP posting by http://github.com/birdtori send_via_sftp(){ if [[ -n "$sftp_server" && -n "$sftp_path" ]]; then local new_folder="prey_data_$(echo $start_time | sed 'y/ :/_-/')" log " -- Uploading the stuff to $sftp_path/$new_folder in $sftp_server..." local batch="$tmpdir/sftp.script" echo "mkdir $sftp_path/$new_folder" > "$batch" echo "put "$trace_file" $sftp_path/$new_folder/" >> "$batch" for f in $file_list; do echo "put $f $sftp_path/$new_folder/" >> "$batch"; done echo "bye" >> "$batch" response=$(sftp $ssh_options -b $batch $sftp_user@$sftp_server) else log ' !! You need to set up a server in order to send the report via SFTP!' fi } prey.orig/core/framework0000664000175100017510000001056712250331650015222 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Bash Framework Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### #################################################################### # string and integer functions #################################################################### # echoes 1 if needle is found in haystack, expects haystack as $1, needle as $2 # usage find_in 'foobar' 'foo' -> echoes 1 find_in(){ echo "${1}" | grep "${2}" 1>/dev/null && echo 1 || return 0 } # returns 1 if int/float is greater than the second one, expects int/float at $1 and $2 is_greater_than() { echo "$1 $2" | awk '{if ($1 > $2) print 1; else print 0}' } # returns lowercased string, expects string as $1 lowercase(){ echo "$1" | sed "y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/" } # returns capitalized string, expects string as $1 capitalize(){ #echo "$1" | sed -r 's/\b(.)/\U\1/g' echo "$1" | awk '{for(i=1;i<=NF;i++)sub(/./,toupper(substr($i,1,1)),$i)}1' } get_in_quotes(){ echo "$1" | sed "s/.*$2=\"\([^\"]*\)\".*/\1/" } get_json_val(){ echo "$1" | sed -e "s/.*$2\":\([^},]*\).*/\1/" -e "s/^ //" -e "s/ $//" -e 's/^"//' -e 's/"$//' } # returns a urlencoded string, expects string as $1 urlencode(){ echo "$1" | tr $line_breaker "^" | sed -e 's/\//%2F/g;s/%/%25/g;s/ /%20/g;s/!/%21/g;s/"/%22/g;s/#/%23/g;s/\$/%24/g;s/\&/%26/g;s/=/%3D/g;s/'\''/%27/g;s/(/%28/g;s/)/%29/g' -e "s/\^$//;s/\^/%0A/g" } urldecode(){ echo "$1" | sed "s/%0A/\n/g;s/%20/ /g;s/%3F/\?/g;s/%22/\"/g;s/%28/\(/g;s/%29/\)/g;s/%26/\&/g;s/%3D/\=/g" } # returns the md5 hash for a string, expects string as $1 md5_hash_for(){ [ "$os" == "mac" ] && local cmd='/sbin/md5 -r' || local cmd='md5sum' echo -n "$1" | $cmd | sed 's/.*\([a-f0-9]\{32\}\).*/\1/' } # returns base64 encoded string, expects string as $1 encrypt(){ echo -n "$1" | openssl enc -base64 } # returns base64 decoded string, expects string as $1 decrypt(){ echo "$1" | openssl enc -base64 -d } #################################################################### # file functions #################################################################### # returns file size for file, expects /path/file as $1 file_size(){ cat "$1" | wc -c } # checks if file was modified in the last n minutes # usage: was_file_modified /path/to/file.txt 2 # returns 1 if true was_file_modified(){ local dir=`dirname $1` local file=`basename $1` cd "$dir" find . -maxdepth 1 -mmin -$2 -name "$file" | grep "$file" > /dev/null && echo 1 cd - > /dev/null } # returns the absolute path for a relative path, expects relative path as $1 full_path(){ if [ "$1" != '.' ]; then cd "$1" echo $PWD cd - &> /dev/null else echo $PWD fi } # creates the temp dir for local file and trace storage # $tmpdir should be already set from the setup routine create_tmpdir(){ if [ ! -d "$tmpdir" ]; then mkdir -p "$tmpdir" 2> /dev/null # we need to give access to the logged in user in order to save files if [ "`whoami`" != "$logged_user" ]; then chmod 777 "$tmpdir" 2> /dev/null fi fi } # deletes the temp dir at $tmpdir delete_tmpdir(){ rm -Rf "$tmpdir" 2> /dev/null } #################################################################### # utility functions for managing processes #################################################################### # checks if a function is defined. if not, return status is 1 (get with $?) function_exists() { type $1 2> /dev/null | grep -q 'is a function' } # echoes 1 if process is running, expects process full name (eg. 'firefox-bin') is_process_running(){ $processes | grep -v grep | grep "$1" > /dev/null && echo 1 } # returns number of instances of a process, expects process full name number_of_instances_of(){ $processes | grep -v grep | grep -v $$ | grep "$1" | wc -l } # returns pid for the requested process, expects the full process name get_pid(){ if [ "$os" == "windows" ]; then tasklist | grep "$1" | head -1 | sed 's/[a-z\. ]*\([0-9]*\).*/\1/' else ps ax | grep -i "$1" | grep -v grep | head -1 | sed 's/ \?\([0-9]*\).*/\1/' fi } # sends sigterm to specified process, unless a specific signal is passed as $2 term_process(){ local pid=$(get_pid $1) [ -n "$pid" ] && kill $2 $pid &> /dev/null } # kills a specified process, expects the process name kill_process(){ term_process "$1" -9 } prey.orig/core/setup0000664000175100017510000000725712250331650014367 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Setup Routine - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### trap "" INT TERM # trap cleanup EXIT cleanup(){ log " -- Cleaning up!\n" delete_tmpdir } error_exit(){ log " !! $1" cleanup exit 1 } show_usage(){ echo -e "Usage: `basename $0` [options]\n" echo -e "Options:" echo -e " -c | --check\t\tCheck mode. Checks if configuration is correctly set up." echo -e " -l | --log\t\tLog output to ${base_path}/prey.log (default in Windows)." echo -e " -s | --silent\t\tDon't log any output." echo -e " -t | --test\t\tTest mode. Runs Prey without sending any data." echo -e " -v | --version\tDisplay version." echo -e "\nFor more information and customization options, please check http://preyproject.com.\n" } show_version(){ echo "Prey ${version}" } # step throught the params and check until [ -z "$1" ]; do case "$1" in -t | --test ) echo -e "\n -- TEST MODE ON." trap - INT # set off trap test_mode=1 # the following lets us include stuff for specific tests # e.g. ./prey.sh --test reports if [ -z $(find_in $2 '-') ]; then . $base_path/test/include "$2" 2> /dev/null shift fi ;; -c | --check ) echo -e "\n -- CHECK MODE ON." check_mode=1 ;; -l | --log ) logfile="$base_path/prey.log" echo -n "" > "$logfile" # empty the logfile first log_output=">> \"$logfile\"" ;; -s | --silent ) log_output="&> /dev/null" ;; -v | --version ) show_version && exit ;; -h | --help | * ) show_usage && exit esac shift done get_os(){ os=$(lowercase $(uname)) if [ "$os" == "windowsnt" ]; then os=windows else # linux/mac stuff [ "$os" == "darwin" ] && os=mac readonly root_path='/' readonly home_path=$(eval echo ~) [ -t 1 ] && set_colors # only set color if running from terminal (not Cron) fi readonly os readonly platform_path="$base_path/platform/$os" PATH=$PATH:$platform_path/bin } # here we put the vars that are shared by two os, but a third one has # different values set_vars(){ tmpbase="/tmp" line_breaker="\n" user_agent="-A Prey/$version ($os)" processes='ps ax' } set_aliases(){ shopt -s expand_aliases alias getter="curl $curl_options -s \"$user_agent\"" alias mailsender="sendEmail" } set_constants(){ readonly lang readonly start_time=$(date +"%F %T") readonly config_file="$base_path/config" readonly tmpdir="$tmpbase/p${RANDOM}" readonly last_response="$tmpbase/prey-last-response.xml" readonly on_demand_pipefile="$tmpbase/prey-on-demand.pipe" readonly logged_user readonly control_panel_url="https://control.preyproject.com" 2> /dev/null modules_url="https://prey-bash-client-modules.s3.amazonaws.com" 2> /dev/null updates_url="https://s3.amasonaws.com/prey-releases/bash-client/patches" 2> /dev/null } set_colors(){ cyan='\E[36m' green='\E[32m' red='\E[31m' color_end='\E[0m' bold='\033[1m' bold_end='\033[0m' } check_on_demand_status(){ # we check if the pipe has been used to send pings in the last ten minutes # if not, then we assume the connection has been cut off # if the file doesn't exist, simply return if [ ! -f "$on_demand_pipefile" ]; then return 1 elif test $(find "$on_demand_pipefile" -mmin +10); then echo " -- On Demand connection seems to have ended. Cleaning up and resetting..." . "$base_path/core/on_demand" [ -n "`is_process_running 'openssl'`" ] && kill_process 'openssl' on_demand_cleanup sleep 3 # just to make sure changes are reflected as they should fi } get_os set_vars set_aliases . "$platform_path/settings" set_constants check_on_demand_status prey.orig/core/response0000664000175100017510000000721612250331650015060 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Response Functions - (c) 2010 - Fork Ltd. # URL: http://preyproject.com # License: GPLv3 #################################################################### process_xml(){ # inmense thanks to this post, it saved my day # http://edwardawebb.com/linux/scope-issue-bash-loops STDOUT=$(echo -e "$1") while read line; do local key=$(get_key "$line") local value=$(get_value "$line") # write config value to file [ -n "$(find_in "$line" 'save="true"')" ] && save_config_value "$key" "$value" set_config "$key" "$value" done <<< "$STDOUT" } process_config(){ local prey_config=`echo -e "$response_body" | awk -F"[<>]" ' //,/<\/configuration>/' | grep -v "configuration>"` [ -z "$prey_config" ] && return 1 log "\n${bold} == Reading configuration...${bold_end}\n" process_xml "$prey_config" if [ "$offline_actions" == "true" ]; then # offline actions selected echo -e "$response_body" > "$last_response" 2> /dev/null chmod 600 "$last_response" 2> /dev/null elif [ -f "$last_response" ]; then # otherwise, lets make sure there's nothing there rm -f "$last_response" 2> /dev/null fi [ -n "$delay" ] && check_and_update_delay $delay if [[ -z "$on_demand_call" && "$auto_update" == "true" && `is_greater_than $current_release $version` == 1 ]]; then log " -- New Prey version found! Auto-update selected so let's try to upgrade." run_prey_updater fi } # Prey expects a and section in the xml # and activates de modules as requested. format should be as follows: # # true # # # 10 # # # # Give it back! # # # n # # # it should also work with one-line module entries (with no configuration), such as # process_module_config(){ local module_config=`echo -e "$response_body" | awk -F"[<>]" ' //,/<\/modules>/' | grep -v "\/module" | sed '1d'` [ -z "$module_config" ] && return 1 log "\n${bold} == Reading module configuration...${bold_end}\n" STDOUT=$(echo -e "$module_config") while read line; do if [ `find_in "$line" 'name='` ]; then # we have a module node local module_name=$(get_attribute 'name' "$line") log " -- Got instructions for $module_name module." [ "$auto_update" == "true" ] && local upstream_version=$(get_attribute 'version' "$line") # auto_update is enabled setup_module $module_name $upstream_version if [ $? == 1 ]; then # we got an error installing the new module log " !! Couldn't install $module_name module from repository." unset module_name continue else # lets see if its a report module or an action module initialize_module $module_name local module_type=$(get_attribute 'type' "$line") if [[ "$module_type" == 'action' || "$module_type" == "tunnel" ]]; then if [ `find_in "$line" 'function='` ]; then # a specific function was requested local function_name=$(get_attribute 'function' "$line") else local function_name='' fi add_action $module_name $function_name unset function_name else # then its a report module active_modules="$active_modules $module_name" fi fi elif [ -n "$module_name" ]; then # config line for module $module local key=$(get_key "$line") local value=$(get_value "$line") set_module_config "$module_name" "$key" "$value" fi done <<< "$STDOUT" } prey.orig/core/on_demand0000664000175100017510000000545512250331650015151 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core On-Demand Functions - (c) 2010 Fork Ltd. # URL: http://preyproject.com # License: GPLv3 #################################################################### on_demand_command(){ openssl s_client -no_ssl2 -quiet -connect $on_demand_host:$on_demand_port 2> /dev/null on_demand_cleanup # log " -- OpenSSL returned. Removing pipe/lockfile..." } on_demand_cleanup(){ rm -f "$on_demand_pipefile" 2> /dev/null kill_process "$on_demand_pipefile" &> /dev/null # the tail process } on_demand_stdin(){ tail -f "$on_demand_pipefile" 2> /dev/null } on_demand_loop(){ on_demand_stdin | on_demand_command | while read data; do on_demand_process_msg "$data" done } on_demand_process_msg(){ local data="$1" [ "$data" == "" ] && return 1 # log " -- Got message: ${data}." local event=`get_json_val "$data" "event"` log " -- New event from Prey On-Demand Hub: ${event}" case "$event" in "ping") local last_pinged_at=`get_json_val "$data" 'timestamp'` on_demand_ping # log " -- Server pinged. Timestamp: ${last_pinged_at}" ;; "info") local message=`get_json_val "$data" "message"` log " -- Message from server: $message" ;; "message") log ' -- Got message!' local message_type=`get_json_val "$data" "type"` if [ "$message_type" == "text" ]; then local message_body=`get_json_val "$data" 'body'` if [ "$message_body" == "run_once" ]; then "$base_path/prey.sh" & disown -h else log " -- Unknown message: $message_body. Please update to latest version." fi else log " -- Unsupported message type: $message_type. Please update to latest version." fi ;; *) log " -- Unknown event: ${event}. Please update to latest version." ;; esac } enable_on_demand_mode(){ if [ -f "$on_demand_pipefile" ]; then log " -- Prey on-demand is already running!" return 1 fi log "\n${bold} == Setting up on-demand mode!${bold_end}\n" echo "" > "$on_demand_pipefile" { on_demand_loop & } 2> /dev/null # suppresses messages local on_demand_pid=$! log "\n -- On-demand listener running with PID $on_demand_pid!" sleep 2 if [ -f "$on_demand_pipefile" ]; then log " -- On-demand mode active!" on_demand_handshake # echo "$on_demand_pid" > "$on_demand_pidfile" else log " !! Coundn't set up on-demand." fi } on_demand_handshake(){ local protocol_version=1 log " -- Sending credentials to Prey On Demand Hub...\n" on_demand_send "{\"action\": \"connect\", \"data\": {\"client_version\": \"${version}\",\"key\":\"${device_key}\",\"group\":\"${api_key}\", \"protocol\": ${protocol_version} }}" } on_demand_ping(){ local timestamp=$(date +%s) on_demand_send "{\"action\": \"ping\", \"data\": {\"timestamp\":${timestamp} }}" } on_demand_send(){ echo "$1" >> "$on_demand_pipefile" } prey.orig/core/modules0000664000175100017510000000476212250331650014675 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Module Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # mac/linux only. windows has another method of de/activating modules is_module_active(){ if [ -x "$base_path/modules/$1/core/run" ]; then echo 1 else return 0 fi } get_active_modules_from_filesystem(){ for module in `find "$base_path/modules" -maxdepth 1 -mindepth 1 -type d`; do local module_name=`echo $module | sed 's/.*[\\|\/]\([a-z_-]*\)$/\1/'` if [ `is_module_active "$module_name"` ]; then initialize_module $module_name active_modules="$active_modules $module_name" fi done } # gets the module name ($1) and optionally the upstream version ($2) setup_module(){ module_path="$base_path/modules/$1" upstream_version=$2 if [ ! -d "$module_path" ]; then log " !! Module $1 not found!" install_or_update_module $1 return $? elif [ -n "$upstream_version" ]; then # module is already there, lets see if the versions match local installed_version=$(cat "$module_path/version" 2> /dev/null) if [ `is_greater_than $upstream_version $installed_version` == 1 ]; then log " -- Updating $1 module to version $upstream_version!" install_or_update_module $1 return $? fi fi } initialize_module(){ set_module_paths_for $1 # if there's a language file, lets run it if [ -f "$module_path/lang/$lang" ]; then . "$module_path/lang/$lang" elif [ -f "$module_path/lang/en" ]; then . "$module_path/lang/en" fi # if there's a config file, lets run it as well if [ -f "$module_path/config" ]; then . "$module_path/config" fi # lets load the base functions for the module if [ -f "$module_path/core/functions" ]; then . "$module_path/core/functions" fi # and the OS-specific if there are if [ -f "$module_platform_path/functions" ]; then . "$module_platform_path/functions" fi } #unset_module_vars(){ # unset current_module # unset module_path # unset module_platform_path #} set_module_paths_for(){ module_path="$base_path/modules/$1" module_platform_path="$module_path/platform/$os" } run_active_modules() { if [[ -z $active_modules && "$post_method" != 'http' ]]; then get_active_modules_from_filesystem fi for current_module in $active_modules; do set_module_paths_for $current_module log "\n${bold} == Running $current_module module!${bold_end}\n" # now, go! . "$module_path/core/run" done } prey.orig/core/functions0000664000175100017510000002634112250331650015232 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Basic Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### log(){ eval echo -e '"$1"' "$log_output" } #################################################################### # xml parsing functions #################################################################### get_key(){ echo "$1" | sed -e 's/.*\/\(.*\)>/\1/' -e 'y/-/_/' # we also replace -'s to _'s } get_value(){ echo "$1" | sed 's/.*>\([^<].*\)<.*/\1/' } # expects attr name, returns value # example: get_attribute 'name' $line get_attribute(){ echo "$2" | sed "s/.*$1=\"\([^\"]*\)\".*/\1/" # echo "$2" | sed -e "s/.*$1=\([a-z_\"']*\).*/\1/" -e "s/[^a-z_]//g" } #################################################################### # setting configs #################################################################### # key, value set_config(){ if [ -n "$1" ] && [ -n "$2" ]; then local clean_key=$(echo "$1" | sed "s/^[0-9]/_/;s/[^a-zA-Z0-9_]/_/g") local clean_val=$(printf "%q" "$2") eval "${clean_key}=${clean_val}" fi } # module, key, value set_module_config(){ set_config "${1}__${2}" "$3" } save_config_value(){ local key="$1" local val="$2" if [ "$val" == "true" ]; then local val='y' elif [ "$val" == 'false' ]; then local val='n' fi # use % as delimiter instead of / so URLs get set correctly sed -i.backup -e "s%^$key=.*%$key='$val'%" "$config_file" 2> /dev/null local rs=$? if [ -f "$config_file" ]; then rm -f "$config_file.backup" 2> /dev/null else mv "$config_file.backup" "$config_file" 2> /dev/null fi return $rs } #################################################################### # local var storage #################################################################### # fetches a var and then assigns it as $value # expects the name of hash and then the name of var get_var(){ HASH="$1[*]" local ${!HASH} eval 'echo ${'"${2}"'}' } store_var(){ eval $1[\${#$1[*]}]="$2" } store_key_value(){ store_var "$1" "$2=\"$3\"" } # if you need to fetch a specific trace or file get_trace(){ get_var traces ${1}__$2 } get_file(){ get_var files ${1}__$2 } #################################################################### # list generators for report #################################################################### separator='########################################################' generate_query_string(){ local default_prefix="\n -F " [ -n "$2" ] && prefix="$2" || prefix="$default_prefix" for t in $(eval echo \${$1[@]}); do local start=$(echo ${t%%=*}) local index=$(echo $(( ${#start} + 1 ))) if [ "$prefix" != "$default_prefix" ]; then local trace_field=`echo "$start" | sed "s/^\([^_].*\)__\(.*\)/[\1][\2]/"` else local trace_field=`echo "$start" | sed 's/^\([^_].*\)__\(.*\)/\1[\2]/'` fi echo -n "${prefix}${trace_field}=${t:index}" done } generate_list(){ for t in $(eval echo \${$1[@]}); do local current_node=$(echo $t | sed 's/__.*//') [ "$current_node" != "$previous_node" ] && echo -e "$separator\n# $current_node\n$separator\n" # removes module name and replaces _'s with whitespaces echo -e "$t\n" | sed -e 's/^\([^_].*\)__/ :: /' -e 's/%20/ /g' -e 's/_/ /' local previous_node=$current_node done } #################################################################### # trace & file functions #################################################################### add_trace(){ log " ++ Adding trace for $current_module: $1" store_key_value 'traces' "${current_module}__$1" "$(urlencode "$2")" } remove_traces(){ unset -v traces log " -- Dropping all traces!" } add_file(){ if [ -f "$2" ]; then log " ++ Adding file for $current_module: $1 -> $2" store_key_value 'files' "${current_module}__$1" "$2" else log " ${red}!!${color_end} Couldn't find file at $2!" fi } list_files(){ # log " -- ${#files[*]} files gathered!" for f in "${files[@]}"; do if [ "$post_method" == 'http' ]; then # echo -e "-F $f" | sed -e 's/=/=@/' echo "-F $f" | sed 's/^\([^_].*\)__\([^=].*\)=\(.*\)/\1[\2]=@\3/' else # just list the file paths echo $f | sed 's/^.*=\(.*\)/\1/' fi done } remove_files(){ for f in "${files[@]}"; do file=`echo $f | sed 's/^.*=\(.*\)/\1/'` rm -f "$file" log " -- Removed $file" done unset -v files } #################################################################### # delay functions, mac and linux #################################################################### # echoes random number between 1 and $1 (first argument passed) get_random_number(){ echo $[ ( $RANDOM % $1 ) + 1 ] } # returns 1 if cron entry is set to one our intervals one_hour_interval(){ echo "$current_delay" | grep "/" > /dev/null || echo 1 } # returns cron delay depending on device's state: # when missing, every X minutes, otherwise every hour on minute X get_delay_for(){ echo '*/'$1' * * * *' } get_random_minute_delay(){ local min=$(get_random_number 59) echo "${min} * * * *" } get_current_delay(){ # crontab -l | grep prey | sed "s/^..\([0-9]*\).*/\1/" crontab -l 2> /dev/null | grep prey | head -1 | sed 's/ \/.*//' } update_execution_delay(){ local full_path=$(full_path "$base_path") (crontab -l 2> /dev/null | grep -v prey; echo "${1}" "${full_path}/prey.sh > /var/log/prey.log 2>&1") | crontab - } # if device is missing we'll make sure the current delay matches the one # on the server. otherwise we'll make sure it is set to the regular interval. check_and_update_delay(){ local current_delay=$(get_current_delay) # if trigger is loaded and device not missing, set to one hour intervals if [[ -n "$current_delay" && -n "$(is_trigger_loaded)" && -z "$device_missing" ]]; then # if already set to one hour interval, return [ -n "$(one_hour_interval)" ] && return 0 local new_delay=$(get_random_minute_delay) log " -- Setting delay to regular interval." else local new_delay=$(get_delay_for "$1") # if interval hasn't changed, return [ "$current_delay" == "$new_delay" ] && return 0 log " -- Setting frequency to $1!" fi update_execution_delay "$new_delay" } #ensure_trigger_loaded(){ # [ -z "$(is_trigger_loaded)" ] && reload_trigger #} running_from_cron(){ # tty -s # [ $? -eq 1 ] && echo 1 [ "$TERM" == "dumb" ] && echo 1 } #################################################################### # http functions #################################################################### # if try_proxy does not contain a dot (e.g. 'true' or something else) # then lets make sure we use a valid proxy. get_proxy_server(){ [ -n "$try_proxy" ] && echo "$try_proxy" || get_system_proxy } send_request(){ local url="$1" local curl_arguments="$2" local proxy_to_use="$3" local headers_file="$tmpbase/prey-curl-headers.txt" if [ -n "$proxy_to_use" ]; then log " -- Trying via proxy: ${proxy_to_use}..." curl_arguments="$curl_arguments -x $proxy_to_use" fi response_body=$(getter $curl_arguments -L $url --dump-header "$headers_file" -S --stderr -) local rs=$? if [[ $rs -eq 0 && -f "$headers_file" ]]; then response_headers=$(cat "$headers_file" && rm -f "$headers_file" 2> /dev/null) get_status_code elif [ -z "$proxy_to_use" ]; then if [ -z "$proxy_checked" ]; then proxy_server=$(get_proxy_server) proxy_checked=1 fi if [ -n "$proxy_server" ]; then send_request "$url" "$curl_arguments" "$proxy_server" else log_response_error "$url" fi else # tried proxy to no avail. # it may be possible that the proxy does not support SSL, # so we can try switching to plain HTTP as a last resort if [ -n "$(find_in "$url" 'https:')" ]; then local new_url=$(echo "$url" | sed 's/https:/http:/') send_request "$new_url" "$curl_arguments" "$proxy_to_use" else log_response_error "$url" "$proxy_to_use" fi fi } get_status_code(){ # if we get a redirect response, we should capture the last http status code response_status=$(echo -e "$response_headers" | grep 'HTTP/' | tail -1 | cut -d" " -f2) } # we may eventually use a specific header for Prey get_header_value(){ echo "$response_headers" | grep -i "$1" | tail -1 | sed 's/.*: \([a-z\/-]*\).*/\1/' } # fetches last response if online actions were enabled for the device get_last_response(){ response_body=$(cat "$last_response") } log_response_error(){ local url="$1" local proxy_used="$2" log "\n !! Got invalid response! This probably means there is a connection issue." log " -- Please check your firewall settings, allowing Curl to connect to ${url} through port 80." log " -- If you use a proxy server please check the try_proxy setting in the config file." [ -n "$proxy_used" ] && log " -- Proxy server found: ${proxy_used}" log " -- The response we got was: \n\n${response_headers}\n${response_body}\n" } #################################################################### # check mode functions #################################################################### verify_installation(){ log " -- Checking if cron daemon is running..." if [ -n $(is_process_running 'cron') ]; then log " -- Cron daemon found." else log " !! Cron daemon not found! Try running it with 'sudo /etc/init.d/cron start'." fi log " -- Checking for crontab entry..." local result=$(crontab -l | grep 'prey.sh' | wc -l 2> /dev/null) if [ "$result" -gt 0 ]; then log " -- Found!" else log " !! Not found!\n -> It seems Prey's crontab entry was removed after installation. Please set again the running interval." fi } verify_smtp_settings(){ if [ "$mail_to" != "mailbox@domain.com" ]; then log " -- Target mailbox set." else log " !! Target mailbox not set!" fi if [ "$smtp_username" != "username@gmail.com" ]; then log " -- SMTP username set." else log " !! SMTP username not set!" fi if [ "$(decrypt $smtp_password)" != "" ]; then log " -- Password seems to be fine as well." else log " !! Password not set! (Remember it should be base64 encrypted)." fi } #################################################################### # self setup functions #################################################################### get_hardware_info(){ initialize_module "system" scan_system_hardware full_hardware_params } self_setup(){ log ' -- Gathering system and hardware information...' get_pc_info local pc_hardware_params="$(get_hardware_info)" log ' -- Sending request to Control Panel...' [ "$os" == "linux" ] && local os_name=$distro_name || local os_name=$os local params="device[title]=$(urlencode "$pc_name")&device[device_type]=$pc_type&device[os_version]=$pc_os_version&device[os]=$(capitalize $os_name)${pc_hardware_params}" send_request "$control_panel_url/devices.xml" "--connect-timeout 20 -u $api_key:x -d "$params"" log " -- Got response status ${response_status}." device_key=$(echo "$response_body" | grep "" | sed 's/.*\(.*\)<\/key>.*/\1/') if [ -n "$device_key" ]; then log ' -- Device succesfully registered! Applying configuration...' save_config_value device_key "$device_key" if [ $? == 1 ]; then log " -- There was a problem saving the configuration. You probably don't have permissions to modify $base_path/config." else log " -- All set. Assigned key is $device_key." fi else log " -- Couldn't add this device to your account. Make sure you have available slots!\n" exit 1 fi } prey.orig/core/actions0000664000175100017510000000674412250331650014667 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Action Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # modules can queue specific actions by calling # add_action 'module_name' 'function_name' add_action(){ log " ++ Queueing action for $1 module!" if [ -z "$2" ]; then function=1 else function=$2 fi actions[${#actions[*]}]="${1}=${function}" } # sets the running pid to the action/module name add_running_action(){ running_actions[${#running_actions[*]}]="${1}=${2}" } get_action(){ get_var actions $1 } # gets the pid of the running process get_running_action(){ get_var running_actions $1 } action_callback(){ until read -st 1; do echo -n "" done log " -- Action finished. Running callback!" eval '$1 $REPLY' } # receives the pid name, assigns it to the module name create_pidfile_for(){ log " -- Creating pidfile for $current_module's $1..." echo $1 > "$tmpbase/prey-action-$current_module.pid" } unload_action(){ log " -- Unloading $1 from memory..." local pidfile="$tmpbase/prey-action-$1.pid" kill -HUP -- -`cat $pidfile` &> /dev/null } remove_pidfile(){ local pidfile="$tmpbase/prey-action-$1.pid" if [ -f "$pidfile" ]; then log ' -- Removing pidfile...' rm -f "$pidfile" 2> /dev/null else log " -- Pidfile doesn't exist!" fi } check_running_actions(){ for pidfile in $(ls $tmpbase/prey-action-*.pid 2> /dev/null); do if [ ! -f $pidfile ]; then continue # just to make sure fi local action_name=`basename $pidfile | sed -e 's/prey-action-//' -e 's/\.pid//'` log " -- Found PID for running action: $action_name" local pid=$(cat $pidfile) local actually_running=$(ps ax | grep $pid | grep -v grep > /dev/null && echo 1) if [ -z `get_action $action_name` ]; then # action was removed from options # log " -- Removing $action_name which was untoggled by user..." unload_action $action_name sleep 1 elif [ -z "$actually_running" ]; then log " -- Not really running! PID file was just lying around." rm -f "$pidfile" else add_running_action $action_name $pid fi done } action_finished(){ if [[ -n "$2" && $(get_running_action $2) == $1 ]]; then wait $1 return_status=$? log " -- Action $2 returned with status $return_status." remove_pidfile $2 fi } run_pending_actions(){ # -b -> Cause the status of terminated background jobs to be reported immediately, # rather than before printing the next primary prompt. # -m job control enabled set -bm log "\n${bold} == Running pending actions...${bold_end}" for action in "${actions[@]}"; do local current_module=$(echo $action | sed 's/=.*//') local function=$(echo $action | sed 's/.*=\(.*\)/\1/') if [ -n "$(get_running_action $current_module)" ]; then log " -- $current_module is already running! Skipping..." continue fi set_module_paths_for $current_module if [ "$function" != "1" ]; then # specific function requested log " -- Running action $function from $current_module module." eval "$function" & else # no specific action requested, we'll assume there's a run file log "\n${bold} == Running $current_module module!${bold_end}\n" . "$module_path/core/run" & fi pid=$! create_pidfile_for $pid add_running_action $current_module $pid trap 'action_finished $pid $current_module' SIGCHLD done wait log " -- No pending actions left. All done!\n" trap - SIGCHLD cleanup # set +bm } prey.orig/core/updater0000664000175100017510000002374612250331650014674 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Core Updater Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### #################################################################### # prey updater #################################################################### check_for_failed_update(){ if [ -f "$base_path/.update_failed" ]; then local update_failed_for=$(cat "$base_path/.update_failed") if [ "$update_failed_for" == "$version" ]; then log ' !! Already attempted to update to next version with no luck. Skipping!' return 1 fi fi return 0 } verify_write_access(){ if [ ! -w "$base_path/version" ]; then log " -- Unfortunately the current user who's running Prey cannot perform the upgrade." return 1 elif [[ "$os" == "windows" && "`whoami`" != "SYSTEM" ]]; then log " !! Running on user mode! Please switch to System Service mode if you wish to update." return 1 fi } #################################################################### # updater package management #################################################################### fetch_update() { log " -- Fetching new Prey release at ${update_package}..." local download_status=$(getter "$update_package" -o "$updater_file" -w "%{http_code}" 2> /dev/null) if [ "$download_status" != "200" ]; then log " !! Couldn't get updater file! Skipping..." rm $updater_file 2> /dev/null return 1 fi } get_checksum_for() { getter "$1.md5sum" | sed 's/<.*>//' | cut -d ' ' -f1 } validate_package(){ local valid_md5=$(get_checksum_for $update_package) if [ -z "$valid_md5" ]; then log " !! Couldn't grab checksum from server. Skipping update..." return 1 fi [ "$os" == "mac" ] && local md5_cmd='/sbin/md5 -r' || local md5_cmd='md5sum' local package_md5=$($md5_cmd $updater_file | sed 's/.*\([a-f0-9]\{32\}\).*/\1/' 2> /dev/null) if [ "$package_md5" != "$valid_md5" ]; then log ' -- Invalid checksum for downloaded package. Cannot continue.' return 1 fi } unzip_package(){ log ' -- Validated updater from source. Unpacking...' unzip -u $updater_file -d $updater_path > /dev/null return $? } #################################################################### # diff patching (yeah, that's right, Prey updates with patch!) #################################################################### test_diff() { # -f forces, dont ask any questions # -p0 leave paths as they are # -s silent # -N Ignore patches that seem to be reversed or already applied. # -F2 Fuzzyness. Default is 2 lines before and after. patch_options="-N -f -F1 --ignore-whitespace --backup-if-mismatch --remove-empty-files -d $base_path -p0 -i $diff_file" log ' -- Testing if patch will apply cleanly...' outcome=$(patch --dry-run $patch_options) if [ `find_in "$outcome" 'FAILED'` ]; then log " !! It appears there are differences between your installed version and the official Prey $version code. Cannot patch!" echo "$outcome" > "$base_path/patch.log" log " -- Results were logged to $base_path/patch.log." return 1 else log ' -- Everything smooth.' fi return 0 } apply_diff(){ log ' -- Applying patch...' outcome=$(patch $patch_options 2>&1) # return $? if [ `find_in "$outcome" 'FAILED'` ]; then log ' -- Something went wrong while patching!' echo "$outcome" > "$base_path/patch.log" log " -- Results were logged to $base_path/patch.log." return 1 else log " -- Patch was successful!" return 0 fi } # this could be useful sometime in the future report_update_status(){ log ' -- Notifying update status to your Control Panel account...' if [[ "$1" == 1 && "$provide_error_feedback" == 'y' ]]; then additional_feedback="&device[update_log]=$outcome" fi update_device_info_with "device[update_failed]=${1}${additional_feedback}" } #################################################################### # file copying and removal #################################################################### delete_files_according_to_diff() { STDOUT=$(grep "^Binary" $diff_file) while read file; do local original=$(echo "$file" | cut -d" " -f3) local modified=$(echo "$file" | cut -d" " -f5) if [ "$modified" == "/dev/null" ]; then # deleted file log " -- Deleting file: $original..." rm -f "$base_path/$original" fi done <<< "$STDOUT" } copy_new_files(){ log ' -- Updating new binary files in Prey...' if [ -d "$updater_path/platform/$os" ]; then cp -R $updater_path/platform/$os/* "$base_path/platform/$os" # first, copy the platform specific stuff fi rm -Rf $updater_path/platform 2> /dev/null cp -R $updater_path/* "$base_path" 2> /dev/null } remove_temp_stuff(){ rm -Rf "$updater_path" 2> /dev/null rm -f "$updater_file" 2> /dev/null } #################################################################### # main functions #################################################################### download_and_test_update(){ log ' -- Removing leftovers...' remove_temp_stuff updater_path="$tmpdir/updater" updater_file="$tmpdir/updater.zip" update_package="$updates_url/prey-updater-for-$version.zip" diff_file="$updater_path/changes.diff" # rejects_file="$updater_path/rejected_changes.diff" fetch_update if [ $? == 1 ]; then return 1; fi validate_package if [ $? == 1 ]; then return 1; fi unzip_package if [ $? != 0 ]; then log ' !! Something went wrong while unzipping files. Skipping update.' return 1 fi if [ -f "$diff_file" ]; then test_diff return $? fi } #create_copy_of_prey(){ # create_tmpdir # just to make sure # old_base_path="$base_path" # base_path="$tmpdir/newprey" # cp -R "$old_base_path" "$base_path" # cd "$base_path" #} apply_changes(){ local return_status=0 # create_copy_of_prey if [ -f "$diff_file" ]; then apply_diff local return_status=$? delete_files_according_to_diff rm "$diff_file" 2> /dev/null fi log ' -- Updating files!' copy_new_files log ' -- Cleaning up...' delete_unneeded_stuff_in "$base_path/platform" remove_temp_stuff return $return_status } perform_update() { pre_update_hook backup_config log "\n${bold} == Applying changes!${bold_end}\n" sleep 1 apply_changes local update_status=$? # set current version as previous, to compare local previous_version=$version # get new version . "$base_path/version" if [[ $update_status == 0 && `is_greater_than $version $previous_version` == 1 ]]; then log " ++ Update OK! New installed version of Prey is $version." rm -f "$base_path/.update_failed" 2> /dev/null else log ' -- Something went wrong while updating!' echo "$previous_version" > "$base_path/.update_failed" fi report_update_status $update_status cleanup # restore_config log ' -- Running post-update hooks...' post_update_hook $update_status run_post_update_script log " -- All done! Exiting...\n" exit $update_status } run_prey_updater(){ log " -- Performing pre update checks..." check_for_failed_update if [ $? == 1 ]; then return 1; fi verify_write_access if [ $? == 1 ]; then return 1; fi log ' -- All set!' log "\n${bold} == Running Prey updater!${bold_end}\n" download_and_test_update if [ $? == 0 ]; then # we update as a different process so we can # modify prey.sh in case we need to perform_update & exit 0 fi } run_post_update_script(){ local post_update_script_path="$base_path/post_update.sh" if [ -f "$post_update_script_path" ]; then log " -- Performing on-demand post-install instructions..." . "$post_update_script_path" rm -f "$post_update_script_path" fi } backup_config(){ log ' -- Backing up current settings...' cp "$config_file" "$config_file.backup" } restore_config(){ # if there's no default config file, then lets just copy the backup file back if [ ! -f "$config_file.default" ]; then cp "$config_file.backup" "$config_file" return 1 else # lets copy the default config file and restore the previous settings cp "$config_file.default" "$config_file" log ' -- Applying current config settings to new config file...' # parse file and remove all comments and empty lines config_options=$(cat "$config_file.backup" | grep -v '^#' | grep -v "^$" | sed 's/ /-SPACE-/') for option in $config_options; do local option_name=$(echo "$option" | sed 's/=.*//') local option_value=$(echo "$option" | sed -e 's/[^=]*=//' -e "s/^'//" -e "s/'$//" -e "s/\//-SLASH-/g") save_config_value "$option_name" "$option_value" done sed -i -e "s/-SLASH-/\//g" -e "s/-SPACE-/ /g" "$config_file" # resolve the slash and space hacks log ' -- Done!' fi } #################################################################### # module updater #################################################################### get_module(){ rm -f "$module_file" 2> /dev/null getter "${modules_url}/$1.zip" -o "$module_file" 2> /dev/null } install_or_update_module(){ # not local var as we use it upstairs module_file="$tmpdir/module-$1.zip" log " -- Trying to fetch $1 module from repository..." get_module $1 # we check the file's size as we may have received a 404 html file if [[ -f "$module_file" && `file_size "$module_file"` -gt 1500 ]]; then log " -- Got new $1 module from repository! Unpackaging..." log ' -- Unzipping module...' unzip "$module_file" -d "$tmpdir/$1.tmp" &> /dev/null if [ $? == 0 ]; then if [ -d "$base_path/modules/$1" ]; then # module already installed log ' -- Removing old module...' rm -Rf "$base_path/modules/$1" fi log ' -- Putting new module where it belongs...' [ ! -d "$base_path/modules" ] && mkdir "$base_path/modules" mv "$tmpdir/$1.tmp/$1" "$base_path/modules/$1" log ' -- Cleaning up...' delete_unneeded_stuff_in "$base_path/modules/$1/platform" rm "$module_file" 2> /dev/null log " ++ New $1 module placed and ready to go!" return 0 fi else log " -- Couldn't grab module package. The repository may be temporarily down." fi return 1 } delete_unneeded_stuff_in(){ if [ -d "$1" ]; then rm -Rf `find "$1" -mindepth 1 -maxdepth 1 -type d -not -iname "$os"` fi } prey.orig/lang/0000775000175100017510000000000012250331650013262 5ustar guerreguerreprey.orig/lang/en0000775000175100017510000000247012250331650013615 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # English lang file v 0.2 - by Juan C. Mardones (http://juanmardones.com) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_START="PREY $version spreads its wings!" STRING_TRY_TO_CONNECT=" -- Trying to connect to first open wifi network available..." STRING_NO_CONNECT_TO_WIFI=" -- Couldn't find a way to connect to an open wifi network!" STRING_CHECK_URL=" -- Checking URL..." STRING_NO_PROBLEM=" -- Nothing to worry about. :)\n" STRING_PROBLEM=" -- HOLY GUACAMOLE!!" STRING_WRITE_EMAIL=" -- Writing our email..." STRING_SENDING_EMAIL=" -- Sending the report..." STRING_ERROR_EMAIL="\n\033[1m !! There was a problem sending the email. Are you sure it was setup correctly? If you're using Gmail, try removing the '@gmail.com' from the smtp_username field in Prey's config file.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Removing all traces of evidence..." STRING_DONE=" -- Done! Happy hunting! :)" EMAIL_NOTICE="" EMAIL_HEADER="Good news my friend, it seems we found it.\n\nHere's the report from your computer:\n\n" EMAIL_FOOTER="\n\nChecked URL: ${check_url}\n\nHappy hunting!\n\n--\nYour humble servant, Prey\nhttp://preyproject.com" prey.orig/lang/es0000775000175100017510000000252312250331650013621 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Spanish language file v 0.2 - by Juan C. Mardones (http://juanmardones.com) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_START="PREY $version despliega sus alas!" STRING_TRY_TO_CONNECT=" -- Intentando conectarnos a la primera red abierta disponible..." STRING_NO_CONNECT_TO_WIFI=" -- No encontramos la forma de conectarnos a una red Wi-Fi abierta!" STRING_CHECK_URL=" -- Revisando URL..." STRING_NO_PROBLEM=" -- Nada de que preocuparse. :)\n" STRING_PROBLEM=" -- OUCH!!" STRING_WRITE_EMAIL=" -- Redactando el reporte..." STRING_SENDING_EMAIL=" -- Enviando el reporte..." STRING_ERROR_EMAIL="\n\033[1m !! Hubo un problema enviando el correo electronico. ¿Estas seguro de que fue configurado correctamente? Si estas usando Gmail, intenta removiendo el '@gmail.com' del campo smtp_username en el archivo de configuracion.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Eliminando la evidencia..." STRING_DONE=" -- Todo listo! Suerte con la caceria! :)" EMAIL_HEADER="Buenas noticias, amigo mio, al parecer lo encontramos!\n\nAqui va el reporte de tu computador:\n\n" EMAIL_FOOTER="\n\nSuerte con la caceria!\n\n--\nTu fiel servidor, Prey\nhttp://preyproject.com" prey.orig/lang/it0000664000175100017510000001163112250331650013623 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Italian lang file v 0.2 - by Giovanni Mauri (http://thejoe.co.nr/) # URL : http://preyproject.com # License: GPLv3 #################################################################### if [ -n "$DEFAULT_INSTALLPATH" ]; then # stiamo avviando l'installer # installer messages HELLO_IN_LANGUAGE=" -- da ora Prey parla in italiano!" WHERE_TO_INSTALL_PREY=" -> Dove vuoi che installiamo Prey? [$DEFAULT_INSTALLPATH] " USING_DEFAULT_INSTALL_PATH=" -- Ottimo, usiamo il percorso di default..." INVALID_INSTALL_PATH=" !! Percorso non valido. La directory non esiste!\n" SETTING_INSTALL_PATH=" -- Ok, imposto $INSTALLPATH come percorso di installazione." IT_SEEMS_PATH="Sembra che Prey fosse già installato" DIFFERENT_PATH="\nLa nuova versione usa un differente percorso per l'installazione," REMOVE_OLD_FILES="quindi dovremo rimuovere i vecchi file visto che non verranno più usati." ASK_RM_OLD_FILES="Vuoi che venga fatto in automatico?" DELETING_OLD_FILES=" -- Cancello i vecchi file di installazione di Prey...\n" CONFIG_FILE_EXISTS=" -> Il file Config esiste! Vuoi saltare tutte le noiose domande? (non consigliato)[n] " SKIP_INSTALL_QUESTIONS=" -- Ottimo, faccio l'update dei file!\n" DEFINE_REPORT_METHOD=" -> Quale metodo vuoi usare per i rapporti? (email, tunnel, web) [email] " IS_REGISTERED_ON_WEB=" -- Sei già registrato sul sito?" DEFAULT_REPORT_METHOD=" -- Usiamo le email per i rapporti. Tutto ok!" ADD_API_KEY=" -> Inserisci la tua API Key come riportato dal servizio web" INVALID_API_KEY=" !! API key invalida! Ricordati di registrarti su preyproject.com per ottenerne una.\n" ADD_DEVICE_KEY=" -> Inserisci la Device Key per questo PC come indicato sul sito: " INVALID_DEVICE_KEY=" !! Device Key invalida! Ricordati di registrarti su preyproject.com per ottenerne una.\n" DESIRED_USER_WEB=" -- Inserisci il tuo username: " ASK_EMAIL_WEB=" -- Inserisci la tua email: " DESIRED_PASS_WEB=" -- Inserisci la password: " PROBLEM_SIGNUP_WEB="C'è un problema col servizio web. Prova ancora." PROBLEM_RESPONSE_WEB="La risposta che abbiamo avuto è questa:" USING_DEFAULT_APP_URL=" -- Uso le route per l'applicazione web. Niente di nuovo!" ENTER_EMAIL_ADDRESS=" -> A quale indirizzo vuoi che arrivino le mail? (es. mailbox@domain.com) [] " INVALID_EMAIL_ADDRESS=" !! Devi specificare un'inbox. Esco...\n" ENTER_SMTP_SERVER=" -> Quale server SMTP vuoi che usiamo? (e la porta?) [smtp.gmail.com:587] " DEFAULT_SMTP_SERVER=" -- Ok, useremo gmail! " ENTER_SMTP_USER=" -> Il tuo username SMTP: (es. mailbox@gmail.com)" DEFAULT_SMTP_USER=" -- Ok, il tuo username SMTP è" # the installer appends the email var ENTER_SMTP_PASS=" -> La tua password SMTP: (non sarà mostrata) [] " INVALID_SMTP_PASS=" !! Devi inserire una password valida. Esco...\n" YES_NO="y/n" YES="y" CHECK_URL_OR_NOT=" -- Vuoi che Prey controlli periodicamente una url? (Rispondere no significa far generare automaticamente i rapporti allo startup del programma) [n] " ENTER_URL=" -- Ok, inserisci la URL? [es. http://myserver.com/prey_check_url] " INVALID_URL=" !! Specifica una URL. Esco...\n" SET_TIMING=" -- Ok, ultima.. quanto spesso (in minuti) vuoi che Prey si avvii? [$TIMING] " INSTALLING_SOFTWARE=" -- Ok, installo i programmi necessari...\n" COPYING_ISIGHTCAPTURE=" -- Copio iSightCapture in $INSTALLPATH..." COPYING_FILES="\n -- Copio i file necessari in $INSTALLPATH e imposto i permessi..." ADDING_CRONTAB=" -- Aggiungo la entry su crontab..." INSTALL_OK="\033[1m\n -- Tutto a posto! Prey è installato ed avviato. Ora puoi cancellare questa directory in sicurezza. -- Semmai volessi disinstallare Prey, ti basta cancellare la directory $INSTALLPATH e rimuovere la riga di Prey in crontab: \n \t $ sudo rm -Rf $INSTALLPATH\n \t $ sudo crontab -l | grep -v prey | sudo crontab -\n -- Per gli aggiornamenti ricordati di controllare il sito http://preyproject.com!\033[0m\n\n" else # prey status messages STRING_START="\n ### PREY $version, mi sto avviando!\n" STRING_TRY_TO_CONNECT=" -- Provo a connettermi alla prima rete wifi disponibile..." STRING_NO_CONNECT_TO_WIFI=" -- Non ci sono reti wifi disponibili!" STRING_CHECK_URL=" -- Controllo la URL..." STRING_NO_PROBLEM=" -- Niente di cui preoccuparsi. :)\n" STRING_PROBLEM=" -- Problema!!" STRING_WRITE_EMAIL=" -- Scrivo l'email..." STRING_SENDING_EMAIL=" -- Mando il rapporto..." STRING_ERROR_EMAIL="\n\033[1m !! C'è stato un problema con l'invio della mail. Sicuro di averla impostata correttamente? Se stai usando Gmail, prova a cancellare '@gmail.com' dal campo smtp_username nel file config di Prey.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Rimuovo ogni traccia..." STRING_DONE=" -- Fatto. Buona caccia! :)\n" EMAIL_HEADER="Buone notizie, amico... sembra che lo abbiamo trovato.\n\nEcco il rapporto del tuo computer:\n\n" EMAIL_FOOTER="\n\nOra, vai a pigliare il bastardo!\n\n--\nIl vostro umile servitore, Prey\nhttp://preyproject.com" fi prey.orig/lang/pt0000664000175100017510000000253712250331650013637 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Portuguese - Brazil file v 0.1 - by: Silas Martins (http://silasjr.com) # URL : http://preyproject.com # License: GPLv3 # Codification: UTF-8 #################################################################### STRING_START="PREY $version Abra suas asas" STRING_TRY_TO_CONNECT=" -- Tentando se conectar a primeira rede wi-fi aberta disponível..." STRING_NO_CONNECT_TO_WIFI=" -- Não foi possível estabelecer conexão com nenhuma rede wi-fi aberta." STRING_CHECK_URL=" -- Verificando URL..." STRING_NO_PROBLEM=" -- Nenhum problema. :)\n" STRING_PROBLEM=" -- Meu Deus!!" STRING_WRITE_EMAIL=" -- Escrevendo email..." STRING_SENDING_EMAIL=" -- Enviando relatório..." STRING_ERROR_EMAIL="\n\033[1m !! Houve um problema ao enviar o e-mail. Tem certeza que foi instalado corretamente? Se você for usuário Gmail, tente retirar o '@ gmail.com' do campo smtp_username no arquivo de configuração do Prey.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Removendo vestígios de evidência..." STRING_DONE=" -- Pronto! Caça Feliz :)" EMAIL_NOTICE="" EMAIL_HEADER="Boa notícia, meu amigo, parece que encontramos algo.\n\nAqui o relatório completo do seu dispositivo:\n\n" EMAIL_FOOTER="\n\nCaça Feliz!\n\n--\nSeu humilde servo, Prey\nhttp://preyproject.com" prey.orig/lang/ro0000664000175100017510000000246012250331650013627 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Romanian lang file v 0.1 - by Kulldox (http://kulldox.info) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_START="PREY $version îşi desface aripile!" STRING_TRY_TO_CONNECT=" -- Încerc să mă conectez la prima reţea wifi gratuită..." STRING_NO_CONNECT_TO_WIFI=" -- N-am reuşit să mă conectez la o reţea wifi gratuită!" STRING_CHECK_URL=" -- Verific URL..." STRING_NO_PROBLEM=" -- Nu-ţi face griji. :)\n" STRING_PROBLEM=" -- Sfinte GUACAMOLE!!" STRING_WRITE_EMAIL=" -- Compun email-ul tău..." STRING_SENDING_EMAIL=" -- Trimit raportul..." STRING_ERROR_EMAIL="\n\033[1m !! N-am reuşit să trimit email-ul. Eşti sigur că a fost configurat corect? Dacă foloseşti Gmail, încearcă să scoţi '@gmail.com' din câmpul smtp_username în fişierul de configuraţie a lui Prey.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Ştergem urmele..." STRING_DONE=" -- Gata! Vânătoare plăcută! :)" EMAIL_NOTICE="" EMAIL_HEADER="Am veşti bune pritene, se pare că l-am găsit.\n\nIată raportul din calculatorul tău:\n\n" EMAIL_FOOTER="\n\nVânătoare plăcută!\n\n--\nAl tău umil servitor, Prey\nhttp://preyproject.com" prey.orig/lang/sv0000775000175100017510000000701212250331650013640 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Swedish lang file v 0.1 - by Dan Sellberg (dan@dkcp.com) # URL : http://preyproject.com # License: GPLv3 #################################################################### if [ -n "$DEFAULT_INSTALLPATH" ]; then # we're running the installer # HELLO_IN_LANGUAGE=" -- Prey kommer att kras p svenska!" WHERE_TO_INSTALL_PREY=" -> Var vill du installera Prey? [$DEFAULT_INSTALLPATH] " USING_DEFAULT_INSTALL_PATH=" -- Bra, anvnder standardskvgen..." INVALID_INSTALL_PATH=" !! Ogiltig installationsskvg. Huvudmappen existerar inte!\n" SETTING_INSTALL_PATH=" -- Ok, anvnder $INSTALLPATH som installationsskvg." DELETING_OLD_FILES=" -- Raderar gamla installationsfiler fr Prey...\n" CONFIG_FILE_EXISTS=" -> Konfigurationsfil existerar! Vill du hoppa ver alla trkiga frgor? (Ej rekommenderat) [n] " SKIP_INSTALL_QUESTIONS=" -- Ok, vi uppdaterar bara ndvndiga filer!\n" ENTER_EMAIL_ADDRESS=" -> Vilken epostadress vill du att Prey ska skicka epost till? (t.ex. dittnamn@dindoman.se) [] " INVALID_EMAIL_ADDRESS=" !! Du mste ange en epostadress. Avslutar...\n" ENTER_SMTP_SERVER=" -> Vilken SMTP-server ska Prey anvnda? (inkl. port) [smtp.gmail.com:587] " DEFAULT_SMTP_SERVER=" -- D anvnder vi Gmail! " ENTER_SMTP_USER=" -> Skriv in ditt SMTP anvndarnamn: (t.ex. dittnamn@gmail.com)" DEFAULT_SMTP_USER=" -- Ok, vrt SMTP anvndarnamn kommer att vara" # the installer appends the email var ENTER_SMTP_PASS=" -> Skriv in ditt SMTP lsenord: (Det kommer inte att visas i klartext) [] " INVALID_SMTP_PASS=" !! Du mste skriva in ett giltigt lsenord. Avslutar...\n" YES_NO="y/n" YES="y" CHECK_URL_OR_NOT=" -- Vill du att Prey ska kontrollera en URL? (Nej, innebr att en rapport skickas var gng datorn startas) [n] " ENTER_URL=" -- Ok, vilket URL ska vi kontrollera? [t.ex. http://minserver.se/prey_check_url] " INVALID_URL=" !! Du mste ange en URL. Exiting...\n" SET_TIMING=" -- Ok, sista frgan. Hur ofta (i minuter) vill du att Prey ska kras? [$TIMING] " INSTALLING_SOFTWARE=" -- Ok, installerar ndvndig mjukvara...\n" COPYING_ISIGHTCAPTURE=" -- Kopierar iSightCapture till $INSTALLPATH..." COPYING_FILES="\n -- Kopierar ndvndaiga filer till $INSTALLPATH och stter rttigheter..." ADDING_CRONTAB=" -- Lgger till crontab..." INSTALL_OK="\033[1m\n -- Allt OK! Prey r uppe och kr nu. Du kan nu radera denna mapp. -- Om du vill avinstallera Prey, radera $INSTALLPATH denna mapp och ta bort Prey i root's crontab: \n \t $ sudo rm -Rf $INSTALLPATH\n \t $ sudo crontab -l | grep -v prey | sudo crontab -\n -- Kom ihg att beska http://prey.bootlog.org fr uppdateringar!\033[0m\n\n" else # prey status messages STRING_START="\n ### PREY $version sprider ut sina vingar!\n" STRING_TRY_TO_CONNECT=" -- Frsker ansluta till ppna trdlsa ntverk..." STRING_NO_CONNECT_TO_WIFI=" -- Kunde inte ansluta till ett ppet trdlst nt!" STRING_CHECK_URL=" -- Kontrollerar URL..." STRING_NO_PROBLEM=" -- Inget att oroa sig ver. :)\n" STRING_PROBLEM=" -- Hoppla!!" STRING_WRITE_EMAIL=" -- Skapar epostmeddelande..." STRING_SENDING_EMAIL=" -- Skickar report..." STRING_ERROR_EMAIL="\n\033[1m !! Det gick inte att skicka epost. r du sker p att instllningarna r korrekta? Om du anvnder Gmail, testa att ta bort '@gmail.com' i anvndarnamnet fr SMTP i Preys konfigurationsfil.\033[0m\n" STRING_REMOVE_EVIDENCE=" -- Tar bort alla spr av bevis..." STRING_DONE=" -- Klar! Lycka till med jakten! :)\n" fi prey.orig/LICENSE0000664000175100017510000010451312250331650013352 0ustar guerreguerre GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . prey.orig/README0000664000175100017510000001337612250331650013233 0ustar guerreguerre############################################## # Prey - Track down your stolen laptop # http://preyproject.com # A project originally by Tomas Pollak ############################################## Prey is a lightweight application for tracking your stolen laptop. It runs in Windows and *NIX systems as well (Mac, Linux). It is licensed by the GPLv3 which means you can do just about anything with it, as long as you respect the licence's terms. For up to date information check the project's website at preyproject.com. ############################################## 1. How it works ############################################## The script runs at a specified interval in your machine, and checks for a specified URL on the web. If the URL does not exist it means the PC has been stolen, and thus goes through the information gathering routine and sends all that info through to a previously defined email address. You can also not define a URL and in that case the program will send the data every time it runs, although it is *not* recommended. Since 0.3.3, you can use a web control panel (control.preyproject.com) to manage your computer's state, as well as toggling different modules for triggering certain behaviours remotely. In this case you don't have to worry about the URL thing since it takes care of that for you. You only need to set up your user account when installing Prey. ############################################## 2. Installation ############################################## -- Windows, Mac & Ubuntu Linux users Download the package/installer and run it. Once all files are in place you'll need to configure Prey, where you'll be able to choose between both operation modes. In case you want to use Prey along with the control panel (recommended), you'll have to register and add your device to obtain your API and Device keys. Prey needs them both so make sure you add them correctly. If you want to use Prey in an independent way, you'll have to set up your mail server (SMTP) settings. Sometimes email sending doesn't work at once, so please try using a different target mailbox just in case — in fact that's how the problem generally gets fixed. -- Linux users (not Debian/Ubuntu) Once you've downloaded the package, unzip it and move all the contents to a folder of your choice (we use /usr/share/prey). Then you need to open up the config file and change your settings according to your configuration. If you're using the Control Panel, then you only need to insert your API and Device keys; otherwise you need to set up your SMTP server settings. Finally, you need to add a crontab entry for root. You can do this by typing the following in a terminal: $ (sudo crontab -l | grep -v prey; echo "*/20 * * * * /usr/share/prey/prey.sh > /var/log/prey.log") | sudo crontab - ############################################## 3. Requisites for Linux ############################################## Mac comes with everything needed to run Prey. However Linux users should make sure they have the following installed: (note the installer does this automatically!) o curl o scrot or imagemagick (for screenshot capture) o streamer (for webcam capture) --> in Fedora the xawtv package includes it o Perl libs IO::Socket::SSL and NET::SSLeay ############################################## 4. Usage ############################################## The idea is that when your laptop gets stolen -- hopefully never, that is -- you should immediately activate Prey, by marking the device as missing in the Control Panel, or by deleting the URL you specified in Prey's configuration. This depends on the operation mode (post method) you set up when installing Prey. Prey expects a status code 404 to run. If it receives a status 200 it will simply shut down and wait for the next interval to check the URL. ############################################## 5. Troubleshooting ############################################## Prey has a 'check mode' to verify it's settings are correct. Prey can also be run manually by removing the '--check' argument, Prey will begin running immediately. It will try to contact the Control Panel (or a custom server) & send a report if it detects it is marked as missing. You should see the results of this process echoed directly back to your terminal window. > Check Mode - Windows Either open the file located at C:\Prey\platform\windows\check.bat (the default install location of Prey) or enter the following at a DOS prompt: cd c:\Prey\ (or use your custom Prey install path) platform\windows\bin\bash.exe prey.sh --check > Full run - Windows cd c:\Prey\ (or use your custom Prey install path) platform\windows\bin\bash.exe prey.sh > Check Mode - Linux & Mac Type the following in a terminal: $ sudo /usr/share/prey/prey.sh --check > Full run - Linux & Mac Type the following in a terminal: $ sudo /usr/share/prey/prey.sh Additional support & troubleshooting information can be found at: http://support.preyproject.com/ ############################################## 6. Acknowledgements ############################################## Prey is a collaborative project built by many people. Code contributors for this client can be seen at https://github.com/prey/prey-bash-client/graphs/contributors. Prey also works thanks to Brandon Zehm's excellent command-line SMTP client and Axel Bauer's iSightCapture program for capturing pictures on the Mac. And of course, a bunch of other powerful open source utilities. Command line SMTP client: http://caspian.dotconf.net/menu/Software/SendEmail iSightCapture: http://www.intergalactic.de/pages/iSight.html ############################################## 7. Legal ############################################## Copyright © 2010, Fork Ltd. Released under the GPLv3 license. For full details see the LICENSE file included in this distribution. prey.orig/config.default0000775000175100017510000001000512250331650015153 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Configuration File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # language, en (english) or es (espanol) lang='en' # autoconnect feature, disabled by default until we are 200% sure it # works flawlessly in all platforms. feel free to try it out though. auto_connect='n' # verification URL, if left empty Prey will always activate and run, # which is certainly *not* recommended. check_url='https://control.preyproject.com' # IMPORTANT: on what HTTP response code will Prey be activated (200 or 404) # control panel users don't touch this! standalone users may want to # change it back to 200 (previous setting), if you wish to wake Prey up by # creating the URL (as before) instead of removing an existing one missing_status_code='404' # you can use send the report via email or to the web service # valid values: http, email, scp or sftp post_method='http' #################################################################### # http posting configuration #################################################################### # you can get both of these from Prey's web service api_key='' device_key='' #################################################################### # SMTP settings, for email posting #################################################################### # mailbox to send the report mail_to='mailbox@domain.com' # the password is now stored base64 encrypted # if you wish to generate it by hand, run # $ echo -n "password" | openssl enc -base64 smtp_server='smtp.gmail.com:587' smtp_username='username@gmail.com' smtp_password='password' # you dont need to change this mail_from='Prey ' mail_subject='[Prey] Status Report' #################################################################### # additional http options #################################################################### # include additional options for curl here. if you're having trouble getting # requests across your firewall, you can try adding '-0' to make curl perform # HTTP 1.0 requests curl_options='--compress --connect-timeout 60' # by adding proxy here, prey will attempt to use it in case a direct request is # unsuccessful. example: http://proxy.server.com:3378 try_proxy='' # this option prepends a random number as a subdomain to the check URL on http mode # makes it harder for other programs to block Prey so its a good idea to be on randomize_check_host='n' # whether to send your device's LAN and gateway IP address as headers when # checking its status. currently only for testing purposes, but maybe in the # future it may prove useful. :) extended_headers='n' #################################################################### # scp/sftp posting configuration -- EXPERIMENTAL! # we dont use user/pass but RSA keys #################################################################### # this applies both to scp and sftp posting methods ssh_options='-oStrictHostKeyChecking=no' # remember you should have write access to the folder scp_user='username' scp_server='my.server.com' scp_path='~' # same as above, make sure you have write access sftp_user='username' sftp_server='my.server.com' sftp_path='.' #################################################################### # SSH Tunnel config # you can log in either by RSA key or entering the pass below #################################################################### remote_tunnel_port='' remote_tunnel_host='my.server.com' remote_tunnel_user='username' remote_tunnel_pass='password' #################################################################### # Amazon S3 keys #################################################################### s3_access_key_id='' s3_secret_access_key='' s3_bucket_name='' #################################################################### # if you have any questions please visit preyproject.com #################################################################### prey.orig/config0000775000175100017510000001000512250331650013530 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Configuration File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # language, en (english) or es (espanol) lang='en' # autoconnect feature, disabled by default until we are 200% sure it # works flawlessly in all platforms. feel free to try it out though. auto_connect='n' # verification URL, if left empty Prey will always activate and run, # which is certainly *not* recommended. check_url='https://control.preyproject.com' # IMPORTANT: on what HTTP response code will Prey be activated (200 or 404) # control panel users don't touch this! standalone users may want to # change it back to 200 (previous setting), if you wish to wake Prey up by # creating the URL (as before) instead of removing an existing one missing_status_code='404' # you can use send the report via email or to the web service # valid values: http, email, scp or sftp post_method='http' #################################################################### # http posting configuration #################################################################### # you can get both of these from Prey's web service api_key='' device_key='' #################################################################### # SMTP settings, for email posting #################################################################### # mailbox to send the report mail_to='mailbox@domain.com' # the password is now stored base64 encrypted # if you wish to generate it by hand, run # $ echo -n "password" | openssl enc -base64 smtp_server='smtp.gmail.com:587' smtp_username='username@gmail.com' smtp_password='password' # you dont need to change this mail_from='Prey ' mail_subject='[Prey] Status Report' #################################################################### # additional http options #################################################################### # include additional options for curl here. if you're having trouble getting # requests across your firewall, you can try adding '-0' to make curl perform # HTTP 1.0 requests curl_options='--compress --connect-timeout 60' # by adding proxy here, prey will attempt to use it in case a direct request is # unsuccessful. example: http://proxy.server.com:3378 try_proxy='' # this option prepends a random number as a subdomain to the check URL on http mode # makes it harder for other programs to block Prey so its a good idea to be on randomize_check_host='n' # whether to send your device's LAN and gateway IP address as headers when # checking its status. currently only for testing purposes, but maybe in the # future it may prove useful. :) extended_headers='n' #################################################################### # scp/sftp posting configuration -- EXPERIMENTAL! # we dont use user/pass but RSA keys #################################################################### # this applies both to scp and sftp posting methods ssh_options='-oStrictHostKeyChecking=no' # remember you should have write access to the folder scp_user='username' scp_server='my.server.com' scp_path='~' # same as above, make sure you have write access sftp_user='username' sftp_server='my.server.com' sftp_path='.' #################################################################### # SSH Tunnel config # you can log in either by RSA key or entering the pass below #################################################################### remote_tunnel_port='' remote_tunnel_host='my.server.com' remote_tunnel_user='username' remote_tunnel_pass='password' #################################################################### # Amazon S3 keys #################################################################### s3_access_key_id='' s3_secret_access_key='' s3_bucket_name='' #################################################################### # if you have any questions please visit preyproject.com #################################################################### prey.orig/modules/0000775000175100017510000000000012250331650014011 5ustar guerreguerreprey.orig/modules/geo/0000775000175100017510000000000012250331650014563 5ustar guerreguerreprey.orig/modules/geo/core/0000775000175100017510000000000012250331650015513 5ustar guerreguerreprey.orig/modules/geo/core/run0000775000175100017510000000165612250331650016255 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Geo Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### log ' -- Trying to get list of nearby Wifi access points...' get_wifi_access_points if [ -n "$wifi_points" ]; then log " -- Got it! Now lets try to get a location fix..." get_current_location parse_location_response local parsed_lat=`echo $current_lat | sed 's/[^0-9]//g'` if [ -n "$parsed_lat" ]; then add_trace 'lat' $current_lat add_trace 'lng' $current_lng add_trace 'accuracy' $spot_accuracy # add_trace 'address' "$current_address" # add_trace 'full' "$current_location_json" else log " !! Couldn't grab lat/lng coordinates. The geocoder service may be down." fi else log " !! Couldn't get any Wifi information. Does this computer have Wifi capabilities?" fi prey.orig/modules/geo/core/functions0000664000175100017510000000232512250331650017450 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Geo Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_current_location() { if [ -n "$wifi_points" ]; then local query=$(echo $wifi_points | tr -d '}"\\' | \ awk 'BEGIN {RS=","; FS=":"} /mac_address/ { gsub(/ /,"", $2); printf "&wifi=mac:%s",$2 } /ssid/ { gsub(/^ */,"", $2); gsub(/ /,"%20",$2); printf "|ssid:%s",$2 } /signal_strength/ { gsub(/ /,"", $2); printf "|ss:%s",$2 } ') local url="https://maps.googleapis.com/maps/api/browserlocation/json" local full_req="${url}?browser=true&sensor=true${query}" current_location_json="$(getter ${full_req})" fi } parse_location_response() { current_lat=$(echo $current_location_json | LANG=en_EN.UTF-8 sed 's/.*lat" : \(-*[0-9.]*\),.*/\1/') current_lng=$(echo $current_location_json | LANG=en_EN.UTF-8 sed 's/.*lng" : \(-*[0-9.]*\) }.*/\1/') # current_address=`echo $current_location_json | LANG=en_EN.UTF-8 sed 's/.*address":\(.*\)/\1/'` spot_accuracy=$(echo $current_location_json | LANG=en_EN.UTF-8 sed 's/.*accuracy" : \([0-9.]*\),.*/\1/') } prey.orig/modules/geo/version0000664000175100017510000000000412250331650016165 0ustar guerreguerre1.8 prey.orig/modules/geo/platform/0000775000175100017510000000000012250331650016407 5ustar guerreguerreprey.orig/modules/geo/platform/linux/0000775000175100017510000000000012250331650017546 5ustar guerreguerreprey.orig/modules/geo/platform/linux/functions0000664000175100017510000000176712250331650021514 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Geo Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_wifi_access_points() { get_wifi_device if [ -n "$wifi_device" ]; then log " -- Detected wireless device at ${wifi_device}." wifi_points=`\`which iwlist\` $wifi_device scan | grep -v "Frequency" | egrep 'Address|Channel|ESSID|Signal' | tr -d '\n' | \ sed -e 's/ //g' -e 's/Cell[0-9 -]*//g' \ -e "s/Quality[0-9=:\/ ]*Signal//g" \ -e 's/\([A-F0-9]\):\([A-F0-9]\)/\1-\2/g' \ -e 's/Channel:\([0-9]*\)/"channel": \1,/g' \ -e 's/Address: \?\([A-F0-9-]\{17\}\)/{"mac_address": "\1", /g' \ -e 's/ESSID:"\([^"]*\)"/"ssid": "\1", /g' \ -e 's/level.\([0-9\/-]*\) \?dBm\([^"{]*\)/"signal_strength": \1, /g' \ -e 's/, {/}, {/g' \ -e "s/\\\x..//g" \ -e "s/, $/}/"` else log " -- No wireless device detected." fi } prey.orig/modules/lock/0000775000175100017510000000000012250331650014741 5ustar guerreguerreprey.orig/modules/lock/lib/0000775000175100017510000000000012250331650015507 5ustar guerreguerreprey.orig/modules/lock/lib/bg-lock.png0000664000175100017510000020237712250331650017546 0ustar guerreguerrePNG  IHDRR pHYsU~U~qk& IDATx uE]8AVQQ!@3$P(Hk njPjH* !h.("N{>s|>/{朙̽9s6H)=. @ @5,A[j @ @@ @ @` 6VC @ `>@ @j0VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jՑ @ @ @jheu$@ @ @ @ZY  @ @z @A@VVG @^@. @jبJc{c=F*r7m#K۰>]ve{n:3F@߆Nguv P@+Gyd3.]3]德?qk;5Q:g>kvG:(W> @uG @n@ @*U @ @ @ Y  @ @>@ @*U @ @ @ Y  @ @FX\` 6aߗznJ7|je7NnHuoƱխ&l2int-VhR+=]wucu,Fj׵Pi_?U35>[,~N/=S|Fyg-mQq-~m٬U{w7n^;MqQ5/P75D*@|2Oy};ﺾ=/Xv<0=AZs?oUJoxF?Lz6o.䒑bO6`\0x=޼f^]O;>]K/4w[;/#=IOJGC9d+/=cL~xgwۻr~ kM[lȞ[mU~6 {lzы^4R^چo~siV *lV5^Mp;WJTJ֮@&7mX \* @ P@ @ @`RIO @ ( @L*`I?S8kʴXa/kЇG=}57.)VA_$qu:緿uʷV3y)V.%]~@:c&ʳ;ncWS_uQod|'m#>|drs9glc[ߚN:餱xRk^:}Q=VYBc8hSG=QS9G< ^tESXiv)cjZ=Gz}gc}}-?nY|ƣR暩]h{`3u6i~N]|3owqi5?e]6s7MtڅW\1*}i]#S+XnXJ @ @`X@`X @ @` FU% @ 0, 0,o @ ,UU*,z񴄯~ŔWA  @,>骫Bӂ$fW@`vFmngm??O n(x_^|T+l @ @`UVI  @ @XF @VE@`U؝ @__og#@`_|qz׻޵=gc>8mfQ @jN#;G1'pǧmf䀯ő6 @`9>C=W*-0oi˔rJpKJO<}t-ܧӧn} R|ku5Ҵ׽cؑle~Kvasp #l @rEJѽm/˯STp @m @ P@E @ P@m @ P@E @ P@m @ P@E @ P@m @ P@E @ P@m @ P@E @ PFVoFi*W_}u[Fʻ;{#KO~2x#u]]zב%m'>񉒊e?4NpW/}Kc[ݪxtyoM6I{F /LG}.#Kp/bJyyU9TOzr Sz趣KݟݫW;l}n?suyJ?aX;m=o7-,F:mo[Fmvm!Yc?N?ϊn=ܑr!%/y6wLq5^WD^z=ǤG6)]f_~VkOjxjygU@LhV[F @ @P @ @`Vfe @LQ@`E @fU@`V[F @ @<`r/{3;ئB{:@yY%fm4ؗ[WB:_*Y=cc3W&"@>(V{O"@`uĽV  @ @zX/NB @VW@`u @$ @ @`u,S೟l:zecѾI%r)- -V!+^BGwؒ^W /"?ysF .`5NoIgLD=kkң|G)7&͵z_}{5t1N)},sOK@`Z*O^s/tnYg_ 骫(C?|+Ls]~srg%@ ܤtq Ssrѵӫ'a-2F]J[M  @ @ٝ @( Pb)3 @P@`B0 @ @,Xb)}sta= lcK;V#ý}8m=q*C򐩕%/yI<䁾/}⨣J/&ʳZ;~#jy x)ln?<>)o%tvt^ x39emyAS4p!S_Ŵ]W묯uyWg/pۦt-vΏv$`Yp  @ @)L!怌 IDAT @ @ z ) @ @̺EgYK/4}ӟk_ȶpM7-kk[}{ aF7xd/wϨ _B~'Z3,Y-n }o~sIn{Q /pl暱YLsNW.leS+Gu[߽Vo]5C_6lU/ @`ZM@Ci ~K_l!I'|rz _~owNnm )b}o9DZA[>Aw̼y{mfz P^)15/>`{W/~p:ꨣ}-E4@_d y{^klNH1 - @i 0-I!@`j&cdG?q+}sKGYg^z#ٰ@Lq7k<1)bKJӞtP\e$@B(Q/}K~wj˲D @ x?#m=wK_c=V[m5Q|`zCv-;]rkynbX0G>2ʯʊާZ^r񫰏3dM}s md"kBniڶm ;we[Q&I[lE`3@',4'IQ{^xD?f96Mm|@rmo{x`X?b[GY -ܲ=F7JqG'}1/)i٭z}VA{R|ެk 8RSqrĝ|[[)~N#E_{;N2AzPYAqpM (s@f/k5MRdv߼bܾG}t-!69h.v rlŵrtI7榛n| _hcƹZя~t^㢋.jN=o|c=nl{-O<gyq?Aol~_m+_kGG?_Hys勴e/{Yͷ&ե믿9쳛w}n|?M_^8/OOHX4w|u|]99|ߝNg|Q;3dں~W_}uWOӶk_?|?o MpwpkL4\sͼ|W]uU[ws{Ͷ^ȁ-.37۞gϧ)̷̺'}Cۨݹ槭xS2r=o' lm]qͫ^8=:ym9:}!> }@>0PL.DYH۟Ko{zsۮQկ~5= OHo6P6~Ky睗N9t%Y1L1 ~,BO}* .|a|ԣB{18]{)o=/m>8M;K\*勱ntP}oB`Mo{ۺG~/~sK^tOs8S7FKb4~cigqF'_Q$i1 ]?E\8F;.C,$9/s9@E}q[q r =Oou׵m-7b7[4;gTI;lkO|1'_,~Q8~,?>>1zF]A3'?ɔf(i/~>\OΏKH;ўxxx= y/sLލ|}̄(c8s.L8f܋R<".趽s05#Q .7EDYq{S|.SQS3bIN1/Z뮻xDLJ A|^F>>z^6rSc{OOèO__m)f {}l/v}x@xl'?=ۥnR/ @`D'LIfZ勉:,4 OCnGsb4.|1؎ň>1Q72W=o~&YzZ<2ڝc΀^[gmG'_^hVD/MПW0ַ5oy*_1:Z/ExĶ|QXs/_`5=`O|^c__y/;m1&ƽvq&_ܷ#GsЩɁEGEcpׂ玙9 _8b|2G|߾=iGc8߿˿49@DOz?Z>&cǍr T[ޘ)1z)m'~QH̐|Frft6ϟٟ-z//o^$=[򖱯wg@ε{Ӟ6|>ʁv}w>">< >s!|=/OWxl槜#=}/<-4 f(<>?#ovc9`&Lۉ>P5.s}@X,7/ Ei),43ʔGc8z嗏i1ez\Ŷ4Hyycv).ϸs,'Y Se#q^_*NJ*6ǎϑ^>O~g_/<{@ ^QH{DdpbT7.#EbZLՎGͣ<:oc n3<opqGG\;_\;GycZ#Ǵ탿{(nC^#=b3ngxk$nY(6@^B8W"s/ȳc{^)ܘ;n}㖌. gNNZ51.m,VM M~T͘=n|ddP`@j.!ޏ0 IDATSc)"f1|0|NܾpZL; SO>v1`)|??l;G?B m1uy0E^{kxU'>_&I(gMyd}lS7|s0>KyI{n<+Z^ i(rSvxb)ni"~ѧ}㖖~Ky9x-@8Z bK"<;ŽqOv| XU:^*ŊBiqӅe2$Hy誽"+\GJy@KNԮgq?ngV QX}ph8RmRu^N?.s0M^q?r?ﱖA>\P X7  ܨrR\E' (^2'Ķ52G_.b}HI4/uiAD-Zqe<^B?0|=֨@˺ֳ }Ǐ'@q<+(J`ԢuX+FS\"M1r4I.^tv"UE~1>yzk(/]ZVvѫz}xYB)iZ, ģb>QH(nu>G -1#K_333Tqa)wK9^u3?b赥3[G{>xqO#ѥXln\*c1hbSbc,@Ă ^ogD]#wbѶ|] X`-??Z{8_ׇ"̫w"pTfALzq[\|=m;vĨu\~9`= )f{(}E.<>?o;fE@`VZB98BadelH1ڼP{9.Jb5x)αJEL\ f V}CUc5ZwxG[վ+o^;`<~U#0_cHe7.2veKQxe9VdUg!u#b\)Qiq1B3iNS*y-C&A=m._"#&S~Ddo*Xb~\Lӥh\OSWecH$u$4Iq{. lԳsG_4<;ݸ/mm|ŭ܊HS^oG fG@`vBIXAng˚$ŗ#h1 5RZ,E`!E/1D9ͫWcbt3.6 'f(-quxE;{5 H1KN1uʳܟ(xYNYt~׿<"0~WS<,?}xj)եI;o_чt]Xm]>qNg{F$f[ f!tV,bٷ)1]۲k8K{c-.EOhgEŭJ(u =RQHӼ g\08`98:@\~_G  PhqL &]/Vϖ v.nz->'bĺt0Ӽ#`u^GkBw]2p7Ũ.ҮK<>N?ݢ]cy29;" vm<>F7dCx3%Xc3an4u|:yj6&<.O^̮=n^n<~}4c&_x'ʒ/`g/?7y6żmݛn|2|BwXYq6cyy6_790,6o^be})/[v ϋ(kg]ug1OX,Y1%9Ƴ?ϴ01/ZXƨOܫbIJ* ݈d(dL͎)=l,"W{5Dvwm٣LqwGy_PiGb[oށǔ:F>o|H٨WLϏ KQW;Fݺ1B|}ӱj|fwOȘչ{BXmZ EۆUaO~/BRL'T`4L;'F~Ǎ#E?u.b{N7RL>ϛ~~)ЃcI'tR/FǻSգ[5]͐Ģ8ØP@"K^6xE1 Ʊ纤c}Q>lqD/ bQFLˏя#Eu'N>OE<.5J/[)IŘ~'A ØϟLrI6zUlmx"Ls=__ϭU2xXD#Ěq{DfA9x`]/] myITY"Oݼٝ#>|{Pڴ~F٣NxqA3.X/'rx9ǟt jԱ=9ϕq|ӵ>R H @`a|?x.G1 ǔ,46XO"@>z @` Qع([{O~<[õV5 @m[5#@@/X+OM~v<]- @(͔+.Эb%X:/cڕ'UDF"@@_A  @ @@( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O_dJ IDAT @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@ @ @I  @ @@_ @ @ h$E$@ @} O @ ( @+(? @(@@FRD @ W@mW$ͺg8CR w /?E$C P$gӷ{޶}{D%ni]#ܗ-3[ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + +  + + + * + + + +|`!+ + +  @n + + + @_ y+ + + @Pۻ+ + + ;Pv0H+ + + +P/*+ + + =DWp\??2Xٳ/D󟟾I̹uB3h7Vܹs?l's/O?&1/No޼Ç?? __N|$;]Wpz p\M)G/bS1??/r2??='1WWۿMݻ~%|W_Kzsw?lLχcam=ODu\Wh/V\W؀>|@ A֏59Z=C>Gɣv\sQe=OW8+d>>Ik ?nCsixnz\>sΣs\W`? ~#u\W@sjD;fRQhvǚ'7s\W`-|`-ݯ+ LB:F`4%r@d\s#w\W`[ ãq\WZHtM4zh07Y (J[G7p/s\=+W8sirj>I$~ 4ڎ]w?+ k+ kw\W}ۛbr15n7[nf75LdXq{+ /u\Ws?EƩ&=?(`N[srկ~5Ɯ}g/???? zh9Gh\>sMr\W`w v\W`^iLD̈́FM8=x`yN_g]}s}'vSߟɟ~򓟌5~A)sqlhDp\Wt? \W88nk\!6F;34X#=oeR:7Z^_szЏGͱXӷF;Ǹ+p.  P@sZ'Ӛz yOƣIZ:b٦=Jh5-5@Lsqipg*?i`~ +`W욹+ M(=8;Gs rZpH=\F1o'sO}L;A:h?k=[cr+ @^_⭮+ )0w"\Dj0k7ybfGu8?v,&XkpN3?v\Wg1 c's'sc4٢Kñ[hXAl[19fZ4>ICr1~)ԧ+p 8Ꭓ+ D,'-$[N5'KS6ƹѯVmЌQ[p0ڼZƒ A_jT<26v\W` Fcp\ hO[8]җw/n/\bk|8Ys?A_SOӻOsAZ]4;W8:7X-\=i64^/׷]WX[_X{ܿ+ ОH>nlyr#>MnSpw.eNwǧ??<$>=4koq̑K e\ZJA_^+pT hNTD#풾_nkNH׌o;TL#~u+}5zaݻwz2634Oq1ēhbL㜳Ŝi?k|i|3F]Wh/P9\W@$IESH=rȷ&g4A\.#9͎Kts#9X5SxiْW[k|8Wp/q ;)uԋWƳ[wN69Ԛ8^vMG;֎X^=|vCvIX苵F3`JOg1Ѻ*>Jl7^*[0s8ksGis~S^M x|i1_½$gI|kWض\YNf %ixQY^N˿̱v[#aNcx4c>oo~󛳑ŋ\tӐc-|K8?s_O⭼(埊 =+ /{vL L}[Zgk>/e3Gn'jҾ6i͛CS9O'̓>Rk_ק[K'GPǚµ 2_Fwmi\5>CvY/^X|V9 ) i\c*cjʖ\ gX-|$lDlq'59krE*i:5ƠG\5qƒƐkk}pKs~jKy[sYk#Ʒ]W^SgtT }Phk< U\C݃sI%r`>z2U w*>7Aܒu+}zŌ洝[KSx[$c}H_c^[/9ޒ8|c\k񌍭M_hWmG|D2oz'hSqXjw*>IlMGlki]b|6vٖ?oOp Xsܰ_;s kǪ51vW+ y]0+0Af%jӂqgk^qgGk?seOOzKc\|w*g;GiG,=c8OkV6>8kqh8_݃wgoVXyDZ\sSm=& L}Xjl񶈧WONp̛>OӜ(->;yqzoǚfLrL%>j*9Ħ=[8Kms=xK8\U<9]sQe=br8Z{jђ5W>pn`'MOZ@\܉ G˶K,nN<9';ٳߌchN??]\uwξ> as7V|)5%,1ųK ^mR`GCRcKZZVqV1FY䦟Zs'5';R}s3q$Z⚕9Ǐˈ7j5o5TsvZ KxK8[qYjh#b= lM_ڈx< o[GXBiۚܽxݖxΥ֜Yt}e\k7G zhnMaOu/ީx[YjchGCCm6W` GcR+{-bVR3(V:JkOvrGls!94Go*9ͦlا F)^S=[ْoW ^\r1hklǎwowTT}Ƚ kIֲE|5V8Z2/rm ^>'65z֩kuLZ>ľfAܘ:kĺ%sz4MHܟ.lg\,1KXK_XKy;@5VJ8o+_+1X8rqi_5; IDAT[kUk[_87einJs{oA+-úV[nG^-DdskKۿy=O:~k<5Ѽ'ќ8W/nu磀/X3MG9nE 8R3Ϳދ7 mK9-|n\[ƥ_~ (;IK>+W.9jchmo?=k/s\J4D%6=]MԽTطРU.a]-yd݃V~ײB -pKcǝF50-ƥGָZĠ9gc;CcOYl7eɵGm KNmlMv| qVY1*jr\QJgo"'ĺV#u޹{W֛_jx[4ǚϽ&ziQsx1ӓcW:1>kl-xr8rs5Mc܃]iw]|`]W hXړ]ME)ը6:ߒU>_/N-=]InZחO_ߘ#νiΑ؀ĮĦv5>״ {ik9k@ges[a.Ʊ=>yk͸#O?_"~ݿvFYlgӋCCοc/a[sM;.%1X^ݞ1iQb֐nķ'Xkm[oU,a)=h{pҏd̩j\59mԼnjuG=:}gToؗh7e+dz4GM [jƻE1䥵՛{雃& 璜ְmoأ`}O˘]ȩsv[ˇzF4'ireQmSʹiWlמoO_ޘ#Jߠ4[AKWk -*[pjNZ!׾\ sm{q.=/J7Mn,SzzLb5qƕY&j5K]ҮѼ6UmJtv5>״ {R뿭xZZFNY_{!۽Ƴ8:nyZ#-^[h85%YZưuxkK;lQBֆ>}!Βkִ([5w⩓^3z-c̵-޹|?u ̥te؞{aܩR3m)qGVl.iWI^Ҧ$6* &_Z#8fSv5>״ {cowk<7kCiɝ7׶xyzu3YW>mH5K3٤?Ʒ%K,|jn櫍wIJؔ&m4>z+S/XA`FV+q0%:Wcm@)o+kvMqj?%f[w\9pӜ/M[͸Xs5fln'%jM]Үm=s955TO|Tҕ퍇-(ZYW]i_roC+ԃݻw2[-▓Mrkq@;K=Y֒ {IJG[hӰdr<7ccMwMZR-zX_MI>/_Z<_^WNО/9,{$%mJ}aWv -b,ץm棏^G/rqy1I1њw|1i_vv%1nf>c|/,8֓xE%qmݦ4[q_mXjc`>xZzq./}qQ%os/'kgZre_vI_GY"+~ C{:7鞫yxX5[W5mk}Jju[n/GR,c1z lsXziےW-Ϛ5Kmۺ/k|V<=6V>JbZc}YO2s(ujjlc _mXjc`>xZzqJ|>Sk6{?[+%ђW Zk.iWk6Ke5>߶/4Iw%>hSSݚab=>[pfdmK9{Ś󳴯Vc: XOPrɘzۊ8jbXögݹ,KՇ/49ɢж_"( 6(q,-XֶG1ʅ<-c=y駕k+w]˜Z;{mՂc-%v%6x([\}X-ص?? GzimMKt(oX} ڸ[*<̭'K7[%}Y=(=Nܭ8[l&5lK}؝5So`rg" U%t-LȧWMn[o8PJz%dŻ/D9޶M'=X"^>ZjS˱}%$%l> o͵8}@1Z֓Şܐ7>9Ĵ|!F:Z-[њ|-sܮ{rX5|ZcL{9͡Oֈܭ8SG%>KlRbUk\V|^V==K͹_q뉚o"DO T>%Ѧ4;آXj[c[qКU^K֭r|m[% XO4vRӒW Z[Kڕ:5Ǐfz| 3? ,x }%r.QjSjg=nMZ-R0mӛsI~=t"VsmE7KkgV[ᩍ~ %6x-aE֘W/\Dʂ`NO|OޱX5*ҾJDζwZʋqɺf$f{I_21ܸ,In엌Zrɶ4,ǖ%k8@X,|Zۊ5%%>hP`UnW㳅[qʇ<.W1=o=ɘNc=cȍ_cc.ʜ9?g-햜-j9ִ/]j1,=wkV|ɸX|X{wHl>8 [--q[c9~J|ɮ&Z8Z}Zϑ 5r]L}m[k`XcO_9n*r߂~ RKڕX%Ǜ9{%-ڜ͂Z8xKV-◈ǒ6ְ [1>X]ou4X?Xkj#b`&C94s#~9ΜjY˱}=ؕĸ}Xcɍ׬g|_s}6 ԠY{a{a-XK%6J|,i_Dζw 4)ms-ǸG Bk/}nkbK^{+_S<G9_5ZhޔGߩ:jװ-YbJjD\V[2v~ ۂZ`@ы3+9ȹlPRv5>aR`9] 6cϼK*6W֏0JGƾvI-*jWFOm,,{aUna> 腅^ޞql( 6(cԦnMR+ 8[H2J>mS~K~pkmkSc8U9ߩVEVw s̞,x d,5 w/VbF[/Y|b{q󖸭P,`mҜjr>JƁ~W!jy9KRr>)ۦr-Sl~oֶfs@=b)yJѢLg9?Sv9X[g/xr6c|s>[i.~Ӛ-]c=6\%)W>(9п'%S>vVmqYjc[X½8,1 kkԛ_HߌD̻za>$# '|oe[ZbIc}89>Fm6WӦī᫉wOZ4/IXܹxR[LكCc/cf$,7I k?ld 5\Hk?c5Rݵ~rmO8Xec\h'5Ҏz 7naf/8'|\-܎=+V{כZos]?=5"7ؗoGXЦ$'Z[-}%^SJ( SK4\}nb,0ϊfKxk,|c#wO:)Aݾ77qMZ==8{P;xpwGQjCD٣ 4Z?̯5om\kAU޹q{ν{1;wZNfSXR-r`Rk lEc5hZ,>gKNviV?59AuLLqûw~&_xz㏧~/rſƦ121S~̇>'|oj'e_j7?g''gCCe8}Z*g=߱k_^mosIhqiumGՒ(bK[O ~IR_5v-k9r#{9rKMm0DŽ؇ͻW1&O2~|ĸœW z؟IrK XǶE}J6q\}۶`aܖ{`{pZ m Z* |#KCŭ͹'X-ce,J8zr[bq|IKڔ=[rJ-'+t4g-,W&]nB?ʻoup ~qqzExu?? _IO> 1pGヘ?㏣ɭ$Nq8Z՛Z[㱍npLNڼ ƅ˻!Q>xpt&"0䋻'BNp"N pz69<X8s/,;2v0vƝve޲_ڦ)NrXsQ0͂E<{ƬԡG =8-6'oQ]&p-VO-VpZߢѱ=5|~5j|4zۂCagKOmW]N߅&p;~296EۗG~x~\MdpB (xO?==ؖ3w"~b۬ssm9[r'9e}׿qEM'><1L1I_  b'A0߽= 5B#xe<=b'?t/XX<.2\Ŝ,Jʅ6`5e kgZ[,XF=8-{Dr-b8b#rѱ[oyYG٢b2J߭8z--XDzo9ѩ5e8pU*{(b2~:+ o-r9ɿN|ن(&/< w< /zp%hm2oFnᤝeFMx #x. .ar.L߇;nЏŀ;>T`C D,uZ.>t?5Cܖ̑u伜mS^dMlv'}Oclթm6 6c:hqơsF/>stK>niQiijqb9ݿ~L-Z=ro_Ӓ6`b=VovK|i9|m.I&o-7aIb~ܹld2rt ӫ~~.Ѹ!6IYOIXɵ˶E a'[pcbD'0Gm'`vه6 n; E!Xd59j-NrqĻvG#9׎vOJk g@GksZ[ptl[ėTj]ObyJvK'wo+L/m9z݂ Q}_b`m^qRGX8LD^>y M;cs&52ecmQ3ٔ IDAT1a‹^?(-Lca_+W bm.C }%NtXoB[C:ޔlGL(g?I/k -`K8zp)ֵ,گ͉Xe3u 7[ICk39Ȣ' eae[VmJUo=ZuN?߱xj;a¤W1щ ~~Ir/{0c6?ydl,`R0e>=яYڥ>NlZ%.iG>YKܖ5Q!1x.o  "F?!z@x"}pǯnr"ц}L}j}ZjC ûx1 ^;B ~x%\a6 qNS}-`-qh|~6WMdΠ5q|C'KNC,,x }|IAj;X۵1ȺT1ݛ^$/\$#n+ÄIn0(FJ ɉ4"e#5H޻{翛Oʸ$firt;E7c<W]XyHxu<<tLU=ӉNBp7{JBx l}XԸ0<!26M}h>e>X;ec/Iziq]sM=qjq2w͑w9~i#8Ç:t+qO{dVƱE|IL65v-bym {p{#K.BJ+x>&q "\m?=X#Xl8d iq >C}R۱ u*j16g+D_S~!r{j?42ԌteҞMp`S(>WF 04mF|CI/ؗl kDLZg`{wNtYS#,{QvR798kͩ;i xkOs <8,%wn͗󁶥_'0zq2[CNϾ<L at{:<Q'd8n9/~a">xb̗u 9a!SnQ[/&ghCi6/؆8[/#I$~c{">wߞ |~"~-bc#NGd\A\.)1ؖ풋-e(Wms3 {ϫ>'p#&<7Ņ{a]^xvk̃q5KJ#퉕yG%/RReݵ㸶ia[kcΣcѨbZnkc`bܮg uC/mLp??j,aN׿wzY_nc?nr?<瀋+aCLd01}駧~8YːϘ< /C~}xp! $7LiXHx&c(oa" s <؏r^Ora$r;f99y>8Ċ}~L7OIExEXx˟ld L>P;|-% |} G' U\c)6NAlPKbٞgēڼ\ŧf'N`7zk, ^nGhgl>vnܹ:azqd&皾{hG[3F*?Ma9[c=8 Nm Zڜץ +~IR_5vE)eۂVO:|=&S%~&W'T0,v/HlDW''@"LB9lxO?6h{Sŋu,@ <xlX>>;}c#<-$OM<჋c|RbalEڽ |CvAs,_]̓}<&FnK/m-vZXx-Gk>Z>Z-qhO3|[o5c<X8-Ǟ[b#o9~ebbѶַvִ'D?~]clo&#q: %ǵM== wWo-6`rsYO&O„UŠ, &BhC?,`p~|0yn胸qpX 'ņ0} vr8۸:-#T?C\?_&hd @\\ x;<8mp(UNmO%ܖ91,؏6WpیK}rFrA=S^3xGqE?1C_k|͹ѱ=rKl, YK{ԥKS[a+fy\?gK<阬1`Î'(ךށ2lb"/b ?d&ΰs?pXaҊIpܶ'{M+}~Z _]@nbqbӃu,$+^YL19r| nG  edvnNЎ*jհch$Jmjjmab_X%|XcW1dͯDy 1X_n< z/= W&ИcI,a> q1Ꮣ0iD/pbaN=}Xa+㈖wCŀ0:66 A/ďv|,`5ŝX j79ݿ\ɘr8}R~;5ކM ?d Ân:>_>(2FrwXP1Mb[ݚ2ޭ}K_QxW"2|Qgn4Cknwc9,A=6-1h{I1V=$۸p%»?L⻇#&7W#6a;w}OcRXd?aLq%BLQ&&u Pm>NĠ E'KhgH[Msݯe;3 aCC#sXWZOrشG^Vmba!mXDEƝX5l'c5{_8/iGTjqjq=8H1)zGx]m#8\sqcΣC# cu_$&foͅv5>%GKwl&1ιv|OW}[EL& ub/6ܰ?p~8ؠDs+YaoǤ%WFq?&Jcn1UĊ}`h?d>cmH@B:@Xxw@>&(pjr5X`o?,69s|!|)aކ1>4dž&@p:t 1avGqWK/ZMmvv:[mʒ~n7{W~ӧzwsQYr #Yz{o8D[w{҃S;G#9-{b{r[Wk,O 5Fi+[HΒ8x|C&qJI5rqYE?7O>~Ã0 BL D~%i08\w|'}D}^9|NL=fܖW0dڹ'nF?b?~O>9J5 lNt)W~ lhrIz:QG=|("b~rc0, 4Nq~܅I|4vp &xx?~9c7be"@ĉ~ $` ._%NBbA|&Aċ>|3ĝ1Wp]MB "GsR,1cۂjRJ yxt| ~&~>&(:\͇8cvXx^.A=^Y`&!m8^0, 0xo rE=f;Ɠ8ƈmcl#>mC; #6Gl%ߒ8:G߭s^Sֹ[S]~|"7qqM(VkfG# k9>,[Z(/i_(qnmsM Npa1 Jyq%: َ0+w r"FL߻$<ئq?mNN[bܥÄG>~zEtzj}Lv{9 G~B<?ǂ!pGKJ͎e>kهx6԰"Ÿ~pB\X c?cQᡊXBƒ {U`O=*#7/ xBW䂸>]9Ng;cc؎}#䶵8q ۵%rl63>ز|BxM$ ї~9 şiޅ\btcr&OU~Lp WY积`>.*|q &q 1I ?QNюe6O.,=},@\Õ},@1A@ \Fa0}tX |\$x 0G;W7q2w5H)kbن}6)Nm-9-|K{\-t!~̞b!ֵ|{\ZkۺxÈV VGD].kkkc ah[丵m/.NNJLuk^{EĆ 1x8$&8qD\叱I\ظruC綦$]nzd wj0O$qx`_b0ܛp;;&0qāLvD! t"7Oq7/6 `Aq,c'PsD=, &=|NC @d xQC[[9á]ΒZ1fknmyni٧)cbѢ^bl=[iӒ(=rm56-lڢ m5kQS,Lf}]]`IpzK]'x}d_+̰w6ك}ՀUVvLBq?9mԃ5ˏgWDښ; []a:|_7 E+L'踢$'/}~rb%^W%>Ma6K Úv}<$7jk-gk%־[3gcny߿ZpALS!.rmIK3~Opl/X-9v8p< CG9Gc&~,W7m+5głՎ˹Q5s`[{Zc.ÆE;>O-údy~0p0^0yƓ߆+/wvh};&I{: }";LqA\'MxTR` ,{qw⡊,ԀcG<$KL/mb%.{l8\}r;J.k^!CvL\z ]dȶܶT>Il=7 :=h##rZrꉵr=oȓ_${}S= p9c;nicO~cHR=a_n.Yn CەP|, l&6uYPh$n_kZ%6+ܖ1}C-qܟXǍxn@sK27|׭q`n|%3rTon5>&7!k=.k÷s+Xā}V'hOO40i{$ܺ+V"\{xʼnv0Ը}/oNI=۸nQ'*@"m>uC1,pt_b6p9.1}bmow\6>+ihjxn%-ocƔѝ45kZ:tY35}k_=b\X^%Dqs?^ޟ'm-R_OiK,َܶijmG>ΰK[Gk<_8T1lkS/[rC1F i?Vk+.f-7,G_+~㸼Bkh~뎅s#f.=|[8| klDŽ8B+&mP/aS>i>ioTW ³bd +)$bQ_Kw~vzW05Ij}jmYRۭqnYŇ)JptW Cnkn.g6se?fE =KF3w+VQpk빤OK{qZxVWe]c+c;A\lqOG_]x!'N!FLss r_<=>Ǐ/-+ jJ?mBEKA^FLTQ{INj/%4>֜Z>>\ p0>8޻.J싀?6r}ۮ+ L) Sx\k~W`K :VZlk\{mxYj$'Gb'mч}>цXC Mxǧ+$0nd}\x"ܽ b|Oo^uܩī!OLLčvYR6xi'}_>8r~6|9 KWq"̥VÂ͇/^`l0n sX( ~bp\\V^[W_˗]؃!Nc\=)𞴜uZzY|[sB}p~F,65%l &ha"Gmav._ܸ;7x{p|XDs^ ~>LE,0 .]_9,J }Ldo0,8{WO~x:gs1H?wpet6 yϚr7WÖczΦE֗^/.!mx&*۰Pr?Or <hc حQ/&bvKRq;}\؎|D~8LeuT @ >1m9a&lc>kӟG}Lpy@O*O\hLQ^={~zq(\11~ +/?=xL1a|mxgEƯ ? /qxh>=⋸p7L=}O?<*<Ë_AS}n ~iq8yj\qW6~>+>؅ &&{OxO~'O<  ~I=^LsŠ. w;קa,pYjc!ݯneP||W\U1Ix`,Y7 u559kyp/g,=Wp\W`U8a=LnbɐІV/Klӎ50{5&^|]~x(c'L[1a(&EKKc L\6P`q8'.ƢxI`;w;8~ ;|fVm`LOB@xVrb \͜nG]ZQjv+pL|:?x&As븹p\ZzD̳f@\XJ$2ԇomӇ| :qn,vlߏW~L9i$PUxR+ރaB"mCЀ b~@0y yLh| x? a!qɓ?FI5FmkJScWAۀE`wtxO 4F/ ,`1wlӆz5ZGyOv g=(O[78֚tc#g  |Zǩ$4=>šOb嶴m!^0U2(x]O^bޚ=n[ǤGd?i}!} `pBG\d0\'rK0?¢0>x"|0iL,jaD?LJ1 ,cwQ 8-h:Ekis>r/$܆b? FAm+(?I;ɇB#d?ɏ}gX-mRL4^su_i$ڠ81׿ こޘŐ& <4r\(g/dž8<{Ɲڞ= H|jN` sC.VN58yKAlXba9޲yJ<2Gı-guw1_j)m>M~1Vp |)c}x _zeN'S S )7f'q T־ɟnCvɕh=vZn͇\ZsEsBkmbKZ Y4DQwVm֩M,=?Ws GԖ8p})Ħ}ri\#ba jwU.ol,~2g4t ~g\-9b;:T[ۺkŷ98[Ays9eo)jV[m|Qrjq9-Ej0ux`1fhڲ=W[xŇ.mG;0Gcx'G>-s#5yLemL?>/"̃ 4m>k`嶴d}T. 5&G8]HsoL@ksC1Am.GkcYKNo-VC>Z,p(ϡXpZxm<ϰ7.oףwMNKg N1x6;-VKcIecIߥUxBW,<8ӫaN r9Gs$ܔ[k=&[X_OHQp=Fvȹ54C.1֭#r}WcG4bkb[$'lX8yqJ;l0j?=ӻo_z&X#;|p5}M䑶v& >xԮe-\e-=4tkF훕׃Sq׃.=zX|[pk_j;Y,c&=ʫjo6Ǵl]lWϟ_M%nt;Oၘا|1{a&0>ϾClKs_G}Nᤝ-(=伇r<%VОǥ ukkΣI ,<֎EY?ėhe+yjHמhib*X,X-S<Ҿwoޜބ/yinV>J+xh_ ,ƞ냭lGsxؤYڀ͕qsɍ_x 8$!1mZ뷇1CqC.kƸߖ8-Ǒ?(r`ЖEVڸ} %KX|Xς%'1n#t.ViK,x% pޝ+}lwzܧ>َ}򎵳_ZZ8ĺ~bl=.[. ܛ$Ta_ ZZᚾÚ1w|,{Zc^_6,m\c>lמib*l oVq5Sb؆åImr괰/mҎ_n˘簰`ȯŶYl[˷fkukb27lC96p\yےѱ=7/G'm+__M{BR Z{ooby<cbYOh0'VxAMshgXF36K[sj,qj9[֌qMGұu.kmxP- 7C`P w9kxMm@H7-VpZޭ`q/ V-ժ=AdUUbՇ c|~].8dܖmc8&)g?}r{CⰭŶƝo/Z[QkΣAI߬і+˩2Ed:G>yRh+c|/,bp//k>c]kOś齯=YQ[c_bk$co אc?Hsx-V?-VkƸڼ#͹58O8і+[!:##1<X8-cdoZzs[GPjmZĞrܟG{2)pnO,1lj5qwSlh˚v웪s~Ҹa,-=y-ǒVpGErF.]"q=:H9!1=|;=ȢV=r/kq&۰׃3gm/m5%KX}XcX1d[ĐsX?XKLn[G朩"}Nqf6cΒ3h~Mc8I-6Zqk^8ɿ%֭`ql_lP,Z{!\x'رX^+խxrh?w햓Zڗmo8];{pZ܃oXwָsձ>=8O-lM-{ |RZv?lZR%l>zmcOصc=mNZgX-ַfkT/P{Bom.=by|,Y=tړK{]_ҦWlQ,"O'wQ,'wV Zq/iWjnKGŮI˩Yzpj}kqkcȵ';q{lhyqpjyu5`^_6(\r݊|oqO4 %U2 DuQ/Pzdd1"^l&ժTpw˿:c]ПJ͈]mN`9 IDATum"˕8g{Eڻ9jmSqxQ=8Ӵ 6sdWuyw'L,(hZ ^ F63U?'Ꟃ|+B;!bיG6]>s~#jcKɍdr[mJ5fb4Ӂ;;2ǵ,\Ezd0"XA^@1H=RzA*>z[}YwEw9u?G~I_0޻vӴr/!nN:Žtd*QߝګpU+86d, #(wzLWpcCtGcr 1CϊI1?+{pU1JJ/wnO EpZwګpA6;[g6J׮~6fW1 ߫ՉX8ld! k$jBsǽBX.SM#Av{frԾX#]0uiC}[%Od%*+*=U5̗mhCl{/npD`\gG3K|y (CzPLz{ZtwN*6nNw+WLn]s[JWMqVU@+{z[fs`fIڻu9ZE~*>@=?ޣmڐ>s9oϯxϫC&@ޞ#8?6woޫe`P gԢh=EUgE NU oqli fܭ[+8[_3HUj1>KãDpQ,0<ǏXsȤ/ڿJX΃qGqh} Gj^nJ>Q_Փ"[0zwtxޭ͹>k-Mq?*Qx"8چՆG?Lq/{s3;*x]LڃO嚅zpU1JJ/U]==pXO) fܭ[+8WG"s5|(Ϩ7{zbf" 6=g0sϾIOaCuX|QދyPL_lZSDZ%]w*xE»WkQogy0E4XyCYg >'L<*=/'120F_ ]Z]hn*j*k lnQy1~S<V2ag<7=/;?rM+B-2yRU{a򳸢<he`*j G0Znm9(8{R-Xn:~ZVa,̉<^ \D35mobCY<{vsM/ᘁjzpJJ/wnrPyZr`ؼ; [g]F+gxh6>:|{=8x= OgG3;*xsdMD^ 8#Zo?V_ѵ_9 }LͮKɭMXɣjEp3m{Ϟ]Y:Cqd*, ''1b2|^nU=Uܳyg^}R^/0G&>wk֙#Q# 嘠h=r/Q Zxf"gv 9Lqo]Mfy!MT_bz_Q Zj*+@<ϮU,XkDC@}H~(ރA{al3ьb o7 g09 G 窾<00䊡w#×Bpz53qZogh Zw RF7j~2y-5$C Zb}'F&ƫ5g! {3<1J8}I2) (,W7T@=)pZ-o c82Y-5$C Hm%nSbVE6XlmūmsΝc%/wVLԽ|Qx 8GŠʯ7kPFȤkGj\Az%7SK`бlx\{ZȤM?嘅f'Ljl~&_k&ޫ*r{nć֞J!|zj͋]31Z^ΰ ~s}γt\_>X5䋥dyT0y\QYؽUŠdԢVq= 5y`j͋U@zeO0mյ#(gq0y6=!ܟg~@','J]67pQ-~(R[ }"#H-oEcFx5~^UQR>ÓG0!34X/.W1t]EOg>WVq2I{q{`=zD=PޫpWajƀ 3zU [kE2a` q<#gp{q7t3zC'^Y4{S걹Y| (G?`wUŠIFjN7YÀLZGڷp}z=XPLW+[my=\[9k}:oU&qj ~&'+bP_h=qPLzp֕-A'uHּ#hRɃA4l<V76mެ7Ϟ3|j<80>7tO}WrD3^M΃#C= kJ/H0.C'bH=Rk~zzK1VxEpb ?6=1#˸|GYg<Љ"Y6[Da~='a^IF}Ѻ߼~`?td5 čz{0hU5< c'f82?zF'e=fe3\9"3^MI^PJ+{QM FH!HY߯y!՚hF Wr毯}N~f}Ee1x W3T@=\{ʯN+W2V{2_VEFڕ8'>#﨣?g>kFVNe}?÷Zcp{OyzC1h=P ZxBjy7?ozud҆ԚgѨgZ>=8Yx6xY oߎY:|T_:qUasԺ ~6'aX'_ xţzR׫OH<uǓaypYs6K3ꙅgD~G:WrutW畼\yy R,/J67噉j{q{b=,,o>++^p/'J:T[S5<21+hGP~6{?8Ʊ*y?w+y*ߡՙ}T39qEDa=~={&xpOdj3kD'zǗšm^\;CfFz`p#8|*xT?|\'ݚ TfyPy|,(LWۋ'y0^ LE 5r -T1?7';o~Cի9S7}p(~={R|O9O.)lN'/̠O4^=}tҩ7{FuL?ldE |%oqsxZ{l')'NfP8<8"X/Ξ^x=zbP_h!]<^g(c@'hG1hGË<=y"UQ߆;Ngazq1=fr:j_}Vf{'PqrIfiVY| Q}/ދߗh= ӳ$ \d71ZܪXmِ>\,cr)F;xώZgZO@mDkp<xx20gX^XgN^D0+hy=6Oܿ]v%wLm+LNgxT9Y| Q}/ދgC7bPqT<֧a,:OO3p( x6xo{&oܾ\w>Wpǧ\>i_򬌏xbWyaAe{ JqᯏsL3U39qEb3qյ2O-Nz=,њhF ,{l{6^A=t24ձ+owNjVVAf1*pD=D3^LG˃WoD{@/QUjƂhE4gb { z0fi\LlT7ۼc,w>:fjUpM}BTY\zRp39Y\Ux>"հ^8֬ggjmK{'O٠z{b+öHög N6wQ}q;^gC:föH~ög0=yU~:g|!י)۵[IxfQp39Y\Ux>"հ^ٸJ@/Hw k[`Er=gpԼYCgU9 ~ϱ'OY;D]u'2bW)?ͽF8-;!Y^͙بm1p8X^؞ߞW=c=LmԫկccV Xgh+5LNGjX_/5oб*J^zԽ߷Mb+Eg*DGl\Qcߑ@/cKtzqب1ؑޙ~؞_^Cs̸ǎ1{m.~I;9,Y*/6)W;zi\LJ-7"WSoςG;K;9lw#~*~} qdd5Go^3:j\]NgTi(x,.O{rvG3"LEI̞\ӎ|s% <Ͻ&|Uߌi,}[g6GT?`g>oZ QF&:øY '5k9Gnj~<=D0OjT+x,.Oce|{Fc;4^@R D'˫m0=8ƍRrfp ;239}ߨYǚ 23K[frVbrkWoI2/3:_oCa.,MũޙOl+/U|\\bO1;zUzS+x,.Ocut @fڭ5-$}6ނz`qAdQp)93y˾yfe*e*uLj\ ?Qxo;VJyK "1?`˓›spۑ<[ayuhoml}cqUg?Z& /Qd\cc5G%Z8Csh_+zy}\zb}~Te Mşj'f渵*ˈ8xǑ=;fjgj;=uM~4R9|,.OM+vy @^֭/ aJnUQӕJ^E=h>l<W^ԚJ~7UnNzP}R 0^ͥSqm,7}LykILJ-7b084N; |N 륥Kŧvdg>;;`תwzkQlz* 6oU>/۟w'p@/\%;qR86v}QysU_GU>W˫'؝Q5Yt: n6'~] t@'P,3Χ9xǑ:fקk+zO7'_P*xSy}yj'z9cٝ<< bg8-;1Cch폳t콱+;;|oz,?J 7LN%  IQo9xQ?t옩oU|~룿fRy=]upAQIDATuc:p&65)353z}:ϻ=}4;Jd{Sj(ٜlٿ:z'>^e7Cśş3Gu{-7*LE?3-K[gf:EH9;`@X N%~Ul+{cXlz* SkNP& tx`+ {?Y:{>/o[[_`=WRGŭU& soNq ^~TcCgXϧ~ꣿ{v+UAW>uUpL_:z85q,3/3sø^-cFO_4OZCKNx{;%~ Sǧ ?:O+R{t{}w ,@ c~fhyÏ<}7^ܪ0GfnNxk֑;'s6\3U< bK_ fz҉R t@/`yuu' <(l=מ/Ugj_]ӕW{CxR_*6L'fNxnܱ:N`B^ +x*>5*/|Vow@'P5^:2^@j~7S8NOyG5?Y:NX#^Xce' tKmu 23vͩz&Mt@'zwX%te/^/+{t@'$ @X] txKz}=7{{:N@@/nN:? H z tz`|' t?^`gF~Awϝ@' <;^xvw@' tʼn/ٿO@' t2^Pܝ@' t@' t@' t@gbTNfIENDB`prey.orig/modules/lock/lib/bg-lock-with-input.png0000664000175100017510000013060712250331650021650 0ustar guerreguerrePNG  IHDRR sBIT|d pHYsU~U~qk&tEXtSoftwarewww.inkscape.org< IDATxyxU/APF\ ZQ*oATkׯVjk֟b-Z jj@̃Ȩ(ck ~g=ڟ}9'VD6VD\l^s] d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d@\}/zU0TT]v-?q׿`<֭[رo"+iZMo]w]*Ϛ5kr^[uC}wygk4MӴV\Yn!iդd2@ @ d@\5]Z*=~(,,lTu֍2֭+]vԫWoKY]6r]WNSgzrؖ;k֬)zEeSyyyQn2EEEvTa@EVn)6֯_ׯ/_V_~*^N5 V^R}pǟJ/ꩧA+^o?ܟ~8_}LQG=fqK:SbĈ.cbȐ!.;kӦM,XLСC㬳AEիvڑR*sE~rPіQ~}o߾9,\0v}r4iRtرLi>.J\1cD^4UW]]vYD|?]V\5*ߴiXtf[rmE]TK.1yTT.2`lԸ";c㎹.6wUP\2@ @ [G޽s]F}UZ'wMӵk:thNgEsM1s\PkqUW庌JOc=zffT#r 7]wU-s͚5+va2 ^z;Ͽ.<QG_}* 6,g?jSn!7`Xxff 2$9j렃qȼyr]TZQQQ3&el6/qW}kָ/W߯իVXQmhwKV:sj5n^.ahѢk~i5vM F92@ @ hڴi}ݹ.҆^`,-[2JڵkK6@l56l{n˨W^yEfsW`+d2@"@32*mРAv 2fr\Q)Gu @hʔ)qy庌J;lq\sM̛7/e[@ dVV(((u`s]FרQs=s]Fթ㣴24iU_N֭-Zq۷^{庄^֭k~m۶mUnwӺuV\;s),,ɓ'WiG~fz͞=;L2 Vnݺ1~\Qi~Ou5^޽uT}nU6mĂ *駟~f\/u<<@lurhԨQ :t3USn袋r]dS d2VD\K?o߾e/92@ @ d2@ )Eq[z+&M  @ d2@ @ G'?Iɓ'ǐ!CrPdСCe˖e_ǿTl iӖE\eӡIoWmQ)ۻIyM+8k*ۈ=3~oҤIl9#m۶e jmEF?hW[߫ x)l#UZ[Kq d2@ @ d2N `SN4m4eTˣLǎc=AEW^u֕޽{j*Uxs]FңGXfM˨?njz5*:\Mބ&~Ġ3׮#>/T#yb"~]GUn迪gOblU]o1\WAM# @ w`pg2*nӟ4 PmmNk֬ݻ ;#/_2Jرcڵkm=S?/b)3WK&9uċnP2HVe˖֢yѼy\Q)WR+%lV5@6ՊMs]wת7 -d2@ p@jF;3eҼy*tSO=*^ݻw+2eP\s51gΜ\Q)sέ;//f36mZK6uEU=s{3WU^Mͺ7u 7ѩN{?b-_OVmܹ#二Rvm*ovۛl21rxws]fSO'|2+L|P=s0b`LUeVVv5.eG"V82@ @ [N:Ņ^2JiҤI}ѱcPMu [{2JӧOu%Ē%KmiܸqVi 7_fzg}6ePhC[纊:7os$v}E\صjc bq>"{qہU[G.]N* `U76;j"[={FϞ=s]w6hР8Ss]'?IKجN?\Pi>`ojߪUles]r]A^ v>^U'U :6m-~^ZӠs d2@ pm… _/?a„Taׯ/ֈ+WT8fkn]W6mV}k֬u 93f̘;wnN6YG^^M>knh9sۿbŊroyǗ[ۢErPM-*O1-5}߾5շ6|Ol߾-"bgEl6_=lY"] lK @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ d2@ @ -nݺ.5R6mSNN;T;Svء±sN,Z(vi-X1ۂ.]Č33u)lCڶm->;ץxp@̘1#Rb'vmRM\zƍZjULJ)y䑸 >+Xǎu֛LA͚5;nUՠAIԪUl߾}l2eT+G5N߾}VZѻwhժUֺu8nO<1&L͚5u[n!n\Eq ǰab.m#vo>,/^\?8F>lq7O-]V3ΈS溌-㏏m Ǚgu)lCly_g}vԯ_?@&jofEǎ:zM6 }]wݵve8CW^Ѹq*sv^zQGڵ۬ȶn:7z񫼼sP^ԩSt%ԩځg׏=zı:t*5jժJ5jx`yѶmj_׏.]DN|ԪU+sׯ_t)իWq 6ׯ_iӦ~c}?, 8Fk6=i٥^{VJFJmѢE:ӝwޙF/_^/"]~>uM7xc/K/[o?Բe27ߜVXQjܲeҨQwߝ;2h ӣ>Zno}7n\6mZ믿>^nݺQFڗ)4gΜtgl=swi֬Yi͚5)^x2˞O%Ϟ=;=[nI)tntxiܹi޼y%f?2Zj|W_ŋo5[^;SJ)?r3gLG.az(7O?MW_}uRm۶KV*5G}.TV ;x427x#Lp@ɲoRJ)mvաCdɒ4wܴ뮻OzSN~4M5Zv""?wuWg?g}6=ܘ2eJh"z]w]{q'?R.8餓b…1iҤxꩧbĉѠA8裣_~K/SL)5v]v^z)vaWC IDAT_kF׮][nѵk8cbSO{衇O?+Ws9'yꫯ[n1hР{N;m۾bŊx#"OK<@|1p;*s1bĈ뮻..䒘vŀo.]{:*x㬳Ίqի[nq9zhuYn8sbĉ1f̘ߏw1z'tR;6~_Rc{{o\2L?pL81>8C⨣o95kW]uUuqqƫ/rL:5:tP8p` <8NK,)?9 /R+1}/wYgEzދ>,VZӧOrGϞ=(N9唸뮻,ӳgXxq,XTzk,\0.xwcڵ>ĠAbѿя~EEE>nł b[ocر%lv1bĈ8bܸqqM7ĉUVQPPq'n|G>xnݺqgٳcܸqe#<2z表]v7cƒ%K{q 'č7{l{챱tJײvix饗?I&f?h߾} 0 ~_|0`@z?;K.8C?_}UyyyO~xw)SD֭gϞ~5kV3fn:^z(**~ŢEJ+>biӧWBrBh}U~8]6իW#?RJrKsNi„ i޼yAСCjѢEui&-[oʔRJ{p|&MRKկ_?͜93ea-n/SJL3})>ok׮RJi}-XÆ ܹsɓӎ;X6^GƎ[{W2eJZjUowaԵk ~+c2c[hRJpl:uR=J_v}RJw}ᆬ޷w_*,,Lo}ǧW_}5ιpSOԩSZvm9rdjҤIuvm)>R5i$ҭ޺sE|T-{.]*}@qkܸqJ)_]?NӦMKڵ+w)nJp!R:3SvtR:#J=V;S/{wZn]\rIJ)nc.ٟۧƍ#5k&O-[Vs;#~_4M-hj _3fH~asFD:#SJ)]r%UJ|I'|2}U/O)tGWLݺuӇ~NZ+?7tSp) Rc@7Jaaaz'Kx). Ҳe5jU ~mR+K~衇V8vK-Jn~뭷6DDѣGJ)ʯ;,qWcM)t'WiηvRիWƍիW+20jժ2;sJ)T/֬Yڶm[z̙֭>RCӦM7iɒ%ݟ-(>#r>lZn]g@7SQQQJWs=>믿N[I_Æ fϞ]Ӈ"4hFtAU5iV5V~~~!ŭgϞq'СC駟I&Ő!C6:;v/V^]r#G%K_zgϞ-[F_ti4n8w^??~ .nݺxGsα;T yc__%fN8!"J_Y3gΌqG?ã0 I&t>’O~ǿ Ǯ^:Fݻw*ދ_qQGUyٳ#"\/޽{WiC9*{w#"ʜp 'DG'|2""N:R#"ԡo}~裏Ƽy*\uC.ѳg*ܫWhѢE~UWN8ᄘ4iR9r:uyʧ~|I瞕Z?A5*~ .w7G ++((]v%X~&\Nx⠃38#FsKqc=?bȐ!~ŪU6:WN"?6fܹe/yoRGy$~U;wotTEEE1lذu]o߾e0`@L<9f̘I?>6lXJ:u3fltnmXzulbֺ&L;s6SLs9'nܹs{c̙qJ &DQQQSOcܹscoƩZj={FJ)y睒:DDɓ7'FDTy&㷴zEv*׺wlٲ2iy5k-Z,~-|kժ_cwjAK_>f͚|I*[nna˶o߾o5jgqF'ZnM4)uknoǀk+㎘3gNL:5^{cŊ4n8vuר_~&MDDD6mJE.Æ !CĠA_.ܹstСRG_Td…xy4hm.=aUnI9l27ovFko֬YD|SiӪe.D٧O8S]v;}`ݺu˝oڵѿ2dHwyqg}SN &=SN-3nժUq1u]]tQ,Y$MǏC}W1sg}J7o/?nz3f̈˗,W<̝;wcO]Q|p[Ҟ{yyyO?Q@e_\hQ^2|qꩧGkaÆ@{]OW7o^ɡ1cFkgxWYft3fLzY}~x~p ѭ[ݻwp qǟKj_\_~Y__}UܹsW_DFJ~-UUO(**R[oO4hP\s5qgӧO\x3ĕW^YzwO(,,,c=VO<~{|q뭷F7ꫥ*Ɗo+>eڵ]ۊ{yl XIj׮]m ZjEڵK #Q.u饗ƅ^ #Gu]\|_b Ň~w}CUilzbȑ|'OR宻w}78kV.ԪU+^xa\uUjժV\ .sVӽ}N:) n]w5""̙S7}s=sUgfY[:׿us1<ˌkݺu?q׿.vb??O_?,.\7xc۷o{n\p^{EK8Gѱcǘ6mZzooVr)q뭷N;mڴߥ].T9̜9s~۬Y"۷AR>XvmQF;~l\lժUԫWvvmQ77pC 4({x.K.$O<'@  pU[PP-Z_1iҤr)x饗?a,[̅ͦO_õKJRߦE|s-K# *ᆬbҥlٲ3fD6muiTe7c/uZȖǂ J}yGowuWos5\w_ѭ[J3gN\qCE.]"??(((-[ơ gP|jEeb-Zʕ+cѢE/SU/Z/Ko+QQQ\}ѨQk7iN\`3fL}ev1۷?mժU1yhРA#FDƍ㪫u.YYzu ><m۶NW/֭[ׯ_ >T|Ѿ}sۈ#Eqo7䠃}{eW_}[{Æ e#qI'EJ)2xH)'={իW@ܚ5kbĈqqm0W^\z1u*_oѱ`K=[bE^zx c875\_~eɷ3gΜ(**ڤ;l>`t5宾XdI,8qb,^8.2Q^#Fw^;t9iڷW\RJ)??wK)N;/((HׯO&LH;w.wlzR>}!R׵kהRJ[|͛?RAAA[nkbŊTZҘ1cҺuYgjժU=3uYUzRJ:u)ꫯ &T /ΝverҥK5kVZbEjٲeLJ^z;G֭ӹ瞛*C I)Կ 9SJ)G?\+WL<@4~z {+][oLZhQ={LO}YjҤIƎ{]{WJ).TG5kVڵkgy&[.5lذe˖#LM6-w\^^^9rdZjUYf^z)_ѣGwy'1}[۶mӪUһロڶm[{7R߾}K=ִiӔRJzϙgRJ驧J5*wN:RRJ)5j/^̙uVeJ)'eoFD|sgy&?9rd1uh׮]t1:vXr@D?.Fk;.֭[3f̈ɓ'ɓ㫯>}D߾}c_T)83'qo͋mFݣ{Ѵi(**Wz+SNN:G}7tScѺu78۶m?ŋˋݻG޽cڵ/}Kλ}cΜ9Ѳe˒m.˜1c*=W^ye<ǨQC]tQؐ8p`<ƅ^G{ݻwnݺE&Mbݺuc`߆t%,Y}Q?>&L׏8cʕqgė_~Yjܯxꩧ^{.xhذaK.%W˿kb1tH)E޽㩧o>y4iR̞=;vkKsa?ySz ?СC\r%NW({1o}}>'#F[o5k]f޼y1p{b„ ׿5&NX?餓"???xW*/oϏSo'OFEǎ#???{(**=sO̙3' K.Ν;+>hD|siWɼ;C~GTw_zgy믗WWZcBeoK/Y>˻.>6''?r-g?OTz>c#ӏooԣ>qu]w~|牕=|D]xq֧Rԧ//wnSsYoQV??~Xz+_xͦ?G w}?#WtMwGX}ӟ^gmW(u]GQ?S?nv) я[nE}_WA( @=G?wٟUwqzg򻻻oV뿮/Rw}QJo}[+o WxʕPJ)裏 .(ԧ>zyx՝wީ^WI`q7|{W}ӟVի^m__ZsE~D۽=Wۿ7{q9uwzH|WwOPc̙3ꓟzJ).\/?{U~;SW~Wuwt@^g_;T-oy>#Ǐ'|Q^6U]wz _t{8鬌qiu7ڻ, 7ܰugΜQ^{vgϞUJ)u=lw]wo~ _s]WZgY^=/-nAٶu|+_nisswwweF^򒗬L>ͦzK^t|/xڹEeiq0̟[_*v{eQhۏvqnwF>l|=y>k +؏ykk|di` IDATKΟ?WqG^ו=Pq ^ٝͯ:Ї>$=~36 ֽ+v[M7$m6rJS(N/||o}[k>r=0K3|ߐ|;eOP0 @P0 @P0 =XԩSr5׈8eO|ߗ~Z.]TT Zh67Iny,7pt:EFeO U$l{^> gϞ-{:d… X>OPP* JַU>O˞ -y{ʞ Cq@x'wy'?ϟ;S=bzeO~ eOa'zoVT}k… rw=a˿.o@y򖷼E/=m׿uy_^T}'|+%@!w\w= `B<E/zQ`v+^ 8({ @@=JE wo|˞Zo%"P>eO@(/jX]bYV@[J)m2rGjP (` (` )ʞZo%"P .=JE wʞZo%"P;^+}_.{ h@@)5V(%"r@~a9|@;E/zQ`v(ć?Ყ (P۶_//{*hWAS`v(Dr뭷yeO-x'z+?PP/}Krm= pmɗ Vٓ`[Ν;'}k˞ ˞PPKzo˲ʞ @~W~E>=&Js7'> y_Tݣ>*}{s\S`(4䦛nr…@..\ 妛n"P*vBٔ7Mr-țf=-6/| |F/h4*{Z@N:%\s8STX}yҥKeObQP0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0 @P0[j6ihHy䑕m:9sLA3GyD~߲,yK_Z7V9{\{+<2ZiZx+l;@jm)V&6E`s i 5. ,h6%x&fsZg?kJO<ͺg5ҽ okf|jL;^u/x 78^I{ַJX (@$^{R/|A<$b ޺sK}WPϵǘcU $/˼1[YEu+Eߘ ŕ,$}m{>tL '.4NQ!ILDJgUNZLʰ(ku9ǐEi-Y<uKR(@Š*;a~ @c۾|xg,{$[sI{YRC FYr/ط}A]vc7P`3y_,ɢvlrmNd|*:))jɰ.I*$@뒲,.IU:gYPS:o~NEޗD )2qw@KR9Y8lVJ<ג_EMot@ǞM~g, RHHsUM`P$M^җʍ7XЌj ylju`ҹe}"/ `@y'W& < Eߙ]gEnu_qt:GUDaUYU((L gQlUv_e&8Iڙ"wCn֤E ,s(d&n벋-Պ.'qe_em*Y$@(l$.[u!E,柳QbJtxJ(rwQUXO2Fc T-K pj -7,Ǣ7'u?,t?l`$uIX -.(mP6췜QĽNJY@uQj,Dj gm:%S۾ `s$&e&H::\ϟ$.+bs LL3 ϱ|%}6yi9{g婧*h6wy<%7SO~v E%u??fmu*$yu E$y=}-1|E趗%rWǮ(1ѯR_6^VmUIn06i~_c1& HHd :Ga' @ItKMPD7Rz=(*ylQCE~ʿm|SV) z,W)ɯC xE0<MөJiJ#Mti,':&I⛲ҿi, @9(i%^$ ~z ,8mu.6}-& q+#ɽ"*$v=^qu_\,v zlA$]DŏOU"/y(݋&E(c2q1oIޯAoE;[TUc%FX^9Bɋ^vln9;?ٔH_uϡu oxCضMu}{?VX"EEn~oO;ƺ5fSf1tI^bps;oNcKEx?]-3jd_bAV1u<"zleMқ&=o%m =?8oZ3vx:.*~*$Ud$&=`s<&`+$);O۟*.ɾ~yk ^,9)rQbIˊMy[TĻxld~U< :(j?(@[&uLagt, `z<ג!aX/.VˍcJ?P%*&uIuLP43n1IIms*o9+VIa?@(4&N&uLW\KpMN~byXI]Щ0J6}P@aLJNuKMwUc$I üõGߗ/lC»H)&`0ygq_ngTKL\4+ X"³ +#y&ٯ~~Q\Oq|,UY5$qu%($VĽj:*Fq/0Feyz_M/>$YwҶcg/U,bTV)hTU%e'$ 3n4~Y]XsSu̯߫[J~0,HU ?Y+^^1:$:̡hs^fqe\ң%12VYϺ_~"_ GŸ]*~y]޲v$TE[Ee^o{U\#O{UZ4NI&1X׫0JWPP:2N^.vm7L: zEo;ֺIY,NٻX׫螼W%q:&U(h氭*Ͻ~g@Μ93爐UtY"+zcwDt^JnR :2N^9zm:/l'dzv-N},dunY/&.i֩% 5sO>}U,d+xSm]_Tfx$96T-Ixҿy Wb:(TΉ8dׯ̾Y)FqU̲v460:(<5ɱYVqoYJ11tYOӷ tfP1:':R͢V1u<&eyeWϑ,~RxNcZo;:P&ֺ'UIMMuK'%Uoݔs}~\/ƪojӭ@1q(hN }ԯ}U KtKu1+gW;*'_~:\@@(h_>UWf_y-3S_cICiMEc*$aLC1>(h $BJӯ1uS:Qu@ g$m*_}uuc/eNs>tzY\L\ץ0J~tzc;(D_DŽ\礟?1uU,d+ϘeӸYVzeͿ1"+SЭ=!ݒrrqѯ̾Y)FqgܲJJ9a{:,rNUY2 }1XOЭ=M^,%c^d~U/S^n gNV=V"ȳ}ٿtKMkO7:2N1]X۪ /ʟW:%Y`>/=B6djn{nJ@Y2Nֱ[U Ȫ^ϟu:X=/j,k*NNs٦}cZXضO*uw"b4fZUs⭌9_n*&i-/4SQXDS^,Wyg@$\=^5VQVR?Izq}h]{ ١CD^uc>U:5N1˘E+MxqUUgE"bZum $:ͥQdǪj,g#8Y*"nc[¡$T:{시+ƨZRmߺ%q ڛ42Pd[D[[9ձOھUNu*d+ϘuVƋj{*}[qĕ*ԧ. nUc^1S~e͢V1e2#K"_} tyg(? IDAT-+B?ݒ0)¸. .\hER}uUWD }/2L7U2,nԧ_}~q Wu.̣)Vq&E1SCh-W޶G2$su.U6ȳPm^ER},"%i.UGվP\yоcTe4-Um?XŲ,+YJ[bQ@$täĮ<'ܺC:umTan?Jز  e,=y\f\HLsJcQ ȶ :] wl\t>Ui_eG"m,xg]l6f;2 ZYjwŦq2cL/ }u8.NsѡN]m uO8gb>M?WT,_leg@ &Lg8m• BVɡd[HeIsl$}~7;v笳Zq%yZ[Sbס}^HoYogEŇmn{ EtM2q,fQ;M8x#i2v poӇb@M]JtHܶ\+Mߴ+YlI_?Li?-e,,bY]ұM,JuEeclgY"wDYdq9Ή6}2/ȼRyԹn*Y!)YulI/wd5*i㔱Zl, '_xU cV{ń,u"؆lN3cބشݼ.*U!ᥭ9б}c1ykg@mx1[յo\Q&F^ Tѱ,Lf$o;vU aNuOumP@_:$unk_5yq㮛oՋ:6mKl׶I@  gZŶĮC{/m,.C!?tw0A;!6a" lIyݍ m9]d?d'wmܘIcZזVtJukoBlږ?&mˎR uLe_Ŷyj":F?Mcf9f㧡Ëut/̏ubٶ(˶e<Ȩߓq'NGZ{bXUpQJߗmV=uOM~_,Ӫ,晤O\Q`N$s)޴}Uc9-{MuVJj-{<ۚ[:ƶ}藶oXBERjۓmIRA ^OF؎#*D)%p(eYZ=s6L$E  ݙ]4IS `ytu=Ie+}חş__3`َM q0!jۖ=&m"@)2ʪĬy-{*֩Hc{/m,c+Y6Q꾈Hq$ej$yeJ$e'eO[b^1ꗶoQDLU[op{y|_މ<󢽻+]i4wW$,<؍F7J@KD/Gdrυ$/vNJ|I4A_6iqb+²ml;dXoj> _!);Yա-3OTW%J̼꒼ֹNul_d2Gc'@Ápen?io v m7}޲Y9VU:Қ`:Զǽiw:en*qtƽbح8 ~[sϕe/+Dxx4'n%~/ifFw]1fY$ϑM[cJZU9T3ۘu?9ԽmuK闶owL-۲7x,]F?e<ήIJUb%cXP1VjkYuM'*qˊ"8gD0?˚}iinV0êMV'fWaiEs[:%N*7pMW~6O%~4_u35DfčI:+Vsob:V\*qLGt~s*я7?U| wŌ\n\WUڍ&gcWYaYa'}\4o2/)7u:ԡm֔۴׽O}wѕR*ddrc х &e_+/q,%MQptaM5;=uj'x%q6/,Dhr.f4yHfSRLZO$LVK~J='A_F ;;ٝecx#F;]y&mM G$hIM5#"q]!e~6z*|c6|ĕE,˶ÂM-x,}vjL>ѹXcc:[LS s\'@:ͱ*1>^$b[boӾ>e˪V1ʈ]~_/]ڻێ^0}Qců%SWwy|i@̇ivpt4s'+8ېS2e8I[ w88ͦ_|Vם|o4Kݮ eY˶e;󤽷'spjT9@I&mGG4b6岴ex|$h$N)c4=N5:,K| wN8somttv:mLӶ핗LJYU4Xw~._zپ=e}1:s6yy[{a9W_3uJHY0UR iu옌OۢP,3^UNB)%˗pLsɿem_wwe4,6ĬR^?NGdI尥mK(]|v'5Z-X@Z;"JȨכGؖ%=JyݕF-~OPDtO/v[:{W?UhR6n ]<'Odgug[0x]↑`lHۗΎnZ|޲>q׵4V_A ㄅ=藺!#ۺa"&mY.T!yaUYuiSlH/m,//䅄RJF z28:ZXM<\?Kd^W IHf#Ǘ/Ͷ) y;4mqM27s\KbI۶-] |_alg[gO?9gȨw,N)흝Y; $}iLFs8,$IVFrShg]3^ޞ4ڝp߲BEu &$M׽=c4i+(Q/h$(,8͖(0Xy\q̊*9*Dmڕ3;ve]w6*$clV3ei[bѾ>iG؆yxzĵ'XogEڬZluwd)=OƃA>NO_M>xfZa9˰w,x,n/d0ֽjRJp5;V^.WWWg+ٓ-dz4O/Kj`dv7ʕ4,+)w w4:݆؎3) uхx 9[X^ |ODel:ݞl.wo"&m)56ǒVڕ9vHz̫.ɹ.ئ}Qc/y+7姟+EG/<韾@,[ ɝO&Bcٶ4mG۠y D]i2$i3YUA A_wvw4K,%D/.K&X>Qۼh\U&x\"@BJsg7,?ڤqYUX7ɮ /JbYvs7_|s|~=ܤynҶn10vXcqNǒ]#fݎ옴Wm闶oqtO$|+KO=)~?nB|JlG ?w 9s&\͕pG{K+5ٝ-e<d;G-*;۶hY¿.ɟ]_f>61\%J҆һtqZ\ݖϟUUI2*FqϓMcfU 7Go9WZ <ӶJ*ͱ;Ȇ*$QuJ8Ǭ1f{EI/E̊ ],$ѯ_m:ɓf+݃ Q/+O|*R444aLnR8p n)eY[ϭJ%'6ysֽK.ڲ$m*<֎vړ/- XV1; vj!f{N,wiv{W^^شj5>y[Wol.YĪӺ8i YsvUiM<%""+hض-J] {=Ig_ܹkg/Z(88ܦ@z.?$eucrXxެ;) ̎i14;>89{NR2w|Yqg^q,ۖ)iFj?lob=i j~U=e;"[vL %;_~'*UHLLJcNNd@+s: cc캎_y~>ieȸI/WyZ/\X?׊?K&D޽?z5j?m6 7ɰߗ` &'V%L U8Nl{?hB?iA¶mqMiNn8}'t9L #Afp<Hcr)eOێ'ǿ'S4;nv[~JDD:,@g{q dxr;b2ndHjIko_ 0::4[]x~?A?eaŠ `j2q nƵK/v6c/+Lvl2cѯ]c'iW@]ڕ9v]ڙ:6s4/f~>Y#Nx,{3M-˒ߵ߶iv;bY/RJOޮϲ+q \\2_5h0o0@ñG!J$O$A#]2ŲيykgWƣxáRW 1m깭 "h?Jry7Ȱדq/}iv:"JP:>:F#r鮀hΊx,N%í&+b{=鞻fv)GQLVXݮe7hȸ˲’"&,,+jI̢%- }/ `bUuiW&[[01Y]1Lc6glږ=mul_VOѳ/b͒ٔ^bҹ j4ٛ&1ϣgm@\>yz5R u5yծJl7͋.hBhrz6[4\qM @Ƈ#ٿ96IV%(Mu{rY쀘>b{QXfKsMVoVZU,Yv+sḻi]ckw򢹊=Ez]yntt̛ OM;M,kh$+Wƛ&4M'7Hf#vc]ŵO Ixض%n)N#vvcwzTv4O o8YOSOJ2܁=6߳Ep+ dpt4[wMKIJmKYj?jdnb=MUװڳ/˗'ޱ\yَi?X`MNв,iJ~sOeryϛ\Dyk@'tWF+$->ά0׮̱4G.huiWuiW&s^m2O]>yĚމeԓw1mבޞ8#~6<yh6n6j9E*>nwt 2E |(2 ƴ$LVKeIض#`a?뤵#Ξ3gD$=0+su>q;ӱO<7@3m{Bkar2ǮK26iۮ̱9+s쪬W%.mim,3G?ؖXVxS GGخ+^nvxW>a_%.GE?WJx8+WN'1+㸮vvd/Q8bۭ+D%w27 ?;quEڕ96L;--1ݮ̱iغJ̪.mIoӘ˒ 3OxrXtn5/(6]՟cOrN gtHrU8.\ 0n5fqO OI+벺޾خ#{YnJ|m}o}s%n:]u%ԭU]c.]2ӷyݦ}XȊqs(U4_"PHG'}+bYR4O.\+ٻzlE5ȫ]cǶ7b JsvsW.otOp1ǤtYD_/#xѾIV} a'Ǘ/-%q- [wɀ\g_D4:m]`n/i`Yb{^Xtsp0푤ݪydٮ̱7bY؎#J$|!h ڮsb5.jx}z돟d\ɡ&d6gyקgYJ3n?㣼>|.OEdk0_^&̮̓??evs-kMV˥F#EVWۯ:|3JvXEn~z-w2:?ڗD3^e*gyCO=q+p 6Y>E2/R.?30LFτ BQ>ũ;m>>SJ%R?Y|^\IFFFLodK/yoM#O2P/_d4nN|<|.r)Sf77r훌,>O77`id~A|Օf#g Ki&/ß7F$/A4<8ѕz-'(ۏL{1@B0B].qZyYtw38QÏ&lV+?{qR˥|*US(Fo?e|qc^_e-f*˗gz-/?e4?dq{+LOl6r\}$/r[/kyy|Ň|'Bf7L&|m*u8rwGW+yuAxfZƳ<4l6ۯ[ eZx:}HʱK6B@X\XzB51Vv1LNY ~hby&o_ ld2杉>OYz}f:?-wpRMowe^x2͍\},W}mkQFF77^F?-% #O?_d\ݷdqQ~_2?yN¸idg^j*˗g]F6<4 RH|]n1qYqx32vHЋSLUS wOŷTÃo׫_wÏ#{~42oV_i("|w't0w} C ۮ#u5O7\},߾<6sF \ƓF\&l/?1K8Ϙqc\G"dcggmŌ%.Jm!9tFP;|7m;֫<њŗ2j27GWއ[b.q0^8ڌcb?@BvGȎLߧ.Emvk]tw So>ow}Ks1xNf2~{ީznsx5|v{dϿ+H˥?-Zȯi̿2 =ysvZ<UM0g)ݨ5]~nH]zƷYw3>}얽/kZ^z KsZz__1z)F4WW2~cw6H4!8D0,^5LRv7ϝx}ǝhlr._>s[]?C[=q#/*g(TƓh$T&o{q.c2?gK,z9 vxL"v HFk!ᠭq/y7d4Ye4l.e4z~Ѥf:}eCVNocW76KgL=2+NK@⽶8qyuHCr4r-JygڠAKx뫼>=毙ߟ?LEd#F&+[Kw|߸]=vE3bgm\gmJgmc_w}495=V4lɉ6$6b7yfJFM#DƓ4ә4'f؆!>ۅE&#YƳxf^|s%γvZkG1[mo͈}s4r-fOu)L~쩻mƴs^# z%γvMq)ytzVx{k32,_rP`=X@ޏm%]+ױߟ!F}y֎Уgm/γ@d2Yjl5[`["dFVj 蓃lwM>}{"Eo4f2֎Уgm8qn 1m9J3$jXYfڵ< ^f`xqQ4k~9Z\ʬ9%;s羦>aYdƳX ; Dr$ex\Q4'R AwқZM}ȟ=B8o;]b3֏P;f< nmҒq#H\7Np3 ǐkcbG3BL=f:>"4yek[hk5ID|ɜ!yZ:5<(%x(6{Č;|%=γvE3R}ب} 74W#&nC5CGѴ:qߓ0<1~moM1IOJ,JHf.|Vcm굍F7hy?mmO?$?۠mX>cwP DKoU{5_F߼Z[ْ&͐gV -ee,d7(}deMf͜w}E1=#%JC?J l X̀9kf]lޚZ Dao]*ֻ~dm43=dG\|m+=:DRShZ:Q6GXjG1Vm Xz]%13U(IDATxikihҍR?:[Z: OzbwZ_{A w.#֢!=#ohFg mPz6}(37|rjA;kw.[1 XLmcxyjjhEGSbx׋GflX]bf#a~H}X#ods_@@#_[G[C H rA$b 7tr>95Cꃱb#/@HQkԱDE)yeQ `xb(ڌ>4YOZS!͐@1ЖD샱@0ck#C"'9P4,JԳ /vd@2 `ND#Z,*)"80Zl-3DoeWZ67bG0}2_6B6*i;`|ҵzrYgz,I R=r3;kG4Q@'`GDzZ#J-Z:Vz.,nDD7b #B$ 5"S`IO|>v@\|mm-K͒mAt"κ }hD3Cri}@m{T7؁b(R/r2߱#,uQ !R%te;64:yR⽖j;j4s\[|:Zz^5k7s9׋%k7'RgFw. }q3 ~R#F Gjz)Z=#/j.^i}X '3G{nfFlTb ȽgYZdN<\|- M+=k]:m@t颯T/ (AïXx@ nAC5Ԑby,QMzԾz77bkx 2!,59>t$FGS֐\C흯cgY…bԡ]}! -=A3Qk)]kH._8G0zD =ZC5ZZ> 7œ-(yD ĞJD9WKw@MyY67Cr9(My8PH#hdny?^)mZmAtBdO ŴfK @'4hԑMzcn=P@K'?Ϻd9G_\y#C-4LNCr9(藃X-cM1bO}rMz$c# ,,Ji{iR/ F Љ8,Ryzs  #gt͜G hikYjGٗHf ҅GoiE4^=[bHG'8 ˉP+bM|mm- =k]:=| \Ffv>7|k!5m0 `_^\|- M+=+ie"[h} hwҼcǃ08 ωP+bM|$ MkMK5[Lx}lhj"} HtMZ94DsOc5W#_KCSG[g DA8-SmLhw䢛2| d29y^5棘z^)D9C3^ rDF8HÀE@4%j,7" h}kcpLÀy0Աҳ]+z$pqcȟ6 CE_$g6QGֲ+Y KoGFe@5Zޛ=o B^ Ihk0ަ;_K]R>ZKE0@+꿶&Vd?$?꿋dTIby?^)5"0G!(B%zf@l nH,8{ZZ%j'ċ,kVh&_Sf\n<'mrз"y"#iXhYY떮Tw{&xqu߲75jD]~/EGֲ,Y / Mge3E6?$7B¿EIZ:Vzֺk lj_$}q3@_I摺&AhM=~{ͱw} 2!2.nP>7fF#McOS贈cg[J߻^{"x]E1:#mF>f 5k!Z.=ou3A#KO@|- D+=kR^.K j;omH@@K}nk6,'hp@Qb };?Ϗn\#ؠ_|g@: E7Fwm >.?BZd:KD2],#%v@] N8 0D[`Q44u,5-uK@ԾH^u3}hw ŐhkеZ/Q&݈zwKmDA#ꠁK8 :@ֲԴ-Rh&kF;B3f@|qB G@ײ,QvIrQb4 $ަ;_KCSG[RRwSI3E 7ʙJMn M9G5uP7R/_h4 ZM=]zdCm@PB߻ZD#Žw(ft ` =`Jv5/Q_^Xu@@COrS_6 (U vK0fjx`Z_[/ $3҃y0`YB>JS bA|K(p@"ZzV%=k!nznЍ0PNBA3f>WY(} !e23d{ e dC98h# w~*h/ֻzQM!0uK{C+{&xD4(=gf!D .Y)zP@;knmBlࠛyǪX-Q$ux偀&BRIL3;΁ԋC~%iA:OmBJ0-_ZK הF@״ f!$B~#ҝ~>D _]!!hG5}YS빭;DB!DP{hK^ID2bf'DBH12x߂֏D!B;S퀨B9B!Bhyȯ $8 "Q0JCpOr>2<7B̃ڗ@| AS !$&Bх=hQz@@BAB bOZd>[d6{ga;B!(` zhC> QEB F/YA|b<΁! tsޟ|MAc; zB~B&4r"ȽBiBZQ 鬙tVB!BHqh i'R! :!lp@!É_&B!B!RZLIENDB`prey.orig/modules/lock/core/0000775000175100017510000000000012250331650015671 5ustar guerreguerreprey.orig/modules/lock/core/run0000775000175100017510000000104212250331650016420 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Lock Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # uncomment this when the action system only sends the HUP signal to the parent # trap 'kill 0' HUP if [[ -n "$lock__unlock_pass" && "$logged_user" != 'root' && "$logged_user" != 'SYSTEM' ]]; then log ' -- Setting up lock!' activate_lock else log ' -- Lock password not set! Skipping...' fi prey.orig/modules/lock/core/functions0000664000175100017510000000165512250331650017633 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Lock Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # set -bm before_lock_callback(){ log " -- Running lock before callback." } after_lock_callback(){ log " -- Running lock after callback." } activate_lock(){ if [ -n "`is_process_running 'prey-lock'`" ]; then log ' -- Prey lock seems to be running already!' return 1 fi before_lock_callback local command="\"$lock__executable\" `md5_hash_for $lock__unlock_pass`" run_as_current_user "$command" & # trap 'reactivate_lock' SIGCHLD pid=$! wait $pid rs=$? # echo "return status was: $rs" if [ $rs -eq 66 ]; then deactivate_modules_on_panel "lock" elif [ $rs -gt 1 ]; then # just in case we got an error activate_lock return fi after_lock_callback } prey.orig/modules/lock/config0000664000175100017510000000053612250331650016135 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Lock Module Configuration File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### lock__executable="$module_platform_path/prey-lock" lock__unlock_pass='preyrocks' prey.orig/modules/lock/version0000664000175100017510000000000412250331650016343 0ustar guerreguerre3.0 prey.orig/modules/lock/platform/0000775000175100017510000000000012250331650016565 5ustar guerreguerreprey.orig/modules/lock/platform/linux/0000775000175100017510000000000012250331650017724 5ustar guerreguerreprey.orig/modules/lock/platform/linux/prey-lock0000775000175100017510000001657512250331650021575 0ustar guerreguerre#!/usr/bin/env python ############################################# # Prey Linux Lock # By Tomas Pollak - (c) 2010 Fork Ltd. # http://preyproject.com # GPLv3 Licence ############################################# import os, sys from hashlib import md5 import gtk import pango image_file = "/../../lib/bg-lock-with-input.png" class Lock: def get_md5(self, string): return md5(string).hexdigest() def enter_callback(self, widget, entry): hashed_text = self.get_md5(entry.get_text()) # print hashed_text if hashed_text != passwd: print "Invalid password" sys.stdout.flush() self.label.show() return True else: enable_XF86Switch() print 'Correctomondo. PC Unlocked.' # self.label.set_markup('Very good. Access granted.'); # self.label.show() os._exit(66) def on_delete_event(self, widget, event): return True # self.window.set_keep_above(True) def on_focus_change(self, widget, event): print " -- Focus changed." return True def on_window_state_change(self, widget, event): self.window.activate_focus() print " -- Something happened." return False def on_key_press(self, widget, event): keyname = gtk.gdk.keyval_name(event.keyval) # print "Key %s (%d) was pressed" % (keyname, event.keyval) if event.keyval > 65470 and event.keyval < 65481: # F1 through F12 print "Key %s (%d) was pressed" % (keyname, event.keyval) # return True if event.state & gtk.gdk.CONTROL_MASK: print "Control was being held down" # return True if event.state & gtk.gdk.MOD1_MASK: print "Alt was being held down" # return True if event.state & gtk.gdk.SHIFT_MASK: print "Shift was being held down" def __init__(self): # calculate number of screens width = gtk.gdk.screen_width() height = gtk.gdk.screen_height() black = gtk.gdk.color_parse("black") ################################### # black bg ################################### self.bg_window = gtk.Window(gtk.WINDOW_POPUP) self.bg_window.modify_bg(gtk.STATE_NORMAL, black) self.bg_window.resize(width, height) self.bg_window.set_deletable(False) self.bg_window.show() # monitors = self.bg_window.get_screen().get_n_monitors() ################################### # window ################################### self.window = gtk.Window(gtk.WINDOW_POPUP) self.window.set_title("Prey Lock") self.window.modify_bg(gtk.STATE_NORMAL, black) # prevents window from being closed self.window.connect("delete_event", self.on_delete_event) # capture keypresses self.window.connect("key_press_event", self.on_key_press) self.window.stick() self.window.set_deletable(False) # self.window.set_focus_on_map(True) self.window.set_decorated(False) self.window.set_border_width(0) self.window.set_keep_above(True) self.window.set_resizable(False) # self.window.fullscreen() main_screen_width = self.window.get_screen().get_monitor_geometry(0).width main_screen_height = self.window.get_screen().get_monitor_geometry(0).height main_screen_middle = main_screen_width/2 # print "Main screen size: %s x %s" % (main_screen_width, main_screen_height) # print "Main screen middle: %s" % main_screen_middle vbox = gtk.VBox(False, 0) vbox.set_size_request(main_screen_width, main_screen_height) self.window.add(vbox) # vbox.show() ################################### # background color and image ################################### image = gtk.Image() script_path = sys.path[0] bg_path = script_path + image_file pixbuf = gtk.gdk.pixbuf_new_from_file(bg_path) image_width = pixbuf.get_width() image_height = pixbuf.get_height() # print 'Image size: %s x %s' % (image_width, image_height) scale = 1 if image_width > main_screen_width or image_height > main_screen_height: scale = min(float(main_screen_width)/image_width, float(main_screen_height)/image_height) new_width = int(scale*image_width) new_height = int(scale*image_height) # print "Scaled image to: %s x %s" % (new_width, new_height) pixbuf = pixbuf.scale_simple(new_width, new_height, gtk.gdk.INTERP_BILINEAR) image.set_from_pixbuf(pixbuf) image.set_size_request(main_screen_width, main_screen_height) image.show() vbox.add(image) ################################### # label ################################### self.entry = gtk.Entry(max=0) self.entry.set_max_length(40) self.entry.set_inner_border(None) self.entry.set_width_chars(24) self.entry.set_visibility(False) self.entry.set_has_frame(False) self.entry.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) self.entry.modify_font(pango.FontDescription("sans 16")) self.entry.set_flags(gtk.CAN_FOCUS | gtk.HAS_FOCUS | gtk.HAS_GRAB | gtk.CAN_DEFAULT | gtk.SENSITIVE) self.entry.connect("activate", self.enter_callback, self.entry) # self.entry.show() input_size = 210 padding_left = int(input_size*scale) padding_top = -3 # print 'Padding: left %s, top %s' % (padding_left, padding_top) # if image was scaled down, calculate offset for positioning elements if image_height > main_screen_height: padding_top = 18 - int((image_height - main_screen_height)/8) x_position = main_screen_middle-padding_left y_position = -(main_screen_height/2)+padding_top # print "Fixed position: %s, %s" % (x_position, y_position) fixed = gtk.Fixed() fixed.put(self.entry, x_position, y_position) fixed.show() vbox.pack_start(fixed, False, False, 0) text = 'Invalid password. Access denied.' self.label = gtk.Label() self.label.set_markup(''+text+''); self.label.modify_font(pango.FontDescription("sans 15")) # self.label.set_size_request(main_screen_width, 30) fixed2 = gtk.Fixed() # push label down a bit, and left a bit so it remains centered fixed2.put(self.label, x_position + 26, y_position + 44) vbox.pack_start(fixed2, False, False, 0) disable_XF86Switch() self.window.show_all() # self.window.set_focus(self.entry) gtk.gdk.keyboard_grab(fixed.window, True) self.label.hide() original_keycodes = [] def enable_XF86Switch(): import subprocess # need at least python 2.4 try: for x,y,z in original_keycodes: cmd = ['xmodmap', '-e', 'keycode %s=%s %s' % (x,y,z)] subprocess.Popen(cmd) except OSError, subprocess.CalledProcessError: return def disable_XF86Switch(): import subprocess # need at least python 2.4 import re try: cmd = ['xmodmap', '-pk'] # find all keys that allows switching to a VT p = subprocess.Popen(cmd, stdout=subprocess.PIPE) output, serror = p.communicate() matched = [] # retrieve the keycode and its value from xmodmap output for line in output.split('\n'): if re.search('XF86Switch_VT', line): items = line.split() keycode = items[0] keysym = items[1] keysym2 = items[7] keyname = items[2][1:-1] matched.append((keycode, keyname)) original_keycodes.append((keycode, keysym, keysym2)) # disable all key that allow to switch to a VT for k,v in matched: cmd = ['xmodmap', '-e', 'keycode %s=%s' % (k,v)] subprocess.Popen(cmd) except IndexError: print "Couldn't parse Xmodmap list." except OSError, subprocess.CalledProcessError: # print "Xmodmap not found" # do nothing if xmodmap is not found or return an error return if __name__ == "__main__": if len(sys.argv) < 2 or len(sys.argv[1]) != 32: print "You need to pass an MD5 hexdigested string." sys.exit(1) else: passwd = sys.argv[1] lock = Lock() gtk.main() prey.orig/modules/alarm/0000775000175100017510000000000012250331650015105 5ustar guerreguerreprey.orig/modules/alarm/lib/0000775000175100017510000000000012250331650015653 5ustar guerreguerreprey.orig/modules/alarm/lib/siren.mp30000664000175100017510000035323512250331650017427 0ustar guerreguerre TG  @ @Y ~Rb?)tY.n0hO)HK}'@4 Ta:<ɠA sI  "E$e#-5(kgej;v9cNq:&{pkx|, RP6i)Ȁ  $>d`].sS}^9|n|ƭlg:\.J(* ~zO#] `Agؘ@ˆ05laE. @= tOQ@C5=$Z/3`>dž\w8cU7,~ Za"!@ CB4-VD* G&p4DiUQɪ0Pp'hY8>x }8H\ꀫXFm(%Edq@ LAMErZ +p(LGq %DDr4 خՄaGk{3/0L_64n/ ~o)SQ@q4Kp4DGjHH$4F { Ca}hsaBՇ$Sי6 ߻~K3לX;8O~I1Q Kg Hgj<Br4ז A֐w^A?/Iz[B 2kPvۀ hk-@ij4B=aoVoݪDQ+MY~T5}C@{P~Pͯ  | ik`MMh&F P{}EO~o~Bp忆iWai +PI lZi{` hmh-E@ȑ߫d~_p ^Kyek{_}W M14~Zi{`,(3f5@Bm H v] L o}L |0Kņ?9g)DF@w C(G\sb@Je@WOd$@?u~&I'ƞ?_d~ۂf@pb huY 9 P,Wf<@E(h8>Aq$ ?*?/P#;!g)-OO S@sY9`b"Hy`XG,œdmCpE}?`7oM@189ޣS@ʿLAM{904({b XDl]7Կ 7Goz԰A#}_O&q)!?  xY)CP"Yb<@HD[/o % M0P U~ioo*?IR*d؀9@"[b`@A"O? zڨ KxߣP\yȊGA*~X5C0g0(]b4EE,pPj?]!Y^@ ¯joJb{ـ9bP08_j<@Bne?7w)w}^D;OG?oK` LAMEoڀ 9d`'0Pda@D>PW?;wh'Ќ|C[_p'A14h( );`0Ld=L,7o| xpAP%:M\ Y9 P0$d4EE-/GMo)#[`R<7ǭbocG?7) ~ Q`"?n< J la4$aПNCh@~l 2?BF7 wCqb&  " Qd[`"e G0: ?5_?k@+C `I`7y&w@&(dZG ÷7Za[-Dz|=<7g_:{D?*[A$GLAn@P "(gb"@>?(Sy_-9`;.II~ro _& ـ pKPg2if-DC4ȳ`ʄI[JA]1 qZE@sh@$K( (< !-O ;£s5b'@0ܠqН15}؀ Q Û@*@Hq\5F@HL-*I`տ3RqAmU!o7?BLP6]翯 I1X:C0EJubFB@$_@$?DaG @Y#hiB ˦ }XQ@T8u^1H8XvM?Dǟ_@vO_)O *J$_* |Yiû0 @ubB@5P̆ ~27[ϙʋ7K~IQ\q>w15؁j1JJDw`4G@Z~ԏ>B/2/L?+A/_Ci hـ :sL wg 5I@;t(-Q>&?W0*pn LAME3.98{; @w^46/( *| lp FF 3(F2d Dbj9LA:b j( sY *` JByd 4B-)L7C@"&Ȃ7QG?(J0&#O ϩ15XjۧB }`A@8n2rcH͏}`Pga L#.O$P0M15~؀*{b&(J@ )($?7~LB`$> P* ,Xo( [ *PJ}dC<[? 0LG!/K!(;A4ǟ!nP X*`@M@}b 4E> _`d/Y$PS$eGNA`LAM؀ J IpDqh o_iooq( 5 N(/ ]  ty *P@J@^I@H@8?1€G(Lp>JIK#́:rp_и3ѿ Wj -@ ^I@B,@)(7N#aJ`&*=v7odX'm$!pPm WRP J$bHA4@ 'W!']_!Yה@GQo M XjD 0NOp61tf ZP@ M/ ,9xo%}_< _ dS2㓂  XRD Bk^=@=>Ht3zPBBۺP8 /߆H"-wb h ؀:D B^=@Dl¬&7P_tOF<<:'ܷt]AM1 ׂlb|"Q^`@Dl@(ܺ Ps@|'_Z\8g E~J` ׀jMJ^HIC@*4ƿ&N:]}O:xp? 4^-n!WR+jPm`HC \gOD8y  2ADă !X@S +*B$^`@@$R-@E}PGԃW8YP ^cGCw®!;gBd<@8d U/o)ܸ)/?P_q?>y0@)!:;0Bb<@A`!o?'Du<ٿ oP DC|]C!؀:; Bmd<@C,lQ?_H-BX3'Z[op ?)@"X:;  P4`LF,@ 8GҶ?_v 50ioAX2??-] ̏?!.iY*$K0P8^ @Kk0)ȬkY\E?WˠrU _(J"W`; $KP(` ZElA @Jn! OJ¿K2 + !_q}Y7:[w"Y[0P(b @Dl@Xm |?7$ڇ -7 [QLAMr +[P4rHb zFl @_._?W0?E0ƇGQLi>__)-1490@& Wb? _i_>07~!M4s `S@|Y)00Dr$U`F Q5ooO?bhKP?Sb'?O~3 X @&4U``C@ '@ҏ?_[fS@CȂW PHY`'bE-14X90b '&Uo4DB , 9@_vpQ8pdO31|? ;& ~90»G& W`L=pSz#~ -F?AM,[c7EB7c  }N~KSQ@}؀90 } ` X@; S|ZBoq0 } !X gU~KCȠV /7L!__ZP a`PdX@J,%<[8Wd-_?f;Pd/J`+>? 7t 90"0'&(YdLC-WCFޯ?#dP/>0k{}?7%}XR /<Ɉ yi ⻅(rf X@BmA g -{0rA\-? <P~)hڀ*DPPL;yDJl ɰ9S{Nߌɘ;SM @yM}'W9_w^+ 3 ـ 90B`&0fXAm@X(W?SzAW`ד)\_LAMt)0D@@#s@Il `)0~E~o +w SO>_ΐ߈KdP@@[^QJ@l p2vo~{,Ul=?|wDPW:P0[\eJCl )@k ?Kk"!&΀  gCq D}O+AKG" HiPu14Z*!J !@54& >_!s  6ټ~ &9;OP X:C Pyr4JpA, Hn1RBc9{QB 03g#Rb j( c[jc R{r4J@6 H00 G42'! 1f+{ 2P  Ѕ#SP}p`4P=. J#5¹~sȖ?P "zF#7;Rb j(րjjR _\NEl H$O´\2 PGo'wB7z` z؈:0ER{w (p9n\L.>_o+\nE,#/ǿ'H#0 S2㓂    #PP_f@<@;\ HH+bwWAoaʇ %𮘂f\rp\y8 0rP$]G0D 1i l nXfXPHSJ&  Z gR]t`0BH (W r.?HD[1# A~J6w &  i^8Z "@H}r@pHHao_´[jp̨  pF@=f?g/LAME3.98.2 |_H 'R]t0B H 2/oJc{! :c߮`vEFiSQ@ЂWcPa^Mk;@ 8w؍u7?CcDF?%Ң*`'3LAME zWJBZ p`(J`H H`=F,@0SW!v3iP tP 0ՀRGR(Z@P@B@ZS+[ 5'EP/'-LA|W:$ RP a\`@B, H d_G'梿( xOa?d3 f@z ,6D)G}*I`_Ɉ)WRD *R0\`@G+@́A{M ği, A(@g_N-_*[ ÿ+1K̏EgM0 nِ!1PdVQ@Gk 5H b+N@#=ހ!PE`P5\Ml?o0b Pl_L `TR60 ր(w7G5"^™`_e#n7 ?SQ@| V$ `#7_`847~#LAME3.98.2 *0R_f@D@8 ( NBQ ٿWV_ՙ*F@C_7a_Ҙf\rp\d uX R0yZQJ@@l H7 !^%Xo ]!yO304d(C2Bz/VXS +514 }W:ER!A00h&ʔ/Ѵ&ͧ ;o_~*D?Bb j)qq gZ*û@R[f@DJ@ )@ 5`+)KͿC Xo04?ÿ>WM Uޱ) ۘ ûgP[b`B l@oA_)  ~|zPs >&g P $*D`PWd`B4N &;Im  @ 33x9ȷ }$ق ěu4$f@@G,SWoI ?AIo˟"096C0_S@ # :@PWj4= @ MʌPo4w>toi)YRD{@P0d`@D ]!g ߔKO@ _01cRߪ Tfkdq*$[PPHob`@K @ )˜\ Vo$_r+C<1Oܠ@ѿf|R#{0 BSb @ P3ǿC3//lFoPd'xN_H"6'/) XK PQfC7}?S&zoIԑ ^D e|Ȳ%O_LAME ,@ IpE`X1/}`[S)-}D I oPgف +@4dD``K@,@^n'%A 1o `O ܥ;]14 y!X;gJh@JG @ZIQ_@?\_wP*op y-j!W*+GPb @D@ )(*7`M o.D; o_ u?$*LAME} ؀+0-@``@Cl )@ ??ͿҴ Jc}G6E-*>/b ˦{ ؀:0B0``@50&` iտ"57aįN'7:b j( ڐ:#@4b}p(@-ph= )))uH[ʈ2տ`0hG Иf\rp\d tP41L ab E7/* W@1Kt 0=P<a: @(B?ᜩdP Ђ# Lc`VB,00VYw WI΃0Go;:oh2b j(؀ULId5D8./Qo0:(0<5.ԛ)'eM˿QPYiP@0ubDJ,(>&( }Jᢟ_(GXPA  o% wY `P@ wf5I@H0 [Qk0<_PVgO+92Y0@ud=HGl;ʛ` 7Sp,O}?~0?LOnx RXΏ w؀j @ s`86t("6&_A-j@_ޠ_`A-777+  s؀j@GI0At FD0nQ*|hg 6?]7! 'S WИf\rp\ vXMcxsk`,Blи/،0HY-g#*(P*b j( YRc0- $o`B-AG?̖)e`_tS? UȡF[`o1zY<0@ o`@B,\Mg"?3ek3<*`o?P- @@[&o y؀ik( ,o`,>m0P1*Κ\$Cssn Kތ0X-Eʋ?LAMEwX<d Hm\5E@C  e@0- /:rY%k?7:0Qb  j[dP\`ZH(Bg<=jB5Qg=O`A:<_0gT #ف{`G$gj C @EoFO']2bCE8:? ~ {Z 9PkP* eb@: Xp To;UIW#{Ԁ6=.s~ܯSSQ@bۉ@[@4gvG D?W%|2U_(Q?Q^_= +q.f\rp Zef@9HmSq]G@v?(_(?ŏ˜_!6(?cLAMEyY=#+04ef@EA]lS1(Q gpu?N o#XY ׬>PY Qc+PB<,cm (DpGԾAoz}0"U>oO"K*L&o+XpoMfտ& i <cf@: ?V]A*`~;ӨF]MP"W 7p}oOtPZ9+`<$f=FE:k.,,/I/O)!co"9Qzb h}YQc `(D h=FF@c I'}wܗ`<[~$\Y*Փ@6Wg6LAMEw9d`.@daFFl (D%KwS/+P K[?Z0 =oԙ"$ {*  Y `4$dVD,iqaD-?&(EL]6t3  KCYU1| Y9@0d=FC,mF忩TW(&_忩(p7`8߫RILѷx7ԟ, Q @00]`@A,_[>H`_ 8ߨ?EV;Fy\ߔo`{[2b h~؂ CP([d5D@J0s-05+o?ȡK&oQ_#Dz7N*sLAMEv؀Q0(0[`aD@E):EKʙKwR߄(g+OEz? )~uCX)#@"[`E`e }?ӘkBq??g~G8˯&  v@"'G@Cp/ Jk g{&Ç"'rS!)~jMQ# tP)="W`Alvqq( /A*0> hp3?uYߨffrb j(|؀)c "{^H@Al@ o8zzT/X_o~GD/SQ@XQ@" y`XI,?(UQ'?V[( qPο-++7t& X)`) yd@@@,t`v;P&W!tS<+! ?8ɺ?4t y `04wh0@>/('&O/8eq=o#$icP"Sf0@AsPx>U(#C5OFVËʳthoU?~PYQëP4 TUd=D@A@5;/-2}G~ʷ;B[[%o'ui^t Z9`g"8Sd=@Fm@foO,i AwA_[:!3~~7߿oE&  p,ë`4$sh=D@DL1" `R"~K٥킲O-0ȂYИ [@`( F4qdF-p$wP4Hߔзg! @}_u𾮟CSA[~Mt xZ,p4 qhJD -@)P1c~iO?}_TC7+"T@5??KZ\ktq'ؘ~ـ`CP,1@pC.XFo__ `: _"b;{ ɻ_o3?& i{p"Ol<@B @  0?YoӁ"p iSl }O~& LAME}i`-" mh=D @@/ς 51jW`[~_G.Of\F {;WJb hzY`e*Oh=@D@48 }X~/@J>G-q̈́I@y^_p=ԘmZ `"P,TMb=I4p<}O B'2mA4:~{PۏPo6ߌݩ15}Y )`kP, Md=D  Ѿ;}T?oGP\@͚u΀?~=;y\ }y\b hP}ڀ `[`  Oh=DB P6Z[}=o?V0 VpC\7~ \O~r)%BwjLAMEmZi[` 4KfI mx53&GC[x??1̈O?~Ss}~Y[LAMZh"[` (ih=E -@]|OTHڹ}v]|hdGQ-P5q7 )& Z (Bkp- Il =D=-@h }xp_ K2W?C{hts ­`"%+=15tڀQ "[p gd@q0IջD*#\%lھt-dX FkZk_ov,ti[` T'EzSon f{Zb h YPCP( Yh0@G-@ɘMi#ʝ 3;}q\ p`}4V򿓐xC,7U-( rـ (@Wh4?@3oPg~~n@V|}Q @oK>zSQ@{ف9B[P448obFA nz~[+ zV zb j(~ف9P(4$If5B9@D?oyQOӢ!߿UuWjT_ao*9=?Ϧ  Z9bP(4Uf&H}_*zF>: x[OW~,E~6'?<Ϗ~ބSQ@sY9P(4OBoʓ70ڀ P;`4 ej=DA4AζC#/=Yz/(MMWF_ȉ?0;K _#SS@~[i[m 1s ,<_!WoN7O@J I<9А!k@ ?ٿOLAME{i[p4 D kh=E.z_4)~M~?}BMG(4שp&'Η"(A Nw_Rb j(|iB{`4Od=@@24ȟu?́ `o柖z]OMqb/ @xp (BC_oˉY15Q{`" Sf=@D -@L}_ߑW41؜3 +@a(+` #LAM}cp(FuhR@B)xZ~ D KjO_GC"5~ʦ vZ9#`4@uf,C -+?OeI0oOą?p@Y?"/ O14wـ9C`"0yb<@H, <+TO /@;rv7??=Au?aJb [H# "[b@@Cm 4 ?r! yq>k_7aD_=#E?APD؁: q(FT]``> -T FQb~g ?!QO?aeQ@|[ɠM_ b j(q)P0D``@:PiO9?O EKߧ_t_~%V/@="ᩈ)YQL"98`AD@F,XDnI?~gp+R!;卂+@+SAQ0zف0B. f4@>m@ʄ * D  5Xba,{_PY) @"(d=E|# 5@ -o y8͛ x2oÿA4LAMtY9 Ap0\baKd1ݿp8 ?KU_Ol_B E˂& ti `- dbZJ?ʆ:^y´ipq:t, ԿN Ro14 }Z Q" @- (ebAGCx _||E/3_W}>XD!o_lJ9_14~c;00,gd@E=m0J(!xRqokOO\D(~@)* rZ 9P0Lk`ADBmD,B#g4P%-H.F!$5@p_=SQ@}YQ #@( ibD@Hh [BWbho¿w  wɿR Ѓ؀ <Hk^"@F l40Пq?fտDŽ2h2%ORb#հP=V{a\-LAMyX ipCk0M"o^,C@P$PO$Ow:ibSeG3@?; 63Tg֘xX9#{ G*PoZ@Fkp6(+ O=0"Q`w 1M

X8oA?̦ ؀ 9 0J2 s`4JA(8Y@2 OoP A\i{|( "b@ @g@@u`D@H@ o?Q@IB/?ğ" .vX0TTu\-HFl@+o0oR`aB o '&i3A1 j0*@u`0D*YJKa7@7IuQʏ 7DF& ׀R@w^=80n3LP]?4hI{) B SŒD O tP RJwh`(@8h2J.Pnq8 򀚿O) oܸ*r@{Z@@-`C ` [!kԿ5DؐH!j¡& p (4{\V@:o\ \.B݀o ~""1 b@7P\ s15W *`1J{`V@=mȄGo<,_@րE yol*?<{74 PP t8[BDK\ @JlBB~IG !@[ ~a 欚@Q/=!FBȂA0 ya<C0 J@AI@ I o>s;z}`#ECL´}O$ogb j(wXS @Bp>h .  }$AB~{ 8rYF_] `q:QҘf\rp Y :CBOb EH@>@5( JcPo7T?+F-n 3\s|oO)LAMEXjc J,\HIB@$O 251'e+W ( -B \LB, p@G,7#Q&?`eoT(p# {JPo1 Wpd *B`MH@B, 5( j8@A(#@RvCƒ` X:P P4$`A@J,@5(Y?FF?OTaˠo튥b[k)"WRK Po^ LBl *;UvZ@B9I3p e 'Qt"PK0PWbHE, @_tO K6p<_@u5qف;`4r(WbF @T6>?BoAO)(q^q+YSOO5Y15 yق;b@@r Wf(@FȐ^Xnn. ϫM7YY@؟A(^e|Pz D[@4r9D0F,0 %%KSz 3o@/(":7'/O?QL LdE_A14؂S »@- Db X<mFmv_ gf@ӄlmm2#=7 sY ;"&dX@10f~_/@x 4 oWOCYSH~k/LAME3.98.2jڀid{`4P` L, ?Ő2}*o_{¿>>CX!5 i# `4|b N,o}~O =kog7X7PW/r_jr#* ${(bO,5[@?/OWJFc??X Z[Ir|@v;d{`4BQ.awO<Ɉ) $Zp(Wl Am ޡT*QT_&U*oorDo?"u) 0 "ۀPXd XImA Sz |o8W7 CTM\ϷeF& |ـ )0P- ([f$2m@]w GMd G~fQ*??9Iɦ ~ـ90 P'PX[`HC[|ew~NWw|? o~{t * ~Q]_ɦ Y"@0 [^ dCA0 #zo__?IG|([CAQ[X90CL!D0D0 Z^Fq&/^/> !#U[| V6_RE_(Ɉ){RBJP[ZeJG )@Ro؅ȃw?u )" qO-,7 w^P P?r4J0phF(  gڳ6DZ@V2__` I|֘f\rp\d c<B PH!J0,oFET*7Rߕlo~N`6g|b j)qq }: 'B[@K07o&܃G7rgg?GPI!t_A[0? bxoƾx15̸ {: BB[n(Jp6mLޮ=E|.| 6AHC+I7a SSQLˎN yW: }%=}@0?  ?zֵr_ʁ΀Ȁ`F?Gh׆o?+[DS2㓀 }W:bR]q (Jp>4^O;Я 7ēO/)8g :ߗ _8@o?LAME3.98 tXBJA]_VP@@^0'zG6s~l?տ T v])7?P mؐRQP{TLj@T !i-C8.吕:[=hI~,:Ku k׈*#X_^`L@B@H@+ ?_a WFa<=^տ3o,_~USSQLˎN p׈ bR_`LJ@Ik H 5k߬ P ۫;?v" DP y`:%R0{X`C gR_n8& x2!0SS@ ր* L}wJp@H ?տTBԯ_( Ho6% @R15̸ sW*R}{TpK H+9U 6>Um@D۠*J|7!&  {W:c EH}wTp4 D妒d'_YpsPz4 9@x0??  tX:R_d)4@6.(L"a­;/{/ɐ&@f Vb j)qq bLCPa\`@= HРJmg_ckcze_ Do9;]SQ@ Ё\PR R_ZM:Dx @ @JἿ`P:E>ߚ3-0>MtP jِ23P@TQ@F@ 5H ophs`G!o7.ʋ?T2J17@ |ڰ *MRs 0. N0`/o9OT{XM p o[Jb j)qqjJR(\L@F HM3?oQ+MTY4߿:O 5طKk)D[׀RP,ZE@@HP EK?+~@G/!Z*ug|1 OBVL oȦ  XRd 0RcyCNE,@ HL3?U,C?xQDhM9SQ@WR 0Ra\MC, H .U)k??e#a;7mߣP!&a/S@ Wj Rah&F+ H#:+5qxju(o-/΁-X BXίb & Ѐ X  AgRD\a@G,I@ gAK_k"=t'U@G-m\650?5̅U1ЁXRd Ra\E@7-@ L+c g3;7 *W`P78jz15 Wj$  R e^ jE, 5H]kM7 Yg(3oͿ~U›ud WRD R \JA, HB@to _OccHW /7$'_D Єրj CG`b@@Jk 5H 0:Q D*urF&ZSʶY_ & } VkMR,VM@=l 8-g#5g^ :p|-gOW[FXLAMЀ kA`@XM@Ck 5%F>HF34g" .7ΠOD4F+A1| ׀jd `Y;*b h :{0BUw@(JB,@ 5@oDe e 2PKK Cowt5v?35)X`;b P 7D0E@ 5_D(  @+k}h}تpi){ف;›0-$QLBl~nは!'u`2;0~ }DWN8Uv_B}؂; "'$m` $;l0Nt o*jw}E 'SW=o8É)}X*$+0EB``A@ @VB?? j€2 +o'/…+?N3b j( X:D+b\Sh4H`E@"t+^(g`2?_`u,o| @T??, *+0B(\<@FlS/[A_o︀' n)'o[V2`{ X* $ qBT^@Kl@Ԕf8?D`GQo/cWO+U ^6_FMLAM Xd0B\L@El@ (p&Lg.Mo<6cU*:]:b W:5PO@F 5 u'L-P(1B|ŽKE@ |؀:P Jo ,H@F@ )-+YiL F #0R,97_f7^b j(xX:B({^a@=ɀ4.ɘ9`ggbhŹ ~]QH$P ~`P4# L M^$D Yh %|&gL>tO:e߅PAZy)} w؁S@@K`AIl@W[ #?% Q[ {k=?%@+>_<%4P aP4@LMb@?l00[(7z-!#oo1wXL|Ұ-=15wXj -B,y^Gl@5bPnoY`*')O|fQ0/70'3_&|؀R *@w`=<?E3?k@JfF/!f?c]o̰@Ɖ)}P(4w`5DE,} M{7wAv J/*988:OD]DP(Jk_>  mXR0@uyAVPK~ AEtOOޜ f3r6pH//15 zY ` GLDu`E_Au0!4\h?UƇ`7D.}  XjP @ub,G)J7@2{MYD`[Coᯠ `=q   Cm@qw HDl)I%@WP)?p2TTFESSQ@ـQ@' qf<C,JG? S=/oTz$)W/7N& XiË@g@qbA>p!erD ?P>1{"pU05.Z]? |؀i+0'@ o^P@Bl, ^8M"\OQAN'9oKz2C_&?Q14u؀{@o\5DEl@H!yBA*gJ3E7(3. yY)@, B>4m^4C,prʠWP&?S?<?7Uٿ+#@ ? տoLAM}X 9 #k @k^ ?veʷ |h V~N^gM߯w  ?oJb h u 9 #k0$W@F l۴u*<Е X 5-/x˹: o?LAMEziq&BpBmȐ$ '20 JWK@$m<~ bLЃـ ) ;a2fZB-@p AbKwP-;Q7T&R$G15tـ P{P. dZB-@ 7K+*=OuQAFQ;15ـic;@$ed5DH7?[չ o?z2-a?q)ʏP_7JbtY-kP(ebT@B @- 70?=SÉ!.Og A#'1C))Pw-;04cm $ @4 eb@Bm5}C[ oq9DEnEKk ]S@Y-C@04eb=FAm6VQS  @|MQUAH]QO oD[~j8~"owRbX 900cb== mpߡP8!tڠO78T?f_wFB*_(SИuف-C@00adE3|3 gឿD1Ɨ?%_2@ LtGr"#g15۩@ pg"4afV5Bo^({L󿰄~Sɠ$͛8QrE+0f&15q Qd+P,DdDEG(%SOuT  ?U Oj81 =`~;fɈ riP(L`VCl cv式_ "O@}EOO<͛Kw{&  Y9$ @4]dV>0CA.g[V0iRGp)[4'x,1MWɈ)} YQ @0,`AC,#'K oбPmW3~ 4 A6 A) ؁C00`XC, /fF~U@$ k9_",ߜ5Ps.؀ Q0<[baD@A 7o /?6"J??^7IFC~%_nP H 9c04Y``@C "07312_ =~-~&o8 Be/pJzXQ@4F8Y``@3 24'BG?"7oGB#ޟO5u15 ؀9@4GG0BlAwBVJ(<_E!'?Θ~(Mo_?^g:Y 2x$|؀9c@@Tu Cl-@Q+? Ѻʜ ` '=~ G_@yjz7WR]15 x, }"'$y^DC,π2 5P$ڟtuVq@~k&JxQ@  9#P"$w`=D@A,Zs~xi_*OE]MF`~W';O`AW ؂ :C@4FWbD@ILrW_ ?7`ɾ!?dg?8^Y_ဣ7 F&&  h8@(WbH@CFD 2C{0c}?o-.Txο?p!yY 9P(UdED@B x3?{PĿ5wjbW@0wG- apNP{Y9 p(LUb=D@JF-S忷ߠfL~vRL|ШN?o'"1oʁl+-И`ëP4 sb @B@HhP/Eoo/hL0|&ˠ)#j]ɀ!/iLAMr#@44sb@Bm)Fd$" \A=?P(}O .G2!P#oFyPY `L*5d5@F- n}_0~_Én{~0` ?)tq'+C\P~#SQ@{ Yi@4TQda@> m8p޿mv_qMYÿ o_ovhݽ@ W_Zb j(wـQP"@QdEB@H-G_O /͵]z eWp4@#^-f֘yi {p"8QdTJ < +O~P (yoGA;Tt,((po.wɈ)h {P"Qd=@F  j_~ {_wk!e(2P ob j( `{`,mh=@X8ѿW v@?%GYGG+>D"'9i)YikP  md4E s/ \בsip?֠4zoW =C}DPPqـ )`c[`,0kf4F T'<[~K'nx}f@K`/9GM󆿭9vQ[P DOf=@L4}G;?/O0B?Y[IB~ȇyМW*?C"9LAMqڀQ[` _ ۩8y1{Zi k* DKfA][w„e?:OIHiaź$/I[A;0N\b j(vڀQ` (Kd@?r\ ֿ ?pMZ 6 -/ź8`tVYNZb j( 9P[`  - D0Gm#Oom{`?' w ̧f}cX3'_@OOUS@}Z PBKPE*G0C ,h }>={0|@?(P5UUiM-w+3] YiK@ $Id4E@>mT tE-FmOɀ"/Gm|3``:x_OO֘jڀi";@ TGdI #(6WɏFW "Cfpv83ѦMC[WooQ|ف` 8GdA@B@ Gj}T|c/dG1 QںDQBb h {YhKP4Gs $ @mԠ dc՘WT_8{@@Va_@2O@??wOK@֙SQ@sZ`(@_dVE `)|σ[P|fOo ^_ڠK/w|/o) ~#P4ydP@3np #:ԥ3 %EV4Oo{jnP"oz?dPY8P4EfP@E- ˲-V$п{m]xGGO@6?A06Bu& wYQ@ $ybP@C ҠF[GҠ|sQrvTO?Nyoo/S@ b+@4]d4@E ?>VMdo™Ol~cX7վ 7 }>?SQ@Y 8cP(8[dRD 'w IRoP};.uTjqEv?羟Je#~xYPP4@AdAB@>-~sNu 4T?n"[;|n>ߐSS@Z 8 `4PYf4CI-pҐ'ӬҰ]V1oP}x*0{ѽ@7~sfI0}ڀ (`',[d=B@Dm@ Fzt@8/y{_*gxg|7s߷R @[?LAـ PP'4Yf4@A-@ >{s9v`;'9oOA~gNQ1 {Z ( `(4Ah%E-@p^̏?<}d~i|rS|J3LkO_?ƾK&vڀ 8 `(4Xod4@IЂ2_<o}o)ȵt7w64F_ /Z~K8* MO|`zځ@9Ap(4Lqd5BH @# > po GFD^ /WW p?C$qZ@9`(4LmdI(#*8*ޏ|WrWP4%Oƚ44u KxV-/KtY9{P44 od@ @&岺1Tߍ o~w|~'3} D?Q~_R)|ف@9!u4kh,= m('OU|o׫0 ~"|WO=|Ҙz)!`(4,md0@Em#NN-*/|N Ag[⏷/ǨOsQ n*3}ӡʾoYP|Z 8b`(4AlF-Pۿʏz->@0M'xE&Pq (Q. p>C_P}[ 8B p0_dV@@HHHnA?{@ѺO?_e~_".8۷|4jZ@C`(4_fP@I[\$¾WnX.߯R hgK!StnC[R?dZcp(,ch=DA-  y֭dɼG߈qG. 5__ʀ'}a:?txYiKP*Kf=: m( Ʀ̀M?M;oԤD~-46Gh|"ƿWM}_@deBQoSQ@ }[QbkP HMf=@G p; CoABSGon$v PI~- *P~ EWLAwQkP  Qj=B -4țepDOsOqz?Su|-5P`C?$O45I`i s 0?Aa[/Zb j(i pg" Ub=C B"1 tuH03~i}~/p"b%M֘tYQ`g"@wdaD@Fhı/~1o_W84[gƞ'' @44t| `B@"$YG0=.dnΎ%;d,`qoO/Fa1 } CP"{b=D@B)M&?`#ϔB~U' ;nF@i/& vY)c@g"P}bC( -_@ ad-"O OԀ' ?Sc?VP))0"[f<@B-0AKпMiM~ [ 39PP?LAME؀9 P4D]d@@AmK-,_' Gj8oտ' ;F[PK2b ht )DPe0_u#T`DY~@ |`_B7;T{ ؅]15yY9 `" _d=FIFIEOEwȝ%?H4OLK.0JR-DɈ)ـQ@0d=F?@v#~V4SțK_z6徒&YHb hvY9K`0Te`E@E ,oWr1 ĚОCt@@ O?6%fO 9!ZJ!B!_ϳɈ) Z 90G&ef4@Hk {?UB`kʍ ?_W?_JqCSo vY i$kP "gh 4Gp?? #O *2?S[bO14  paPE&Ud D,ƀD8oTw/?QĀKynI>o[?}px?/_ yX9A@' 8i`=@Ci?#[ԇ_nEvOPW?Qʁ֠#?OLA~Y 9 #@'"kbK_ ?G/ !ȇF蠡oH~vX@NÛJFs^D@@l@D7"q a@4`ޛLE_P,PcSQ@|WQ#0B>@uZ!@D@ Q@.o A*o?NOgzS?*/2oYY14{W a%@8s^%F@G03@3( }aa?!o,\ЫI3\ 4  9c '@uIpF@p)PAP4P,и[+(%G_ @WLAME|; *@$u^@F,@\=>@w>WTS@/SQ5P/U@'hB[LA| 9# @0w\5F@G+ʉ T CbaZ ɿ,F0W *`}"y\=HB,(M?Bu[w @}:;U ;oG  зAa1W :`C@{^47. *aPlC!Pc4`[d'Af8P2aoy@7i) Ї :PsJyj`PDl0".F"^Fvq0&C[gב ;V"& xް< J4{^@G@(G(7GȈ\SPaxcE2.P/ ބЂX L,}\a@:  B aBe VP2OEPG EEo?15XR0JJ4^I@@0i %Cx< Q_o^/$Fְmr g/tT&*Xj JJB`=H@E,W+~(F@uO'o coo&z؀:d @J`Za@M Ϸ*.'ɿ&U ԇPy%\# L؀ -@B^E@A,5 o-:,EW΄' zHfʈP "'XM[4 WR$ @Jd5H@H, 5@Q?ZX-\ mN$ʂ=$kµSQ@mY:d 0B5LpH,@ 5hH󁟿࿠4oӑ?XN?jlQ}]3'G&  Xj$ 0B0`<@Clưl?`o_k@(*, BO@s?Ɉ tj0 B,^HIHl8U?? U*+ 7@u=|5`9#_490 w(LNbDl8 |GH6p5["49 Wx  S$ ׀jPD0 J \ @7-@G)h6;PH3= /<FlOOA @!տLAME!WRPD+jJm^MH@G@ )(Jiο%'!-"BGih4V ? V p[L!Xpd+ D d`aH@A!&gHXQ_7XF527$_z:4.!؀p; 2@b=H@> C+g{/ /ؾhQ  !ـ:"QobaH@E(0BQ0_B߭O V&S!4@d !؀R;0B|u@!E,a7"O_0A'Q`55ϩ~==SC|Ɉ)!:P b`C,p Q88g^$|@;?Tp mq {\@ *$K PH\aH@Gl )@ )[?]yr[_ @Qbey xJ^2`u"X:$KGP8\ L>l @*7@ @-oPwc=?з3& y"؂`S [ L db ClA0'@PBo~#BDESV/з ?)_[0[De)y@+[P@ddzBl@^Q<ڟN6S(TB_`b6'4Bb j(u  bPBH` ZIl E0ƚo7ĠUUF _G >e_0i#̊@b j( [@4Us&LB @@_9`D??}DsYAdU-S@yX0 "'U^D? ȿQ~3ɀ(DSf&O`@~I'py~ĉ) zX)0k0D9dDA/WA~/67W 0#ͿXPCCA,@ B~eʿ& n#X Dk @$\ X@I M࿿7Pv?(? {jOP4Opo)s#؂@{0@$` X@H,M }O"@auOX778AU^Py؀90U& YdJF, SzhL@_X@}'J5>oP/_XL}Jb h|90»0'&,YbL> -@W0"g~}=G"V ì*oo_Q_& {Y )0P&$Wb`DSoP1X7 ?C0-~cg~__@CS@YbP0 4WbHA76?Xɣ?~k"z7*_'o_B) { )0BP&[fHFmkXv `=ൽ(a?w-\# Xo񌘂}Y@&[bHC l#͛MJHqMb-gDJ OA)@ʄM14 Y(90C0'&,[^dB >S1o@RpTO8P|?B7?_?K|3~A1 ب:B\w\MJC )@ʇ+/:Bd  }?z[5o wX: P[K0E )@٢d+0dP0?$~0qLAME zXR0P#@0H )@tf2you2+1#-ɘ Dv~KSbO_zb j(:b0 P0[`aHI (rp+bh}TFTo怤?*EJ{xDm`P~uG5& ؀0 P[f <@BH% aGGպe?n !#'KOfJb j( wL@P[z@Jp;mB WѩVi+??`o@E#Ъ~S2㓂 _] 2 z ,{u@4JPQ, ;5!_> -A؁/!C| 8+s?^HSQ@ ЃX: BP$]^a@D,@ I@ n K `0s'UEzE\_XP~[UF^__Y4I15XR!j _^eIk @YD.*IP6?q>:U.j?PAb h|WR @GR?}@0TF 4SL%?kC/G@߀@n?Bb j(  R{d HPEl H085}o.# *1ʍPFƆ(=j 2}[5M  ׀jcb^{f@@@Bl@@YA(oT_fY4`h7m"1PF PF_ x:C P{n4K4oXN.#\O#p=W`BLv#1@#)e' =c0R]`d@E H N.LbPq}@O7ȅÑr _#W_kTY14 }[ 0Rah`DJ@; H N76dp1CٿP3 C: Xd@2 \oLAME y`PL0R]@0E@ )H @ 3bR0 @T(3CF'/ğSSQ@ {Y jc Rt]r(Jp>@(GV Pl]Ə<9@7f\rp\d X:# Rad *C@ HX+]?S &ʁP 'ˠToP ׀2cPlat(pB H6 9Pٷ?@ǡj ]Dx y9SSQLˎN x gRr`(p20@#GGM\HACVWxS) րjcgR` L@=@ H)bAY&@py06C-EɈ) y:c gRb H@D, H _ KTt_P_KVRm?'岐0OjKp8weS@ {׀* %Rcl F@ H2<  gD"7h{3c%YgSU0DP:C0RP_\eJ@C,@ HafA'Uߗ@Dt6xwSlȎ\_lY@ iـ :d a*Paj@<`H .p̳_jG?Py"t3@}2 >86} >f\rp׀d 0Rc^`@F@ H$tC]fI wD OJg_ Mg`E|Rm&'LAX# Ra^`@B, H` 'dW 3<_ʀ~O0;'7'(Q)~W:d R a\eJ@0-D\27Q2o<(DQ]16[AfW?b j( aP@+$ Rt`J0;,H _ Tx?ȿ  n%0_U?LAME3.98.2 }XR GReb L@@, H Bmd `oM8NG@KCv*l {Yj JRc\ L@El H2z@ʋ`MDP_^3Z~&gq@ ZjjRcZMk>k 5 4O_ؚ #?2mg qgz쩿sab h x׈;bl0TPMCk@f L +La#o"q Q +La,_ΞLAME]ڈ dA`4c0Qj@xF@)7QP aQ?#BV- ЅVR3Pch <:lHrA ]@dDV1 奏pNH":A12CQLAME3.98.2 ׀cRcb  HkI@A+P?k `*C?4[if ?8=F |t! :c'RcND k@@/wDhXo= TD [Ce_oTP yR0Phcv`L 8lHCuKLx4O$-@do@LAME3.98.2րRC*Rc\`@B k HZPu(/H̐___tD+_ m!Ԙx#!R8cViJC k H0ۙ1\'?Q4CY8]z(3ދZb hw׀:#R8a^`@:-DH qM p;/[j-A:W~J_\ȿOĩ)R PRc^H@EHͱoE@2(/WsrBHA@&I4LA ~ 2P}p`A0F H&;y<1j9Y7 dM@A?ME!() &  |XRC0GRt!@0D HS{c՞&[U({TH+f_X4 ) aPL#@R _`aJ@ClH E)'a6Q)«P2W Z=aW[a1 rY:c GR{Jp9/hJ* _OB3 8VMz B(x\mdw߫&  xX:  P[@J0?m)@ oe9A_t oL!'MI)e'؀R0 P[^aB @n< bw> HO~򔉼QoOO業1 s8E  ِ* GP([\eJ< l @ oOB D_9+h/2O[MP v؀*0P#}@j0Hl")p;O)Hg"T o8b?=_/X) h0PY``E, @+_'xC.;Zx 8,o 15#:dGPWb@KA@*b? BN_FE g(W3G15#WPkPUb`@E (j=O`E 7?I I? @_z<)Ħ "؀*[@P0b`@Bl #@"?;_j_)m]pb"*[ H^aJBl @)%%/X-u}7ulg?Wmd/7ʗUBDgLAM|"X DK0PD^aH@J,@)1wj(O>g[l /cQO#-X81!؀p&2kd<@2n @V/ 9GHU">A_OP!؀:P m kb=H@C8WG݂V+b_Þ X@gSQ@ vYjD+0@ dH`$H&af>W0Í?o=~a8 8{qkA;3 oSw!Xj+-PbD@Fl@ ( @O8{lA_ʛ24%eHP(̐CɈ) |XjD0MJOf<@A,*I¤(7*?}API/)PoT&cRg*S~GA:?  X$ 0@ A`=H@El@2*Sg1 h<,DWҞ'(l;5o__KÞ%FD,Ԙ=p7o%1r 90 0t`@N,A7 @^7yoOM|D @_=5! wտ“@YiDK`00ed<D-@g ?]qqVG %9B^'as5a(sпL PZ(Qc @< b=?A7/AMf3 O(Ho<|!9$;P0cd=Cg_@_wl Akx''oac0T[S@Y9D+p06oV\0?7?>U %3h2b hrX9P4D{^`@AmD0/Tc )C#8/)X9P4T8{^H@Bl@S]%V`{%R;ߠ/T\ D~ʿ/h*b hrX9#00$y^aD@Ll@TMOF4A OOFAP e(=*Jo]8tXQ@"w` XA- ߨmOK?PwCoM0*D?[&/ҘXQ@"wb<@D=K71_*go $ g0Z߿|?03A7@x9ug"3 _ʺfWoݼ=H~vq1x `c`4qh=D@C-sW _?h+X[__vҟht }?i7 SQ@r ZQC{` Dof=@C10;iP 3_Cp _vY/oR{H "=u/Ku_9=o0(O_ЏC&_`/ۨpZiK`,@0>u{d=~u/Po/d.O~i8J{ 7~Puڀ Q[` Mh=@DB_3Lߑrpz|P}|MhOi)yZik` Ml1C4mnPP ߿.K6Fo: p ~Pb4(%R(_>@6LAMEu9kp  gh=@Cmn&~P#?[qNoaW,Fm!?{Z=[-M)ڀPB[`j,gf@@A m#i?OO%]B0 *[@_ b8 |@/& |Z )P "9Ih4E@C -@uY8~ߥOfWE}5P1Yoz;n[) ~Y 9PKP Ip< -@S $XY│U~R!5G~@{,w a?ʋ5~A15̸xZiK`*PcfC@ f?W{ wgߞmOW n[~4jjbGoȧvh) yib;P ,efVE@4;GSzR&~_MZB1/ a s.9/V]b}_Q"_S@xh;P-$If=@B@?1u-1~c_PRoڵʾ9?酴>.ES@Y,B+P Ef=@@m @t{TE)~"/|A>J=YsS?_Pz>7OLAME{Y,C`4$GdCm@ +CX8~$8/_\SD__~C"^|~~2b h |Z cP4$af@Cm0>;;O|j WƝWCm?R: xߔkګ;14{Y`4Ed@=-@$~}u ? PZ>S|+o `I5p?PV%?1PyY,CP4wdP@G, aҬ-|_=@>QG[hSP+& @`( CdP@B #e'}ܠ.7.tO~tgD|YPëP( ]b@G xG o ako` )Ѿ3WD {/|>PsZë`4oB?{B`vZ@c`4@qd4F-H2,爿64oӞ zB:uƐ"7IF8}-;q2b Pc{`4 4 of4@E@Hfy|uzۆm)\B+u| O|N?w7y]i u 8`(4\ob5C@JpGN o(GN!yACu@6}-Gп/膁H_CVـ 8"P md4D @@@wʃ}[GtE@ᅰ@Z \5[žSwV}uzqZ 8`(4Lmd4@NHC/2q WvD5z|g|Ϸ-( ޟgƟoTyVLA 8dP4 kbFF lЗOKʻO_[}`A|O=aFAkA]^Q1wفB@448kbFEm /> %6C|N)Ga I)?d:l! ~(޿/˦ 8"@Sd5аo_Q#Џ~?}8 _C}C_KfP(k>C@44G9U15tـ9P4XSd? @Bӯ`|?п oy_X(L>{|fwaBoF?fѓLAMEn 8 4PAf=B@H-H БC|@qD p/V ~߾Tj0'}o& lY+u( Gd@M-@o[TӨ ~7G|O&۩gN!~܏ao5INP_}i)}ځ@ۀ Gj=D< - P@oq'I=]D&W7?~&^`;Puځ ((eh4E@F@ @  >c/-Ad )I/`"oG | P [ 6TMf=B@I DH5@([1o(F 0$>.}(WzUpKء_5œ@yڀ iB[p* mh4E:l]~{z\ۧ '~] So_O?Oo5= )ZQb{p oj4EE q4έT g7v@LM {~K ;pb j(bہ@:"{( TTQf=G uXT7ǝ?@^T ;]4 Gt,SW_'e15{ZQpg"HubDH-'E_0T0g<}=* ~DO[ }?Q3BsZb pY#@"Uf0@EQIoIGW %O``>qPr_:LAME؀QP",Ub<@E-P_|;i),8/Rǰ &?; ;TPOfLAM{X9@"({`X?m ~-٨WScB?և& 9P"{`<@E +@R'@?tBXP9B~\WC@3ż=A;ʺb j(~Z9`(Dcd@F~&v U1_y$@B[ yPR?xLLAMEـ9#P0ao $DZRz;_n*/W oW @Sm#RaLAMEvZ 9$K`.8cbAD@FlKS?!g9^/LQd"?Q%FBـ 9C`4dZF\ Qxs%PG)r]_ɯkMW3&7ѿºbY i`&gd@> @M?@'Q _Ẩ(ULAME#ف{`B.id@E-X;Q V?+RAE9Bb h|Y 9 KPG8id(@F Og ??'Y _9mU>^ G?]G}o@ 9[@80k`-DFbhxo$տYwBi?|1ݕwo-×OQ*|YQK8kb5DAw~F71_wt cb VR@ѧ& wX 9 Ck@$ \i@_*%#F?ЌL `,0&gb @15t؀<#k'2G0I,@VP7|=Tap¡Wwwަy +7*/O!Ҙ }X 90$EHpG(Q?3?M0,Pah)oSA ? o]15 qZ( *{ $q`4=.t *HßHT #!)!_ D P X:cU'@qb?ah @@,E_$ G БLAM ~X95'@sd@>l(HY? " CG1|D'Ȧ `XRC0@tw\@MPtz_P4>_P4"$JȒ`m.MYg(R(  Y :  b u^L@E@)ѿfտ?bWp fV"s/Iv[1 'S⣦z؁c4 TACdn=C=?ax4m;j)Θ:P$ *J^I@A@5O%/<// %[Ko-]apwӠ o& u WR$  \,^ @G,@8qʊҀ4 oP|P[yt:&L@{:mEa":P$ 0B `DID, ]P@X\PX[ !#z!h|= ~X8dk@4\ X@>A 0![(SGo~u1rVyG7 WEPu#X  k@4$\ X@K, m v?(|`-_{̛~u8Vo#x! +0[ŪLAMEs#@H\ X@J,0PBSYk߯~*{[k'?Kt@ZSQ@z؀0 0"&0^ X@Jm[{ 7 ߈_&~VJ@#Vޡ ~Q15X  -$YbJE,5C@OOƹ'=/s8B'jm H"nP )0»@B& Wh4DA" ??_oq z}߯%`~_))0B@B( WdEW @[~ 7+E-? `3^[L3/~ & |)0b@E&([b@mt*PG~ o? o#X{~\:[ɯ蓀cS@ vY B Dr!@A0G l@@?5 p+/ɦ3oB!*0²bI/ėz8`M15̸w׀RD eX[^dDl @`j'p& )0R3=g6 *)x:P@X@k )@AB< `y_o1+;o>~W7b j({RgP[\dE @T;(@,d)!pYpK?n =5vZ&  Z* GP$[^`@@ @@A?0v ?I=8MƁ>G ?82P x؀:B Ph#A01p&xB~PwܐcBB o"Ott.f\rp\d h "QR[A08FmQ?1 Ο`[_JGoJb j)qpZݐ8L# R<_Np=& L`M?Ÿ*= k~_ _01?_?dS2㓀 p[ 0R4]^a60d& `؉džz'o$-WV=a!AzSQ@ g[ C 'P]^d@;14& VOѺ9{PWPCA?Ԗ C[Ԙf\rpo[ c JR$!wB@ 0p  ?+@2? O8q,9^Y!co8)) t[ CjR,{TQ@>/"!F c!83 ?A+F?*o@O &15 zR1GR|_t@)0<l H*OF# "\@Q1?o)ᜃ? *  qو #AGR{{@(JP4qh&.B_Ю7O*Ds- ƃ;dS2㓂  ؀:c0R{0F@ Hr FyE</A gho(檐9=7 aSQ@ vX:@GR}w@pEH"9+r3O?C* ?%̀4<]VSQ@ z؀:#@R_v,JpGHHh'{p#'kcĢpKEi?옂 m^8J -h]t@p. &0aO@@ s`POoПИf\rp\d XRc0 R }b.JG )H.E$S⿜g3Tm ?Ў ȕO?Wڈ%/E X ]a0F )HN3UOHi*0ʁXHc j"#&  X SP_A01 d N}mS=ي$Q]?3Œ) FQ7`_ yj3P0ZQ@G 5HF+?PSX`h 75Hv7>YP9w.oЂրR#jR\MJ@? H@ty7GMQ@Vqo`zAfq\ K L`7!O/LAME w؈b#QR@^`@EH6Z}_G?- h{S  $ЩCa8@RC0RPc\d@F@ H]a_2N'FXA#5OQur_ '1׀R  Rc`AJ@F,)HioQkCؼiMGLxQ|@Rd*8_[c0R_\P@G HlN'd? kVMn(5.z3 ;@Ol ̫ց#@ y`PCgRa``@FH  BG_Q_- N<7&)_#7[@t/ 7a1 m2@ER}{@JpK )HV٫?uڿOQ07,NFO:qdPwو*#@'R!9J*  }&+PdXOVbƆ~W eA0zSQ@ Wj@ R=@J0C, HEv/2,so`` (6L- 2+*{Q  hLC@R[ba@@ @?.~Fb; Y#_^悊1 R" P [`LBl@ )@0T[h< y'W3ɿCd,)w:Q[d@@>m HP? DlO QgbjL?L{:b@%B` X@:o$Z|t0wu&$6A Po&6f&?\*)ߜEԘ}׀RbP \dBlT @EJ=տ?^/>_(w~IOG ___7oҘ #W:dk%X!A0F z⡏?r _%A83]/?iO#S7|P|X*k@BB8`ZCl Q4DO2؆o!=o@V&"*[0%Bo``@Gl )8'QQ?K៹\_Ke&+?BY/R_rɈ y"X: KBPX\eH@Kl )@؎so[ʀ/EH6WA;[3 |`LdK Hd4^`@I *Ꮼ/AhLm:gpI*x<q] h @ "9k`=H@6 n@` _Ype٣_߆}?!P}!Y; ⌌"Q<` @A8DP6_ظ/?~,z@o*v_o8:P?Zb j(pYR+@PH\ @K05uOï/" O `3{|!fȩ bXR+H `@ICl%g/mȝXKC0Ih[%F? PD%SkXR ba-@\` R@E0=W"}DBXo,EW%Rxl+LAMErY:b B5BA ,sO Q~KP>o|x<+wRfqJ ~"LAMEvX 0 BO^IH@E,@5PK b^kCw.E?a8/hZb#@[vLAME{j -"0OZ&@E(3*O!ps%`("'侊(X %ѩߑm@bSWj# @$O\a@AL HB3Ԃz7D4`k1} 8!  sY jP@X\ H)(4A^Q($'a~_D[ &CBhu&  uY R#aL}ClPcDAF&wFuF/@<'SQ@~b04{vIPCl 0ާzo@(8|(D NFP ,SQ@yWRrGJ,yb1D,#"Ѕ+`kk@ ) WUރg /Wބ yX R Jyb IJkX1K%W<"R $/N1 PE7,')WjJ y`B,)?Msg@8 WӚc O)-oud|؀:P0'@LwZ@H0 ?QAxeA ʋ?^D7 u1 _FakL_ L :`C@w^1H@5( < (\ -?vWc_0%MT% g/*C)SSQ@׀ 9 [0' 8m`@D l?3 gVPuL_<L?f"o_do6!W0_A=1{؀ 9 C[Pg$(k`@D l٪G?5@9o Ood m/#~'8p/řg[y/&{YQ!qg$kb4Fm@oObQiv;;1<GOR;0F u@-;`'2Pg`=DJ

l4 Mz*F oBU;(cwOr !LAMEtQ$;P04b=FE3 @ywS^?+7OȀ=?Eo߈Oǀ QtPi `j0@ad@EHx+o?,ѿo54o sBE'G$o[9D+`0Hb4EH$g_z_O? /BɈ Y9D+P"d=D@E^G#O@o_?o_x Y1؀Qܭ"9dVCmg&o<1-@o式@>֟9'`0#7~Y 9 @0<`ED@I,(,o$>o1:Po_qO{B8b7_*Abz`,$ @0]`DC,`"[k?7B,EP?d"G15  04<[^=D@Gw 'C3O}7+yuK/X%7TJby؀900[bH@E%c9Gc&?2m: lk?S1GX{R?OԘX9#P" bXE0FF߯_ovu{@+MD3)~-}@JR?羁W@;0"{b`@A&6;ߠ#&[<1V"_:s3B6LAME|X)#@4P{\aD@AUot&ts<D?l΋%9׀9@"y``;lfoKBO|@XT~?|1)jb j(Q04 yb<@>, T)Cs* WO[$j?8ky_E5?)?GP~Y)P"UbD@F(ok_Pk?M0]'տq>Ȃ7LAMEQC@4Wb=D@FhF,k( - ?_o,2)H 2~+?T߯uق`4@Ud<@G|)KBЗA??1 _xA0YQ ?0N庠0xAFLAqYQcP"ud=D@Et6/P6o_^I D~ o15jYC`(4sbXI(ak?BnPߠ/o> ~<F)zLNG#KL=?hG?fy`4Sb@ECmC‘4X™mH7+ۦ%H}0F)m| ob j(Y#` TqdXB-@*s+o{B as~!A})?1ߌŻ_Jb j(s ـ yPc`(8Qd=D@H -9߫o95~>52@+e?Hg; _ 7omG؄i Zi#P,SRpG @R3i$ğȨ5PuaM?o/WDx@߫TPnڀ Qp TQdRK lx1`򅿮Èoз?QЗ'ӷG.z߁JS_џoE1qZ i{`*"LObK :_oh@^k}Cߊv}e+ bpz?:SsYik@,\Od4J $8K>!kZ4?z -PwY#7I `{`g mh4EC @Po#ck5=h&(1n+)`߁mJަWݧLAY )`kP,mf=@ m@t=,/9{}@|}@_RmBo~O15Zi"k` $kh=Cȹ=oti۬ ;utP7OWAȏ~w__ _3LAMik` 8kh4@m4o. >2)aX}ܳ9QXOj0?v/IWonA14mZi[` (1}D <l4)`BP(?vb(/r_ Aϫ~!/֘ y[P a{6$ij =DK-\=@|k `Ze6o)X2kyȇ:4Pځ<[p @gf4I 퀠5Hh TxQ$/V"/Ak󀮷bw 9P;P44edAD63.__޾LGƿDo]-Q)\?~$ oߗԘ Zi"KP -D=-=ƶOjo[}v&i2+_#z ݋~oanvK$~||5~S2㓀wY[@*4Kd4@C@4>_/"l*}zO.@a Sut~4__@iـi KP Gb=@N +Zw &G6ڿo^!$ӹz̀K35z$)7B~ ـ`4If@A@H':i?A{zWu*) ~@ǫ9 FƂ?914 ~Z#`4+s ,`? !'uf{T%ayG*a 'gYi |/òb j(gځ`4GdP@Jm@ HB{b-~Ś\P)g6 lO{@*V Ԙ}ق";afP@?- y؉?p`@oۏ5R]aBCGRT/P c ܨ1H`g yTOFĞo/oT11Y,ëP4 [f@@ @&)渻z~ ے*Ozf/'؜-oA_@WOz옂 y`'@sdX@H<@"?!qJ~am|]&³{o6D27H&n*LAME 8` Af<@Cm@ؑ`T?!|([򥾿-FRBޞ ?)= YPc@4Yd=@> -@(ҜW?G{3F?F+~彾H?}S8)ooИzZ@9BP(4,Wd4@ @#?zʀ{~9{y?C'_3B|ӔԘـ (P(Wd C Hx._)L~D(z @.}tWT/y?=}F03a-z4&{ـ 8P =f4@C@HoF)0G!9܎Ch/x3>=y_[⁏)_xb j(|Y 8KP0=b4@FHO7Ž~WIP3ʾєpjt|CXf|Fu3/uفP440obD 1k=W?x]<s>0GzT} u,"MWހ|& |ف@)Aq4@kd0@Lmp!?7TP>SVWߺkFG[kyק1 ؀8 AP44mf 0Gm@@8_ީghě4\JO@*,z|Yş-()Y9@44 ifE (A6~.-[K E-SbSl_[޿XV ^Q7^E14v (`(4T?f4@.hQW72w o(Q #Slb`cGH8vnϣ,  uZb P]!PpD mda_VGb{ B抺;}?m@P,O@'= uԘ~Y`4,Gf-@3 I( a~3ģ6FaEWoX i) {  \GD0@6]\;|(`X_ğ }? -?W~<$}Bz}:b j)qq{Z BK`M$Kj4EmX O/e`o~#bdPSD\-1o!jZ Pkp Kj1B@Bm( o- HPg`xG~0;3Cw@Snv3Bb j(~ـQBp(T?α*.ٿ*Ɉ)X9D 0"_h<Gm_@43 (3%0?/A%? Õ AFDP.?y@{ 9dP"_d<@Dl@G#7 ?Ǜ J/o[,o[i){a`D+`"=d=D@G~k~#+/*Oʿ")d-y'n1i)K uQ;`@$=b==0~@ww[Mp6 Mgc?%!< w ^<8yYQ %0()fM,$K}nG/; O 4'yΣOjDD?Ax dh`&cdE ma 8ޟ!<{AΓe>8L wG@ ` Pj$eh@5G9 I'̍*Lo ΢ 0b6+PDw?~+Ɉ)e'|Y-+q(Dib4EE G O"HyWlt_ RGRd~Y-Ke(kd<@A A ԿހlT.YO?/-/?_)ـ 9[@2kdDm@q oR23ߝTQ GNX!aQ]14 xi[P*Cj@(Fl6+@W !&1y?_hg.(7|*X 9 C[Pg$,m^5DB+[AmiHW=S5E?@c+~p _To Xik4o`,D@nYGbSi1?`$oH{>NVO d9D&  9 { 2bP@BlȝJ?[bGCAož F?Wn*?PLWOs(WjJud%HB| Ovc \r5? P Mot+oȁ& {X :cQ'@4wbB.ToS#B0{aߤ oy`t?6W֘u؁@4 Tyb4G,^ pXQ?8S4/A/?A-r#P(yb4I@\$E?p^Рng@:?L5W RCuėSQ@sY:c@@}BLl)0p@k(oP`5sX /Q'q:`( >  Ї`PtRJMZ.Cl5(0k /Ka(;1JP<C%(s7&RLA j "JK^@&@DlQTo`>{&w޳EާNЀPGz>#8YP*) wXQ JKd >FToU>To|I;o'|0EO17~7T{LAME~e@ M^$@B)|kA`%z>X I(膌?SGCƖ6򃉈 WR  B}b)@@^6i?TOL<|TO! : O#_"A;rb h ٨jC L^aH@:5F5&QT χ}ćG82 ÁXwqʝ15րjP B^DC0U'/ 2?SwJe Ύ=b<L WRPD MJZM@:$( Z0y  ?\f@ LAME WR MB `AH@A,K_N斤X-R 9WD/S [91L;p"/ X:$ @B(`aH@Il@ )cp&@ӯ4?n/G?Dʋ{G]b{ Y:$ 0D L^`@Gl ʔFx/hxwJ I/aa/1UQܲb} ؀:0 B``@@l ư??c [;n W'ԗ*CuL3')  ׀:+  J`aH@6m̭hs>[oJ)(1kI}15!XRP+0'J` L@(#R*&'XG& aE[$<[P"G!W:$+gB ^`C @#ph?(1XNb[P%w!%\S!X:;0B^`@?މA YABFԗ@$EQ?D AA?,1 z LD; gJ``@E  1?5'Ymf8Ɵzby!ـ*;@BP`MI@F (DĿkq? g&./ RK`mL ~!$;0Bo 1t^̄dN_&pU;!Q23_ /8<'GP Ѕ"X:K0BQj @ĐL&83ēooC0wQ oG/=OœS@"ـ*[@BD ;m@ @L= o_Zoop/,?5-/W_tLAMExـ8*@Hr4dJEm U_oÿ@^'Du~DpϿLAM~90b@G&W`$Fl Qd E&GB " ~(U~ߏP[vL=Py34yY90Dk@@YbL?  _A&7m5 &oWvg}go_ '1~0\_F ( XQ0Dk@@(WdDG @ ['V`{!3o $AP D1@3"~i) pو)0 @&b X@K,0)OO[Z #[}XD&0=i)q#ق {P4P` XK,o Y0߯F<[}D/'GXue[~B'vـ )0 `&PW`DH [&)]XM+]D!@_7|t$o_S67Β${fS@v$Z`4Yf4I-c`f}?忂&Vc߂m07_A@%[M"b j(zY90bP%&BAm33m:AX9+m1WFQ'mb j(w$ق@$@P[bD@?m@/-WW p[-0u?¥> O&zb j(x:@P,b`Fl @0a.' #_lbA3 7"_$?-hMaã")P$:DPP$b`Cl @!?arA?BێXm%?,[ gœ|$؀:d0'P,^aJGl@ @ 1k7iLao-<<Ͽտ y-Aзɦ{׀:$ 'P,w\aJG @783-_f7@M27B _['L.7oʆǯ}0 y8L0GPYb@`F, @~0~ !2 R &GD1a%4  |؀: P[j@4C)@`CcoR>0 47ûs%.ߧr#Eo>w15 L0P#A04t& -h _أs?38?, =n>  ?LAME3.98.2 o߸L P[b hI,  `CgBW!HMDh'љKOEWDH*M_"_LAME ` aJ y{ J09 HdG` (~\@y@0Wŷ0YgoSQLˎN u`Pa ]\`@60h&  ,#?@, "~W/n?)Oc 7?/Ŧ W: 'Q ]ZfH@80&QIOo@/2wS-ZM?,: oOLAME3.98 dYPh{PK+@PXP+4~_,P*X4z$+:GBsCiK1!?J { _T PFkP Pӟ'yk?o?b@(oi?>}OQdob j( x#gR|_n`4J`DlL bL@AJs? 2 ƿ0x I` zG  }:ceR_s (JpAl HU#BM4DC``??tt&k;K烟SSQLˎN րR R]m4ˠD Hꄖ snisb$o@O L8_q=N\UA/<Ɉ) x:"<_l4JpH DZ_;7o?G;Ao Z`!IC?/odP @MQR_r`4JpC HQgt$i) |L6=?_/+, {`PL @]q@ G@ H  Bo?Z\#abIuYb/$P v]8 #'Ra\M+G H0iOW?-8/@"yb~hK~qo`c _و * R0a{NpGP ΀+*C gjga%T `cp /46sW_O  LBL_^ L@GPXA03&XK:O/&Èێ~\._&  {RgR\L@:  H@(`L(,~woyg _Y9CASSQLˎN րRgRcf@@J`= l H`t&I[| Q+O&P3<4&y9)_0SQ@րj#*R$cZd@C Hޤ[zoU?~DqПQ4 ɤN׈6"ܩ!ɦ :gRc^aJ@:1^Tn  &1T?g`7Ol?O Tw #b j( ohH eRdXa@B0 B ʏ+YH#B5N+& ʌO~c7Qm$PXR Iu a\aJ@G,D MaD"Xu*agb&_SMQ/!̣_Gw){X 'RT\aJ@G+H@ "iHu4S?;(U3}H.j(fODo2^[ +C u aNI+D ?X(JqĀz0xOBc15 za@$  Rad  D+ H ;?uvҘ0I ӭ3L_n qYj R\ZaJ@K+M@47#AhX(&{)Qɿ `#0ZRC)7` xY: SPcyNEl@ H31Uv#0 7NC^÷_YOoVo15 XR$  Rc`JDk H-?#o@ЕobPOXKcv'.UŸC  Vj `؃^ICkL(FϴA7U)?"0&;8Q_c[JPɈ) րk r` Z @IkP`#=> !Pg[嗕T_=5AI+X-&  րS$!G`$XQ@;4p\QʝPkNkN }$^4Z*6 .F=3 '(g|Bɦx!tP}-Pe`EkGlA@շ`N@܀8dm 9L*'5 T 1Atfpu:D 'RZMJ@F )H fc%e 73ro8faV0;UX4O SQ@W! %]^`J@= ,@H[ܔ., Ku]7ͱ!Xvw "ЃL!H#}0Fk H O WͺD. _ >Z*7`oƃ&  vU: E"S[^ BjH+@ Hy@w+߬W #\ S,7Β-`{B;Jb j( b`R=u 0=h@ 0!w4 ࣾ |Z7?G[:f\rp\d v P d@DBl@ pP+¯p򾯫RPD@?P8_Gɬ4ǯ-SSQ@ :D GPb`?m@0.6`.6K?UmA ; QF@FLAME Є؀*bqP#w,j=m @̈́ ϟҠ )1߯2(L ~׿$DqoO)e'$Y*pPWb!D-@a=B:y#G/;&ڟ=˾Ck4`wQSQ@#*{PP d<E@XOy?olm03&H:B(!?@bhY:k@PXb`@Gm 6@ _p&o@ 0*?7I xـ:d[@P4bEH@@m@ so( e/oL R^ <&@n!.B/ "XR[0P`aD, )@M_x*oy/!w7*&{?toG?7T ~Z(:K@P(`LIH 5%xN~Eh?н@7pa LBMNLA :0B7J0E@ )K!e%Q;o#k!_O}GiOc?W15|Y 90 ‹@BD`DGA )_pm&g>O,WGd-Q_-󿫭A ރoЅS@X90d+0%Bi\ @B @_"g57 ?|*Qr?T^RKIcLAM |XDBA0Gl z!LAmb:-rT%_?BDP{ *$ B` @?l !s?M'Gڸ^&p_߬o .Ɉ)w XD 0BP_m2jCHI`VLAME3.98ׂ@SBk04b,y^$B,0zBr?w~qE _WKqƂ?}`so}  }^`-Ba`<@G,@?|Of:?| ?Q=ԷD`{ovLAMi@L w^I@@.$\e0a po=GB ;Qw373b j(z;#@@4udE-@|!I[d _ %_}err!3.,/UH}) ؀i#0- udJE0?uo -nWN g_?4cSS@Rcu,ubC@p5P~ @ٿog Pp'8qʃm'7k W_0F?7Y Zb h |)M0 @s`8Cl?+&cDZObs@FF cXf?*+&_GDP~؁>#e( sd=-ԇdoiT ύ R@!dO SQ@}؂SÛ@* q^A=, b YH44Y4PKつP}i048q^@E, AqwA?00Y9\t 1GPSRb}iC- ob(GF "Mtć*? %P6!SY]@* ʦ  @TC{0@mqH7.p X?_?P-z 77'o}14 vX@<D (@k\@G,@?_JG`D@Z?KNgQg![(_MniC -"kb4@ lM~oeL)?~oE?_WD7GotB?2Џ}b j( ЀX ) k` 4E lv???F?/ 7'tn!ȣwi+b j(׀P[ %2`ZA,P @8?o.wׅAOBĿ;! ?_tƄ_MƷ=))Ѐ#؁@d{ag`4E@F@ @$ Mh?@?o7"b MQ#H ??η~)x#Y{P4 `ZH@Emf߂P?o?2̏l0`-~_`?/EDiOw_&_&i&ơo& 0Q!e'1_hƁ4`I ,xO|W/ 4ǿrRO)YiiTM15o؁50m"o~1UAƷ& y 9j08\4EG,43B?PVDbHJ?_F)~wJb@}Q0 7`=D@@@iߚ(8k~&ODz#ѾSUO_QO߸gZb h W# (Yb =D@E@ ];~0C0EߡoUo悋}y"_o~^P tX9 4}\XA= k[/o1};6k6 ߷fɈ)zi4 TD{ZDELkď Wo?zM5C_F`-PO+0 pH*.^v94,7c 4Fk$a/O؛r__8hea7R?_"tlVQ0Pց.,$sXJ@0&/|€oW_@B*t 'ߕ/$MI߿:{{S@ tV:z4FoZR@J@ o/CkɡOOʂNP1пoR)h{ qV,@@+ uPXi%05onOu3}?oKtrɈ zՁ 4 FDmRpK)|GO[P=%~i%]sQ] %|_OV&  <czM*MP=DBj.Oogwhǯa9 "gV>;-Oo/@(Ҙ xbz4HmJ @A`\}0)MCww B)S6hOoG?Qd"@/O|/LAME~T )`j,ON4?@s}AE77O~o} oCOqț?ԘwU( QZ,8kJ@EG ) W qoր*Z[|_ldl,߸D ?Kg?r=Ɉ xS@ZMMJ=D i Ql~ ?꠼ ? _~{W!1( BğML?A~i14tS9jp (MH4L ) n~߉@F~o>?7K aVNͥ@oO?_X8*)|_Jb hpҀ (JD />?@#ʮf?'`3IBUP#U[g_*T eU~A R ) rJ! @ r"9<6a@ I i 1PٵU櫀ئ]M]lb^&ZHŐ'%15 P͙!@,a8b@ 3)( R@ xk\})Bg9ieu+@ a,)@x%_P* {HA *)bE@@06&wl9@r `Y}aA:'3 m15̸P{L)#8` ;i(!k]l@=bܯUB9 9Ty"#F@0r@_Js) h `$#,.D 7h0 K@ImAjJNb&/ֵE0&_PX?ou12) Є  `S.E` ?@cQO6s$څM26n$J\Cj#_5V15 ІL )`$c(:b@ Di  fXsu-B¢f(sUڀOzPX5H-$i^QP)LAME Ї͘#)".A@ =e @%-cۢ\'!hUGڗR -5(_RQLAME Mc `<"3%@ @/ƒ(B-"tSmܦA.M"Ub9F@ ƃFr7UED 45B 3\,M8 v~ۮ|U15 oJ9a<#5! @$ TI(}(CS &+nr[@:g]DﮝU (^[\$f\rp Ђi@`#dBA @0.H ^^-o^os+C`g,W!(4+UԊ'z6V=15̸ r@Y@ ]ӌ2(Q1J*{= \`T@ [zJSSQ@ tC`i@Hb(.DŽ@ CeE '5NA:"2=)6o?Or,O4 $?_K|7(I`iU0C( A9% .EHod(^gRS)bKeʽvAZ.iW͟ԘI!i0$"&`F-$Js.bvaT8,ۏ$ B@D@cNWƌ(ILZ>\dr`ʩ! 00b&`C$ x\6-BvXlI3خСrp53oA H5V& nY@5F h2H2Hǒ8/ 8HA#'…1W BջRb j(e @y@$ !+XOFgf!]%64Cn*؍9-+Άbaf{)15̸Ƀ  Y@=!(<`Anj"4P |5  8.8 'ݦ@‰Iߣ& xɃ y@`T & @<$LI2?Y0X!-}HhЂ$nײZē# Is}~ړSQ@}ɁY00b<$`@>@ ,)WGXjHȢٗKB)WqޤwbA1,sl~-14tJI0@b(@Ce @+ S?tN(!8M WߕP?`|Uo*eLAMEKJ,0@0"$$@@S =#˱X"mAw?0:Vwjj1Zo~;OIct, a5Yf6z@I`i@<" ( `8'@A}ZS۔$Å"PBeTl)[=))e'r y@<#& `R T@Xa2` sz*}53?ԐfbzTZhLAMEI i@`C( `L$4qlӀ1lUa%Ҏ pi^Ϸla*̋4+E)R=8b j(yI 0<# (@I$ѫJZU֏J.su L&tT4V pEz5  8܊*mJ!0H" &`Fɒ`7H=4l3T]ҁ M1 Y7Bb j({Jy0<` & D&ƌ41Ɲ"M$3mW05X2j7cDI%ie)zI ">$BmhSG"m}Q5h$tqUW(FR^?\x9HA1!($' @JI80U@,3!Hu:z|AB30'9Ԑ=n7aý[$(%mBƤY[t 'w9RPG>BQ34Xch)òxFX֗y>5 ;H04'L=% G0np,hL %ǶTcL}iWԂ!FBM)>l?q€8ȠnaQ;T@G3%+u&sDv?PլI*V 81*&8Ρzkss:fWOFRM1JbX[tp3Wb6~J֭2,w|@]RQs4$U?~  Y_#m9 ^YbM1nj~xו[ #MI(߷꟔{o A:1ؑbԧV0Yuc%޿XZe.Sr{;WNS -BeDg켫Am=)lQH~3> jW4[UN2M%~s~CAڿTR!J$:)43V+R nꪩ9}[b:ցoF?W!ݫ@HRIKcXP kMb <BRsiaIam9l8"*FIEix>@OR_Bur\bI>.Òx|-WeDZ8֏g Q\CC_ք&|~S~?_W#åXE3 G yA,˿r# PZTOdHT1qB gaKah4 Y+BqskUЉ[GSĝشΑ!" )\'$I+}ۂlMּd`` k "b?ZÆ4m)`mAb܀)odN/Bu+QNQ \ۍ(u$mQp`-/B(i=Ia[m==$%ؒ. }.OT߀ߖkp豫WvXq 50Nt(#` !㰨''qQg@gJegAؔA"@""$IxDZ=Q ),sB6ЯY +p$TiAԢN!ѳzBE+ 4uk=i!0"w'mPUp"RM3Df%4@MVKMԷ⸧\ }lGS^t:x /.eP 0QJHK nMVho^Ȉ J{ )Rn;Kc9\8Ƚ>%M Ba e`a}},ỦՐI%;t@ U|}~F "B<7TPԣZaߟ~k!]ߚrI$&c 8ir/ aho?H]+`hmz :eEQ?2&Gr!"J$8&XBq g=am}5$T4|@13  Fp5Ʈ#_OJwT_uC7k~!AQ#݉@ cwEܨ x yc䳮e cHm"/Ϊi7֗G^oR"R$:> S3߁yiBgQ+llCl_ldBabwT*<1?-_(_w5LI(R)kG` (0sC9%ᜊIږsn~w_l!Y~sz%YCԿrgv?,RPܞrո>d:rm3B3` g=Ka+l}5lA {kH⹻uTfξ; zfpV}}g6@_*hC'E5C%fw=`ģc~DxUQҤjý!ZP5e#U60)KB $e`a)l9lsklEϕѿL İ 4RV3sgQ0&íO[D:EAbrBm=G/:1g] b.Ԧ/pM֝y} ܤY$A^!^ng'lړc;#jp [E*1T/)\ܨD^ܨ|ޯS~?WOEA$(+A1Ȝ# )jb$BiKa#l&~WNY&B$H0Lq$}\nwG'jƲwY2+]=TZo_ ~2Fܳs~RJ(5 Jx> Y2{B㧀 cKa.l}5l(.np5/9D^~3}Il*tٕ#2"E4('72=mM!b?6`,+UeI 3LJjvʠ ՆX󡰋:s˻XsHW[cB, "Gޏ-[VuP$$HRI\9~+\+ .bQs.}Yp}v, $CE}BI Pcޏ#p!4H.Ic@xĘйeHa$,lCfE{x~?%l /ppnAJKDq޾%݇\M/#޿,9)$TK\١'*/U}tjzMEl/u+;<< Ab⢥TQnmKjTnBŮ 4caKa!yl0T(=kU,L}$aR(;Oh^JeiY~>1YU - v !{޻K^OgݢUkјF6QD v j#"&"@Ij ԆN pJ S=j/eBaVBC ea a!lnA'>6_S{wSt%Qpeܬr"J$/E2Q^p 2X4R)!Y ?Pt?Umf ʯП"o=zr2%f`B Di=Ka'yl)䳦"Ug!Zz0D]=PQʗI~>~WfԈENqA1# hOyhRU=5̠̂XroE@Dwq˪YOcRURIu|!ʏk^X%FyVBޕ ,eKa+l)l234mL)aSl`iIyig 5{WvsytKņ6gZ)M2Qhۅ\)YgGh/d2NArDBHL*d=KjK2wjp|.@eda,-lќ=aچ/{~ AG`Xz%mܿsks[j >Yzԑ*IS$}*ĤK 8$P)Nx fnP?/B iaw-lqEx F7&N5J/)hq!5Q SJd+?[Z!E7 |tEcb?[B~_|YΣY$F2J):I6fQ+nLO-2b>4ppBAI Deea&,)l@NOr!2$)r7EwkXct2t6áG_?/տ[xgsDD (lWQp5~QydMp#(I]=uVZ**MIĒUf{#YWy (cg5tUʀ є@&"St^GId̘)0bVu$SPiQcHiXтipBy cHa\ltX^̴YuD`tk=5a $:!Wc&8 qgb;?[6lN}n^.œ~q;y} Mt`*_Y"U%b %U0'fKf#qDt&R&0"BN 98-Tguys]@̐ gaIa -9ld (meN;XI&Nr\XֻSǂul8z?8.+.I Ye$n0vcGA2 G7-v@P9)!s=A=yB?ʿ7xR$e\UWB]m 0ia-=,=fǬ,X*w7IE*0\[7JE~o>Hz8 %$^7bTp>aZֹOv[*k%PΝÀU."z.)#B\էca&9l_]obpAt^q0""2SI<$9gbPH2~ZE0'_zq1Z'YP@*ÿH V(Q>){J9@PuـZF_skIY$BHED1(3cdck2tw\yPs- nBq aka~콜!lߧi_BDQ-K/áC~X(2gq2I$L$7HLاж"U b赿:?PZ Fb!%e,ზjRgm4m}5@SZcFyJq_Oʝş7:忳B-! dgɫam=lWFb!"J(&"2,Ep+DK?DuRA8 &)XXTXVov~:~O-@HV:@#j)ֱnZ'?Xg4WGa=hr!$J(,ũB2call!)IZd}EZ@{8j\|q0XXϩ*xGja !J(0$x4%=bϒ}>^ IYsAvӢQIJ +n`jo12*fN9: 30j29-0M"V 2uIoSZohH@7NHEtđ 3~X`i@1ڙo88gڵ9@hʦ ea,}-l9)Lk`S_Z%5 k *( *ren/a2R(&Ȝ1]-$9IL-Q:!X *; t 39:E&ȟ[rA sU*~sonDD% )xգ%24B2B*j He)a=l@kS!gBy&𓸌5e FIpAgdiAr]$S̷ܻz6ϗW# ף-E o"{};"""H̢VGUaYX:,ò6o`>B Xe=ia,l[WGY?G꺂5e@큎>aa ܖI㿆_;o\O=qo^7CG?<9; @Di$0]Gc%e : fD(40xUGA$Kp&(r)=WBרe`alW\6e,G/>&͐LD{dt̸*]K"5%R!S_WCA/gy "SJ$RFre <#B)A6LwƁwL#)+9C @Q7zq\wB 9ca3ll }[xPOxvkJnڀ "H 9\9/. [B鼠 'MϯꅡR.\ `G<1k>=ɘyG3;MjR! J$*CrnN O~$Ov]ǕONhH&_Z m*oJ:veN5d+HI]]A&L؂J.o$T6+BM疀 e[@LO%.[m΂!%U AO;L~>弙r"sqk{P2}'-r=e@@UTr3Cx`q&G@N,L~0+*]ݿou=^[ɋ@ iIam=)l}Gݲ$ rwjR!U S) GT N~ҊpWUݭ\_[4)H&/E;~0ߖ9b !)flw($M%] ڦ\<]溁)>_Cq-٩:ab!B 8i`a%l)l$J(%rۖǹ` Վ? }|V$9amK;~O/r=%@(/ɯ-;˻d+CL7d 2c]__OŽ?|,}S?iQ (.;чB@g{|U$ /Ժ$Pl.l,EwI-_Cje@l>)B<@q獀ca칌l!"4H(%~uD+2 uޗy51:,W,x?UD(xeRn%1s--2<یo])Uj3Yj#*ꆄ.wCGk {ى{=y|e7Bj DcaKa|l,\o<hzyyS8זnd^z lY Z $"4Q.pמ rCsSC8~*iuWa\A)<}8@Q( Y'Z=d@It; 1 {xtM?B  ea a}lj=r:M -;iQP 7 \!vs򜡼Yr!!I$:"U6DT“i:=(}}$FaG[!ۯr !"J()#3H~p2K=x'<Ū0֥V 5B̉ ȿe`a#l*m?ʷ'sSc!!&0Zr7޹lXqF6/&f_ꟕIVOwQUlǨh#$jw9P&CKt+`/H0ƿɯ}ORߑrBc`i=Ia-=lߧb%,EaHQ~C 0T> и"(f"KQF//ܯGG=r1fPCǂ}d DX\[BxԛoГovR!"RH*BՖi=Ka+yl9@ʒ̳z䶮a}/a q!&>wN 3_US"iB?(5P&`#~ ZDYyЌRaE&Ie󁔛^m ( '5-Je%QJ#jHBsXeKayl\FN9p"Sn^("YB$rJaniI0\+]}̷z.sh2?M @ĒM$d~CuO{75Ow|Zb )Rw8%x@IT%uyyNEC,˛{@\ɧ eal%lZ }!#n\CN-=H],˲= ulHq2I$($Ȫ򍰻9{^)q*FM89EԢ]/wDĺn9ۨ,$Bs$%JMbbI3/fSBB a A}5ly ƈj60S!18ܛ̭ **ETtPC\xIo&)anz )D~{?%̐!5ePfWIdF?F^v~s.cIrYzFEN4B4 peaa$),.޼Njto/:g!2$&2DnETyɐ#ɖ*MGǒxqnh[{z|nMX@,=CQ c Ayߏ[J6:YN?Å뺎 k-PٔJB?@eq "I<%2zwxڿ󸤸ӚS}#"vUJ HeSL2sK$s4rh/ض-؈iC]0cﶯ.1ZۈI!~1/JWWi(Ҍ1eB:+eDalVmab *a40)Hf}i J\;YaLux R $:&5#Qck`28y7:R0CT87uV[L_u{qWd{ I$I/*b4PU;==Bm ei_,,{{T W{:-7͔osna[%qI)\uCkd0 'Q,Llhnp[8uzJ \߯\WO3%@@PDQCn )!2=@lYxȄ7O_?@b gIalj9GG4S!%j`DǪL$iRy R~Ѭek4xb?#ǿ{m |G澹!"DI(QZh̨q'_x*m֙mfv`RqM3t 77/B~CgMKal_r ehS$VO0U+FK,^bA=s^j;B1d~Bߗ_S'o=B!"J(7S R` VQۤOX+9AYz 75/F|18RE>T h~)Ѩ1!Bu^ 0eaKa콗l $&'+Gjs4 -sr1L9nxieL )_S$"*c>" L2b.1ݓDifH8zaPP6{ rBloSplqWPa};i"$B>0c̼aW})l|fʪ>jhళ x37&bؓ2#*` B(%s[W}+zwog hiy@HhV,sbJ!TˤnwE/E~,| @nZT ó2I(L" YB'#xPQBJ0 0a`aujsgDLPiP v!]z%U lcV+⣨ #o0t ;-H5?t!tgk7p5U Lyz#ǒU,[2QB.sxBȌ gaa <,???<ϷS 4$&a3*^ǂkNrNήQX"d*N e~_MM:|m0(s8k&Bea,lB"˂%U]WAv4D%+w;\=* ]z%'Vt VZuW:"Wꁽg  K1ەE~r S nV_B/}>ۀ!"2SI@a e`a!lyl<%2&_ Vj__TyZJ#ĹVGJY݊h6ʨVf*v\6SWb|P81} RgfD@ Ы֤98Ds*E(2Yf#tv@V]52CٙP 26j^%UBa՜ 8a`alhȘ:bR ,mOX\S&ہ *?bP+{?a9!鮁8xu˭PYՈ\,Kّvލ@ZTs3UؖQ>\ J#a0ɤDu(ԻBt hg=+a=!lңm)5G~WaU,K[padm_7QtUw-'{垭{zبKIOUE%?ں{;ܨNJܢ7 fF:|).=dR]]{[yT(`wB/?B݆ Hsg!})$wAJM#y#B cIKA&,lW%f{{?s$a&aDb=]DIw[i|'>뾷> a SH! I r卐W CYz~ ZmjqXa–˵oQB<_G͏c(*B+ @ca,9lR*}jF5u `  ((b[WMA%^+W-+)nAG $CDwmVֵͅw[RrBAacV8ÔkUZLA WA5MT~}cm:Z-~_y0@o[8ĭ@ @e a,}!lStPIeEn:`hQ8X3ÖDː I8Y>#yLs Ԓdz˜8/ %NwpԿrKWs+|Iv4wj29$"&8IJc(aaBQ'΅s?}ݍRBè ckah=5lr5C'_Su6C v{źOI %xgM)sL|_wunYF9kcb/&-rȄH$]H7aІTWԦ~Y4:v{d&m/2eK;L[՛ bDFvA +Do|}1(y?-,0Ք1}{٤aX(;|uӝBi`a,l}ouo̐"6C%qMojoUtS;kS#~yhC&N?Gqp4SHA\ȟ'0{&_קD׽..ቮ,W_?>p=:+B ìO@, \c`a-)lp J(#40{lqX7` 1mtNLFDz̲j*||0p^o6^f^ 1"ʐIUXb@DIH|1jAGэY@K1>~iR @9[kBcaKa^l|!l\gLlZ?ֿ8z`jc uMIjj1խQ $:+?;8%I8iݚI~mkP,YN 0$-3;`iAJ@vP#V" tGn/JJMbɝx3޽*xBB e= al}=,.s=EQwOo0l橧m-Փ!23M .W _] 9ʿ*wb %e YfDuPR'~5wiSrο/ ԓWWoBr }g!llz{{;xB!UJዲF"^#;=M Iù4cq:gzR"iWZu0o{LBB5Kj}E? XgX}tZ_yc=~G wtͩqB"`cLQ)l#BN0Sb1O!+wajRDI5wq z+[3[ݕR@P!&_)U::ޘHC#ܳ<swWcRUoIQwXgR (!Q4g*msBU* Lcaal)l9) kk瓴7\.@ ?)?-g)a17x XG1ca!9l=Gp\ԲNBܥz΍$p"!2RI( G؁,?6|Jp%U`_uO?Ak "^',P65ckrPfo?~#%oinTB'M 0cǽKall⽾O|Gh%P?!:"[} [>*v@EWP d/M'?{| U2ơe7]J@Bkg%C$ UkTĈJbPJ?o!"4BřgalM*3DnM׮㶚h#z?;B XxPzA3)((GwI~"ģ5 N+.B< $aaKal}l u[~9wiDG)6񳕭:(]4HǍ^ϭB:׳9oEx+{B@"DT1 ُ&5%_!GEmAM)a\0;mRx\teT}W(3 z!BVdgLal!2JPܓ(+mrnMܻᙩc-ۤaBl _ϑ^Bj@HCDP§DeCF;'x[ÜiVzG$]H#WhNw+\S3-}@t cal [۫&`R(#sStZqX{B~AJFvm[ 5OSӕSJB^CqDXI# \l,f^VHn3*-f݋ h^)y@D"DQxMEQ| 1m002wmΛ lw 0D4Shz\CB e`a}l(p*:U\ݫV$tOYq{ II^SR m.>cxkQ}W ;|YA8i?:93 I"3 }rG?:3T08 ɣRKHWt?BR֛ \c`aR,lzy.kY\GgwvQU[~-'Ó-:Skչe2~kW0RE4mII[ֲy?:{?+̟W/T"$BJav+,܆W(ȵoOceP4"Pl?_xt_}|_Be! iKQ }$t\2U,ŨcTv(b!XXԶrSYmlԛ{:;y]=7ndf$IE(DDGL%=68wșvXt?}I _an{W+ҭ'r2)jPKBٗ |cal ԑ9Ϝ_q ΋q6_ jY=OrD n0~9|Ӧᅦ['nY@hH~7GLI d͸"JYn\wV_>V1eM d)(@ ca a!lIJq'G4zDdDIFD9z)wc̀ 5e0\:amaU$±p3hN"W3cY'aKf$#=u9n ($b#(X!X{ ܩYwZEnտB Ƚgaka@,),)@B~ ԟ;\"5ePThx^YAyH̯oarE+`g뮉|}vENPR$'AWAꅿ?y/k"4K̭˼3-TNE˜,ӆ1d(D- f:y_众p "4H%Bhe`a"칌lo@X?}V"Gf0`tȸ4G<6t}D2+#2.+t Og=k/ywHT=wP"BJinWZKgh,_-|)Rq"Mtm@eO:YcR|3NFN}pJNB@ eDa!lK?Pko|]bv%:2G" $"qx?'8vxf~VF@{$e RGi : ^v'wQE` :{ I\viq}_~bCL^3B Le= al}l߮*vTttj]5KnȻ9C_D5 ;W/)@mYj݋8YGSqq<8Q:I꟔/'Wg9ߪb@dԻeMۆeGwɏs 74iޘ{'-e}8av-e:Rb!J$:0呹nB#gKa$,})lXT{ ES}'bP&M ]"Q'RߒK{r D(TRI+3ن/?@9?>h>~ }!L򗎩2|LAj*Qt}n\ߞcB8(ס+vB4c`a%콜lmA^p ! JH%P8g{Yn#3^.-# C"?Re— pzFsG;A)E{1J)Ry`}iOxF@ cxڧ#%"pޡ1<~_L5iO\72}Lx5!I*BRea}l e2/Suju7֫1xjZ@8*L]GEDo5 2I$&?_ls]@ۊŻo_%Q g4( ԳDOky֡@SЉv uo7CЯ9yM*YTB#` +?$3 c 'zSB Dea>l8)l'/ԲjK_=*ڀ5Us\(l $(*-9qknE?s;?QY .6S^Yܭܐ dg|j\͗<hRYq{˜4pȅZ_/XgB4e8cq[w mYkx+a_M_A]GHTP"rXBzFYQQ+3j8@ Q TD?BHeMIay)lRq6fPQ8ry% C^"u&|gAcm:c炅*_t֑oܐ 5_" n9+mmϷfr3h^\rLƔP $$;08uP>m69Y9d*-5LXfjއP8 B; @cLa(xl i2a7IZ5y{UOI)Dbͱ$U3v=ۂ "H$H >E9Yɮyf5~0wCq%8pߠ[zv}O]촉ٱ{A $J*#,r eo 'Bn墀 e=a,=!l%+I;3}=* z&嵻S?v:b I$8&5`B ]3#)/:VP=; ι9Uڿ=;lB""Mugu.C+- ~yK:@)B i`al,>}ȺߔvWWPb!%U R_%Dayrp39f 'fMz9AB|-V-a@UBj?R'RJ qP~%`ƪ=]h@oEY^ԷN@J gKal)hzQ!I(*)ێA;9 @K$`lj\'gwMjy߈{KK[?++?Lڐ(╡RX(񛭧-6/ yc^yw"E0ZoපS?0vO庺z9b!"JH*DBgKa!y)l0}b!i]ZLOdyO‰> s4yO'EBHaOwȍlC9aMʉEA%- 1Od@E {yk*4g7,2u0TJF\Q#I+r4̽ug%ӿNB 4cKa#,y)ll-@AZ}ˡ&A " (>AjCװ9wu f0ån9ÜP 8 SHMhz;A Kֶi`<KE输uD%W"@"dQT}b'54-_%̶X=B2 e("B$TMhilfF BYdJ":lQ}l Z?ϜgDHٔ2U:=ZU9KZpYϸ\H@ySl(#=CRBzgLal:`o^U8*3;F7jR6E+FcH35Lsg ;=cgX +ߒ?~*&.1I-H j%I.:`{;HE%Jmx%H\U!A@'ga$y)l7{!pxWZDDߋ%a!SH9WPC>EtEJy"oKsᶱ47JuKy!j2XXT rj +Tp4&%}Pb )DUB"$IS18Ep5*"˩BNƟ cKa,l{ iuWXG `]Wը~"tFc?ՇR"I$&"D86%6A."椌ՇL=0C'KW}jb!!"I$:%/ 1gOLZpHkB{kLv[eCSBӓ e a9=5, z_7ԛ~W#ivbP&FbG˼P0ߵd$cZ&{Su3&'ݿ!W5?*[uܩaՋEVu2&kny醓)˟|,DPR_o%#_ݫB@`i켩a=)lB P7sI\deXl׬Hbyծ=;ɿ%ߩ{$"B1&"LG!6WɈ#{9șg7F?_}\9b!e\&ءGBGDe̼a친lLLXLY=6*alVÛ X3 +g?񍸀ǿR~!FV\n0/y^ $KfGr;Y2^$@ X@h̢ $aaa}=l9٪v2acg?54Tg<>}0I 4g ?5!5R a>q0<|y@C1(Y/mO"#FƆ8ߴ$9"&I$[M.x gG05mJ}E2`9B aaQFll˪MXHw#~#ː0I%1hľYÆ[G=KY<y h_}>Orb"F̠JHRF!@Q eۀ[wɺ,yBȚejt0/JBRlea,l9{/b!:PԞr1D=#$VIX<2gtL;IWL5ɘN.ZSzUwRxs/G܁ E®lWX0k|?&)C{ 1y5Y#bXEaR)縀קB%BE^̹c`ax)lq6`aM #2SH>C?|D`>}SlVUdB0Wd*n:9{(IccOUs'q9m-0`hO!ZYz$@&DDxMGjDeX5l?zgd]R3nZ/RITcVB4w ca^l('xf 3DJv^˺Z#q' &bڦu*[! $/CS*D$şQ׳Kg5}8|J"M:jKo@yD`u}fvDHI%qrlAg |B͗ g2L;y%\g俔5~]z;r1 @_׎eѫaqjgܒ {)ao9m6 YfYժQ9aWtmo?8co~:ߖALE9C*ހDXo,;orv˂Xja #-' !hb"RH.Cv!2cB|ثeKa&y)lLp{2 MԿ ǿr%粪BT"bh8lcR0Lq&]9\KS*WMJQ%ABsde8wT'V ~[x;KLK.zp\=j&h<4QQcʬ^I5f&dBh aay)lc׻ I*D,~DPin(Tq!! H0SÒ(&dny`qsp.%Զ2LzN Jgiى=&{(**.0T'RvJ:m@@D)<璉1jZ*F +3ut_B eda,=!l7%]I;b<AMD}MT ;xWv5U`RʤQbO{s *ƣn1*|&y thaPt (5a2W#.;CܦV\tmsT qB٧ c aal9lVZK(O~)?C;Sr2 $:xe!1?̣R@+*x>-twN@<+x3//J$A %ғ*PG_SJI YLc?_z5 !E FNXSRj7[?6D@_ @c`alΝiEk6o5*j X1`fb "RH,F3L1B,.uޡ_ ݭe9P&LgUݲY)}cxvŭ;OPGXMa}a1DC.H- UKyڇL٩B䔡 aa alϘz KS>+\h* _8q=ŤyKa<%%!$L_0XJ}q[5's oίGvj;%HHVTCA36Pl9NORW&VU[bLiuB ga,ll^Q=E%oS&忷WOER ڀnD_cM)ID8:ZLcʍ XZS&Q@Z cNk/zJWG~"RUdfv~ĞpObu̓.bG.w,dĻYo[;~Rd;BHXga'칬l;ut0R!$VPL]]:f @P=~qZ_>ܧ,ҞʮyaT?ao,O?ג $B*ʡJ!da<6!>fo8m("3{,K ~K%j*Q!"I$(,B9pe@a친lɦcc5ܶH z~7=[vm`T6E~Boi:{wy^JQEA|R_8>4?°CNmrYcyذ|w!BԸZqJo9͈ǤjY!gNTÒBc`a!yl&=֨P  $()H~ ܀sg C p%I}Lƺ`tKHaVZtRVcZD@UFC(ƮDD*!4ݨ(,1wu^2}kyx{w.ʊsoBh 4c콫a=!l;ƔQ-[ZWf#[ťo=aST87(?*Yl`}ˀ2I$*+k3g/gGD VepBG)J7_REE}\oKZk2oו܁2I$'  Κ14Y4+Mj'@P' aii,}=lHr$5g_ԫȤ5 "MSg:1~ Pl}0  ^a497y %]050b2"+*1-[P֑R59f Bx eEam#B>2e`a$칌l})YGHIN>HV*p>@c\lTj0K`𞉦ٽcg*TyKP1PV( KP4ʼn,;ir@@;.FB@2i`aTlBȞ C$ `!#B? . %prey.orig/modules/alarm/core/0000775000175100017510000000000012250331650016035 5ustar guerreguerreprey.orig/modules/alarm/core/run0000664000175100017510000000054312250331650016566 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Alarm Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### log " -- Sounding $alarm__sound!" alarm__sound_file="${module_path}/lib/${alarm__sound}.mp3" sound_alarm prey.orig/modules/alarm/config0000664000175100017510000000052012250331650016272 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Alarm Module Configuration File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # file to play alarm__sound="siren" # in seconds alarm__loops="3" prey.orig/modules/alarm/version0000664000175100017510000000000412250331650016507 0ustar guerreguerre1.8 prey.orig/modules/alarm/platform/0000775000175100017510000000000012250331650016731 5ustar guerreguerreprey.orig/modules/alarm/platform/linux/0000775000175100017510000000000012250331650020070 5ustar guerreguerreprey.orig/modules/alarm/platform/linux/functions0000664000175100017510000000111712250331650022023 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Alarm Module Linux Functions # URL: http://preyproject.com # License: GPLv3 #################################################################### sound_alarm() { local player="mpg123" if [ -z `which $player` ]; then log " !! $player audio player not found! Please install through your package manager." return 1 fi run_as_current_user "pactl set-sink-mute 0 0" run_as_current_user "pactl set-sink-volume 0 65536" # pump it up! run_as_current_user "$player $alarm__sound_file &> /dev/null" & } prey.orig/modules/alert/0000775000175100017510000000000012250331650015120 5ustar guerreguerreprey.orig/modules/alert/lib/0000775000175100017510000000000012250331650015666 5ustar guerreguerreprey.orig/modules/alert/lib/prey-wallpaper-en.png0000664000175100017510000026452312250331650021754 0ustar guerreguerrePNG  IHDR5؂ZsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<hIDATx OccKcߍacۘo+%YBB_{HEde;Edױ̼_1sϽ.||}s{yY'oj֤ +fM^=DD@"…!rVE.n AT\ ˩T =\)W=S rq{ȑ,ti-XNɒ!4,xq93XNDrq{Ș,paSrq{H,`A/rq{ ɓ=Cʅ\Rɑ=J-rq{dɂ\ׇ;Ȝ ԭ v1#q; A:n5kBKtW;H BItV;G:n+CNt*V;H DEAM r &GFn5`u"#R &␑[M`5k"#b &WGFn5`ȭpaU[MXD*ȭ@[M|`QQȭ&Or向[M\`e #9 &JFFn5YB#( )&jצ 9*PѢ-RΜI+}8hݺ|R(~CBJDFn5ظ% ,7uj ~O07Y K|^i3$W/;v젋)qv i0z)^F\Aϻ넬+|KT M@k҉t^rM?߾=(P` Bs=!S&J+Ebȭ&sf$P{4}5Zw5kF'Gy''MMhڵixڶ-\SUVLVXKv1~ݻt4} t\946nL!K}?ֳ'o.`$&ҕ+G:fЁ._6n6!%8kWZ;w[ \ƾ%$"0H _>t<,-ZTO}֯3M?bւtǼQ8]gܸ\)廛6{VZ?|`̮֭yh\?1c1S }kISO~ FFn5!!k@ŧ Wv3;wf6Z `l%IUTNoR߹"}g&Įr``0dJqt |*P!dV.@w{WN~+WX8SMt6gN~Ƈ mxl=s6>=œCʕwyi;͛64ŋ4t(eȀJL| g:(XAdl[H^ @p0N{c& bhтO˱7Οnݜ!oo2 52r &S&x. $2ޤ:"!o4WKGf9bQ#Jիst4!OdVQG6#rB( k򕷒Wٓ&&XVb,rݽ7o^ KA ӡ}8hti:sơ;ȴK>r]XX9[\pQ /;02e!޽ȴ˞=r*Y[Ȗ Xؾ̢б!:bxEwٳ!;7qQ^ʼn5t^$R2T)pZdI$@dobM!Hbyo_CdϮO!cǢ;$VR"㣏ZsJ6V/c^  Ě}{"VX?,1^ }KϜk@+lP@Rn%QQ`#GZ3&ƞNݷF:T'OX7mjh)q>6/yu?=m r+a'~;\ 2+,ZN] E @ h^)7ƅH?,}Wk۽¿U~&'ju[GR`dJĮmXGmn=tن_6m8aHoulHCovVk oV2bjhfMQa' @ sRb4mӆ/!4Q:r눈@  |o>#3HvD` ]^?9`!uR&6yuC ^RkvpG>\{WDK9gp3g& s2U"/0KHX;>b |7ߠ_ȿIk0\yu(@ zɞ]_yW{`J]-|ǥ%ΟQt@95RbE֑/腵P` @h(p]hmI-9qRB䈊B^n@CXP7 EbG@ƍZ[Z>fM˟}T>HV2X@ :D=pW{`|y4im?L='O tL֑=;,^K`h]4 -%O3F\ʇ04xK#/Y!?,֔X xU?v+Je:4M>`@%J /P0ܹbMy f @$:R%-u|`hXC^n֦UO,p \nv{S,~b-5l2D:2f@ DG.ƱcMr%lϏ/}KڄW i F^n!!`uK8 }*T̚GFB@Ffڰm@oތISr@ cO?NsV[5#}ѪjBk')h "/ 0SOZ]K4}B&:BBԱcGvRH [C .@>HlO5͔)#7|RӍ hlGjn u@ T7'u+=4+ ,YIiM" `adhuwFk<&G`5A DKgh`DG9:ϗKNi֭~Æ+ 55!E`Blə{1^B0O=o'PXZ:u`Oof KtH-zu@pMxA RcfѪIz0s-ƬYVȟ2EMh&p @ *gV5bfgF&wY?z)IڴtZmLΗV.֚o"!Lz62ixʝ8`-KgΘWSZRxݨ"SEK_#5ʕ!dZ04 C%O-,KL Zo:kվ`S#5!|͛ͭXNDYB$oYcNJ-?LUbxl6({,Pd1f 5DEA Uv 0em#3طM p3/Q/⪉a>o.\ w ?5X ܧLڶJ>yڷ)F|B[ gnZi]b y\>#;H%ov5ksZezӟ=K>鑢hQ2cG…Śl\S.s+(U @ 87ͭmݻs8DӤ q,~~|lX%&R޼HBK$Yp 3f5=KC*9 WiS9*@ nzjYիbotX-*V:;`̙4!G7% d Z{]ʖ,Y~sg$;~/trqvk7(8˩Y9+@ lZ!z6+NAeJ}|*S%@tCh`*\XZygmݡ`7@cС*5=ZАyyp8'u,g̨{}}F ?_,o J1Bg+unuP4l>mw$ŚS'2ڱϷ!&M+\g@ k( KH[dŸ,W˖jբAkkxl@SCtүO3ݛN,˔J.]h\ M>kzd7Ѩ^);aW(rtSɚ@7$7|Cxe ׃Giת%='Q_¬r6>ynO׾ #,x~(\BC!@/Cqz#& ѫ;pX18GSصDdݢ z6ȚUϩ[ƥKT&`,\^?|{VN͑!W/ӧL(XnV>:BpO޵K|#G7!|U `0:w?GߌyZRqǏ+o o_²lQJ]@ NͿiۂ-_7=߳GNشI힜/pwm(\ѳ!w ?vpbwm.`d*1qMϤtDJV햍+uwŊ|9<9B $R-V+M1ͯrPy3bK}U"w"֗/-D G7;NBDφ@\*jӆ_v31gE5g Y E ]T(En*XzT|}! ˗FtZivyaʉZ r玉s9:0.]4v&M ȼv[ȝ[\7{'jmU5sIBّIl uq.k ҭUcƘ3gjSQ,a]Fi_|*Z_X6M<"o"ꈝ;:UAzZ3fG~xvp{^d͊D4Yѳ%Q ]Q>.ZDQ zu3_~6B?a>`UE71^ y1Ya/}Wݻ=vZ? Ɇ],:oSW.y]r Ծ=_,6e9=+i~^cy~\>s$#&x. {߭_6PϞ$4it@6 ;ft %|.X5mɓ,gVlgywߥ o9&Ȕjբ @1%` 41:gFܹѬޝٲ{̙H:Ftϰ0>CIBΜ|'/H?˗o糱&>t󈋃'4Dl Cp0tV DPt'4Dl:7=<&R28ԩHŊ$||H04@neBèWYDFBèSY*#.Y(fMdfQ8ՑE"0bcEx88hdfredfQ8E|0E<0ʕCn9sBÈDnٳC(U Yd PT(K*]jצ&ME z%zejՊz֥*URԕ )wUƍyWi׎Դ)*TEDPHj ͔(L,BC!6mhHZwIK$&ҙ3y3MB;SJ<#De??pcG1>6mgI4_iL45k R2uȔ YPgt4Ɋ;whZ2U)@ ҋ/z l!Y>FѺut1d}&&RVyIr_?~,YBV/޽={e4w._t[ ~EO+sռGQK5e˔F6sԠ Cח? m׎ 4u*͟O˖_дiٿz%*RĹ@'2uȐ`Xtȟ޻GŋPBt"M:xP kW UÝMz<ɗv@Pd&aBPt̞mƭ[4lgܻg/M`~t?禟.,~S̙?:dϻvjղ,0+W  |M,u߱ÉcƍZIyzT"oM7}ҸݓCz ;7XᆫfNsx)XО&K.y S7 @ӥ\JK)fF7ԗ7zOQ4{LACݾ`:eM3GnN,%gNdfaӲ=t#U*?^Z,E-%\D IH[Zٰo*~ي9t(wCn6mn ,Xbq?߂PJh@]U>G Fׄ-x0nߦ…!XG֬M6)_.Tfxfb֭C21 qɓ9KKٲ?w._:BCBz7Ny֔KaGfďrk\F5kB Im,5j@̙B:x5ņg-ܱ!x "[6ڳOC EbS!XDƌHM!.`Jjŋ)kbԶdN!Nwys߸|hUX),5`#Y7dB8i(6w.jLOȑP-SŊ ]F_Y@Bp0uSknO >MhW׳'Pb@R7fH &`-y8dK׶-WKڵ_~1d%B; ѣ|g$f SMHcv=+V];.g=+&*.&ӦA Tz ?uS~c36wgIa|KאJzM.'O-1<51fXh_DnNZȳfo:ݻ6TZZO ?J88{ҥ`"S#Y7+K~.ڵӻ%kd6$$x4߳V QQ|-q&}5u'xՆSÆ|JƦM5%Zi@?lLDG mGC p!c;^ڨs"= I'O7R-[~f"Կ?.ӧ%Tͦ{ݻMK97`nՊgifLj;_]p?y4h|]>eBY3iCαc|1ߖ!uԠ9s_~qrC)Yݻ4c+&ז.;y~sɒzbX&RuDFBb9͹sT)0Mg$AffP7:&*Uh6E %mʗYԩ|]> G9zT`Ӣ3mZݛ.\x{[/BXB~$1p"__:Ԕ3@3gB08)Q`?RbF~p4`].^jtlበ+ƽ{\!_C0jՐ˧H%'!S̞ @Pɍ~>{XeHVL (),T  X̙F;~pl"38t(Mzug\7̅@ Tڵ|]>aaKذAt)@mh@f|>Sn< `kwW ևK@%H9it2m(S#]%ԉFS;v_1bE1ub;&ah?#sL:]ʔ99k] ѳ'.l L'wn%w[}m@aWZ|*ᬦ:UK!` ? 2\qʖE.9!p󦜴'-?qM5N.qGE@c?iSiW!H#2|=ܣpqžUCT -8v:&|ő:5`| Ta9y CCR5+N3LPR>HZrܽC[pa!`֬?[7ir(Q|BC! ۔+@=8xPNrZLZ4x0`,XK;ێ]O> @Ŋ!_]GzN6n@i?n襗t"X1BZA""'C%̝+s!* @ǎҚR%G7Pƌ|O)qA Vʕ~N\tZB0Hx8u7cw0PF.@}N^`lGMqGFhR$&С pN-m#h^u_@"Elw- 4Z1`,c*xe5w QժwҺE /u@SYzYsm[9 }M@J[l`>EFʼKW@?y _} yϜIņ FI]q,_  8~<\DZə|C\,㉈8KVӸ~L3͘!K@ ٳI|`Ŋ2ouBC.A0cv$&)*@"iٶmiޒ֟,@4Iҥzm[8Y"_L66';!dY\9gxN4*Jfb7YQ`ܼg//ܢ="e !% ݺEV޽ԡIGj֔֔m+L"J pc?ouCt93Rvԩc8D C֭P31WoBZ3 LxΈܻ؏-SF歸sgdȀ]2qq;DVֱPq͞ͷX{vXK]dg*Qq`b`:8#eL;1x{xHƍd *R&,IX8`{#”{o_o˥Z5JE? oެ('~b-bρLXT,`O&/SL B.Mѵkغqf4Hr v-л r疹èQ D.h}<XІq옜zuź')M TRߗV|rAЊ?Rvz[@~ pА|.g1#@&NkF=bopz93]"N__쒱Xi9a!p㆜viTݯ plݪHƣE@ЄRvɔ/poy|ej$IH"-ז# J @ڴtJ Za vغ#<:o/-S'NPZCIkE)B'flg0tV TMԫ]&P>l|饵;v^i QUYa"SYLJ8l7TI,ZЭ;pء0ZYeʤ @׉C.![[t玳FcS$$9sJk[ӃPVVX͐ 曔j@.[w~G~<%JЏ?:k<7k{t0u|pƦĈ2'C V YLBƍAVn V$k۟P S[kHeR>]&gOoI9en @4jIź.ĪU @ ˪%F99u$, ԫ#q hU+: =(.Q 믥?$EfAaYDCڴ|o3glY :5@+wʩ.]'- @\%슈3*eߒN_3gBשXYLF` uF1^}7y߾u|8Ю< elVUX/3W2}:x呵$wnIZp2fhՕpi ZزENX!m|miؤuB8e"kIΜg-\(5>TԩLYKVڴ@+cW]q"#˄7PMDnY'/W$/X t횴_z_'uJB.Y!.5ҕ+9@n1x?o*uňiq4HZ_&ϟ4 Ne p!!|Gl Hq㤽rQJ<'5S&.mU{?Nbebdl8 TY{P>."" )ЯN^[r<π@K{&A.3c8駟LB}{i]2ol9ENfcDQ@GJأQ 넇#kѡdnTgT@d_T!c@ jMi}!uĖ}\ 6P <(_._0j[ V۪& ݹ#mB ]4Gb"_'^ % Ѻu`A@rH; xr5zZlU<07?ߏ} :!kI@cm.YlxBޙWXE})oBGذAZ/TN;;we mȑzXTNK)G͛Ca:dxSƳ4 @Fj޵ڶVڵ!%T)WJ%] ۚ'Y1~< BCݻޗ2˗)i|= [1gvzUFR$Wa~]4e  ew4.' K n߾T*xLKNjX@L$M֯wn3FZ1Y+ 4͙30$U a -O H矗RrNQ ", P[eץʹÆ$Qa 32 H9e ̙NQVeźur~`H(nބ]ժA<رrF.] 8p@Z~|ο'9]Y $.\ \@Pwi@Dڠc 0,0e6ɱ ҩSB n]ŋC,ao_mlx:U=DF5ofʞ`#Azܹcp-+ x5ˡhQ%lܨ6e )#qΜ2G7YӦQ֬glIǎ}הz@%O;>JVQX;'@6]`6~&aXOF.!`Ɩ)޺E.teq e@ ,U(/77RTXh G1b=&rw) SO[=zYnFϞgj+FyNdȟ@|yrȝ` 'i[a3Nj͛Tuhuѧ1ʖE.9!{K˗)O+}& 喝qolAݪ+vyQjD.6p@`7͉!Bm4wQ(]X*V]8q‹sF׮(U l\-> cs^LW @>q'^C_t-G!hD r08~?)VxӚus4Uhi+,<'}zK[CJѢ)*gU:LyGJ۶3_N02$#FxN||h&(R2dXƍɃ;&-`=mرZgC͛^4h6OL4b+UB@x8rw9OP[->xܾM⸚tܧ];:LqѕF5Kz;yRk3gv[ !wn , !RYG{XFbo YU={yKM @H?Ϥwo9!MA;} NL l7 C% dWϫ Y#P͛]"yT?!bOHKȗ41HgL|c0֯Gm;<%?UfJ\]PuLµs @ѢFΦjVHKȝlYప:vACԢU'TVrɴi^w/_`sGYDTm[bw(_̷1ևvvev)[ذ@ 9s"w/ ͛ӊo|\I *3HH VdD={:Ȱޅ5rhʛVܻ'jwjۚ ؗ^ ّ(X;-n]bu!} O:ťKwT~}^ǏۙYC];ëL9/, SR_Uo 6t\:_O-pNe:׉3ʘ+pLhAۛ9,;rŔQ61~o{%W/?Oɭ[|)|mln3*zի-t-X{zn]ߟOjCY:t?;3sfM~23jUiU۶Ν)<&w7i'ؐjْ~Qpxі-U|VS>BCKG?-Q>v2۝?ghC>KY!AQQT&򇾅 t?mZLk(Y0jN0PǏe!͚6BW3sVBjXf,v`vm:6Gcğ}F|Ó30lтUS`z0k263 O̟~zuehBhOx:ϒbRXS6#}7!@ҧG.5 @KZ5P @.hP??T T*TA.!@4@oe!@CoHP:udIP8dF)^F dF)ZZ5dF)R!&Q!@`APʕ%~P %o^P%wnPe%gNPHdFɖ dIdFɒxqdFyIPE%S&P"E%CPpdFI!, QҦx__ʘbŨbE!6ʔBP~~ޭ):5֭cGޝwߥ>wޡ>}ר}{zyjؐJvD:+( (i@<@PUN;Ӈҷt%/M:Pr:;+'gNz95-; WҮ]d f9rhBBV5jOSvԢթÏuɜT= /TU͋ (&lxZ.t_K\N+WСcU?/OÇɤ8v>:uR/`3r$-] Ѥwڽ6m3bOaOO-[ĉv-7@V-?z_O]o=r8;z5-Xk`@jӆbb{E6Y` ;vPBc/^XSt~Ȯٽ{)11?g5|8MXk;|5Cn] q5̝!kwoOa2:tHί_'Nq ޻y3-^L3g:gOϞ,?!Y zk׀'e>1_OV3؍cG U [IW_^5kh>Hg5ܼydyUjJ=ϛM󤙒ݽXy;t9_|\DgTBB4db+%L6*Ur5iŸ Hy;㏔*WvnE2_?_kyMw6k֬|sB:Es3Nxsx/ *@H҉}>׮gC+v,?K<>/S߾^e,Z?n߶ھ^z Bؼ9?X6vYĉnܲds`ǰa/p\zq<0+~08Rk̙>?.S1uwO$DZiy͝ B 8 :!yANxoT]{:Vzбu)v}'N0^О}m/+[$2R.,sd7˩m[ @ݺiΩu֭hc͔.kGb"M8cJ; /6md֒y+dqzy/ 8]zl""-[*\ުUp{.ۢvmSС|x]Ŗ^>_ީ?vu yMtY?}aCɽ H> Q#i=Sc.=<%jA|ڵ|/jJ;1e [H.Q|o"fM:gݑ4QP:5;vo+\Xi=vmʾb5mQF?ibWԡC|5əsv[\#,wwoӬ NN<-W{K$۫_[TP ۷sjL]G.lvFu+~ T qӞ=$rwRQm_z q\)ȑ&z×Cի r]F,XT8K2eR@++eLEř3wiٿ5:">L/Ν<8F7sgٟ?gvVc\H%KDfv5#)9 oj Ʒz4gwx2- ݗ"OißcdvmB_gQ(xt>=mZZNL@J%3XX] D7@H܏Yܹ#[~'N'xOʜ9h?]}ǏmL!PZԔvrlJ11zZDHΞeg cpi ի,*@M|2ob~E:'W762 zu}JYq4  2f矧UAV .Ww 7_|TOXNĺrCC JJ[! 5EOm![&0Bxy(mؐһ7M'2:yH @gݽhp{F&]%͛K ,3k5];mW8b+}9PX§=QJ|%>^}sE7~ 4hZYyWc\)vm7dl8ϓ1=:I ̹s|/Vf7b޼56̉Pz)W:+BeC=x@ IR^i/Ӛ5FWY P8}^Y@W53cէSTl~?ݹwt*P uPc0#b !!4soFn@!uhMv_]!oE7h"6V{˗+mPm%|W֬|^$r.[W_ze1$] Z@l1[U@ w@Znf|ѰXP8ydɢ?e95i&[…:>>/C}?~/"Ǎs0qRt.waurR7K! jKy6yjԤhQ=[gnGd| /_J}ep龮CWwR.]nĿ@27}"" QUzYF"1|GV_,]Ji8O>=7nzΜ|/Gi~X{g=^7lp!`]ڷpm…âQ"DLښqFs!vz-,Z~~%*\ .X@ w@ٲ2.;]%9sBС‰ Vk;Yόy!4zp-InZ ֲܼ-@ M w{Y@!2nW/t`?!! 3dp Rw.CB~Y,=u`᳁u@ )YP/ʀ۶y5sxPԓ&9Qbc[ GOk,J޾d H[ bΠAg̔ҥ86?N8!V9,tANsݳ,`R`BO>> 4o.'O@ )_^,nNIHtU9I<BtzrDW޺W௼"VpwLwoŖ]צx4@#o%{@ ^+ Ӧ]5lR=ϟ߁ēP_J.$ ۉ>Kpw*dI ;W7k@ חZRav3:uSдp瘃:5F{F\ى+ekߍw̔? Çźzd$0P>]쒹}[?U:m޿` '}w'#zR(ߺ'wn~+ׇEoS9={UΈ*~ڴ4i+q㜸ߟ7C >%.,~Eo@%vW_T.wΝ_9.rg izp0>=_Ę!?3S&~e9!BBt;=T9/bz]+)IҾKJ-*Y$&[Hvg-Z|+K(!;̙sgwy_>̙͝sy<Ϲ`s[k6N(ߤ_ Fx{w`  HyO`ת%<`Yil {,Xw|"j8'Th-(}^Ԉᇱ ~]tg&Z쵗PA˪Uϓ1`#Ĉ)_E S .g^z)^4Vx`sQA7n$ ^B(pE XL2D.i.~e0` \CP.vۍr&Q+P=5ΡZ |Qh"jU?c 8纷xqhЭ3bl롇|Sel{G;0`@eʔ"O<}fL<ZAZ ,]5̝l&܆mXzY."qc70`Jٲ%8o=6BBP~MY,5:u j]&|pLҶ;tb V`&kb2gxOKl|37n+Y XvX_kjb(pٲ½g =ܰ<٘0/ c"Lc֬"j$Uh-@Ai/`b:Pcۭd`ȇEb0`g=wbuME84 !Jg-fͬ}]O|ɌO-|l 6&LCˆ 3aHkXkDE];*Wp&Y…E8`;ʕWתW3P"fϡk3YϷv=+lL0tƍ 7 {x`tŊ"j@eƌz !jaò |~嗙*&)'X.vL0-Ud%N\uL q.,Xhl#&/qق &IEW߬vcs @8ibiDʚ5W\3 h&K%KH #5fd ᅨ7G-&L_,^bs @<8p0Xg`-}{= }{-l`ɒl)=z0Ȩ@~0ap@L-0`PpIHg @h>p?XEӠA~Є!ep~9p1 "TJ|뭷^޺~kD"!CN*U`1` p muʕ(g% /︣XbwP ^[$-ц7i`Sc&.&L*%&)8#߂u8 gܸy=˗,`hCAEVe@-+Lndse&LrEhi͚ 5b @x`&WY;4:9'=zD hzw5+fds_v̓7A- @Q/vLČ;ev8rDN)^ }U(ȑePH {ի,#/ @X "@ݺl3 AK荳ys,v/ F {~xq _ ʃ7j4d@"[`rul3 cG)'p䅫*Y۶xeH4\v`o)PpS19s1c:t @< @x3qaE1^=p% `]7NI rfH@7 77B&E${]~y_7Z #{x 'LRc}2Wk \Q/w6-fds̛e+(Ж/ @4e/xc`P<̚U\#%KV6p`@28P\AVLygY((P8Lc V:htFHP+;v+\qEhR_}> )~˃7aL  "%={+Zd @4X0pw'~X*W3'бC ;M;"19z6֎:*֯S~g&LK/76:h4 :bW]}9м|ӳ #\ ݯQ ܴs;\sM$_ @h,{)͛cD @=:߸*_t&nQ)(3fEePw^#In @ٲ 0^VfL1C#!0a*F [r8"%nq Jvy#F~c-@|sFY6L@[Ote}ފ w0&Eiӂ we3 @48t|-Y& kLJn(5*ݘ\P $&Y@6}eK @([690m[Fԝ;e.0 ^}uT9{/Pŋ^Ƌ3(8`npOx? yk&LREw :5Eﭯ|.pGyxEL^ua,`pIiwI"L½6}ne.@%;7߅  ٤*Wfc @h@viHo i l2wܑm[żEb:hVXW`jժ @z G<(! 'kի3` KRe 6M'(>xp[:4̜N˼UdL{t>G[nw^󡓘0X1֮ƥ=V0ȦZ:wfc @43JVS3ik*NrEql=֭ .[X V0{|U䴐 @ /5?´]0&V 6ffK @4h(S,&&b56}̜+͎PNRǔć}Q9ț @ hY*HSS:/Y_ ls??:& X'iދ{_hj9MCem׸q21 YCГ7C) c @ڷY+U-? @ @3#8F>b쳭K."3(d.m}i[ݙ3=1@Q29FBz;6woC^NR'=fdG'-WΚ7/pm/Jb @fŊjR o(S @WLM#sPmѣS|#*THgOY?f-HbEigO&LT,ZN_ڸ1^[NU:(o&q!0N^zo/UcPL ڬ*e kbLտW|3v]yVi͚z5blpYi.P-[fŊ]&7 =z(~u}=SٲEc @f6^=zX`g (|ta k4"u߾A4i@ѨaCFFĉn\2@eժpXř6?M 3&pō4nfW%5S&y K3guz>{N,'g [A͜9~n-}L `aY?+؀ kZЉ@9ڝifͬY`~{NA-ZX',P!Yrq#/3+{ 1xp}ħ+sOg|2&_^Z0pH@z=i g3&#wӭ 6E*]Z,#rQwpɰh-s7 B?bD;mA|  ZBԩ9o1$GN{v @W(.С7h rvNF9PkfM&A/)4rX:Obl @b& K/ ,)/84+߂ˢ'[z]Hºu?raߴCG)SDPD_:Euz{||!eʄFr;6WGwu#A}w bvm»bq8[ģÚذA,E'(Naj֭Ŵb~x`KaxeF~m:urc60=c:/ܖcU`EpNzZ 0ujMeOh&5?oѵk?8c)4P}slQ!4z6MkLbc3&] ?UL]2rfP _?P i &0 T.4(Qyp֭|&؄^7ժ[ @|Ƽ&]atd]?С9c$@&ӧzɎ @ ѤIrX~M#-  T& d6 $&}_1(쾻L7DI'2 òzy-8vy0Hz$fN$myLPloPЧiAwB@z|w.6#cP\YDKye(_^$ =p9 O~m@>xbeѢ0-ʔ3?K/Ihs&1)amj}иHڑ!>tXT^y% ?weKL{M\Fd~tb}Qٕ+.W%YLdEJ8[8]0 }LSLmqp頫%Cd?L-^)ze @\W\fH_U@rMg[KrJyG:w[e2`By|MY߼9\W/\W]C~:4`@ YǤ ZLիEvʕc2Y7 Y M.1Nq&@M32(Htxʲe"w5ru|me3}I| |{0( ԩc]{mNҡx/X ~rh=0y2eXTfjC+cSoDxzx^q5 &;W*/zJLObeo>LɒVfp@F$ LH_NB0-:t,jQXr=~mr֒%`_,|տf,Vl?/͕y!'b`Ա bd cSPWL0GGO\oIC'paÄ!UjT0OH"(yaӯ^-Vr7l|Ƚ5sb_yXll8Iv FViR_Ħ].y}Wp;={fo# ;,G4i`0 >} i`0 V{8J}`0 ^n`0 @2"Tа!`0 Fж-8qf0 `PjTY9;7`0 CΝ@FFo]ʝ`0 Blg 3`0 `:iE0 `0rʕ./H `0diFyV1pn `0 #ek6ʳF0 `0r uc`0 ves<7(_ `0 #([77f`0 .5bC {fS yO̹ZGk2bzo}vsg[3r>{^](& ûӧ+yHhC췟 T/$ZHM'rNqzJgkM<ۢu0NLmۊq&9)t_Wo(AyCO^cŋK_nEH{w\9dM"6 {Ur|D'd^ע{κ~8c%pΌB,yd1 dm#yC\T /(~ݾ]N9NaҚAb51l(TW'Ms5ҽ{իu%aԾ}Ι%Ks CjFnvН*qkվ=+ezg>Ph8Ck_dFE 7|0`zni_}ѺgeV˦ Q(4ۢ)JH{!Z`+L@?G;˓#iD۶TtÃ`lQ1d2CG{qƢ~&ΰ`lR6nCt0T Zn )ԝ6M3S%T`ҙ̍ { -,f _k ;wꯅB0SQ&)MHn(AY0 ݣS'=Ck#qVg+ (dXdE8׬1 ۧmYJhI0:}7ئ_|aKr{`kaS9 z$t< gQVj2m|mS=;IvSR13 q eˆI~Y<줃?l{1I'rH+25k}C!|~)ظT_!CR؅W>9wnT>T?|^=jmIB{N\uR$sZ/f4l(^٥|3`$#!quMb 8ٵr5 [g7a|wM#cC$7`o8NJ7_}Ž a]yX\uׄ34K~n: _ʘ1)@6p;4묳@&X~ XC9;'|*~a*b S9w>l}>ĻCӦOPږ?duRJ= ,!\ N+!*%d5K? @ 7(F^7cCmi[wo>@q_~)曭yL3Q1lbI}c !+Fǃ/ŦsK_z]gjOy}[sJS Q"Wa8R?GLuhdL 6o El8C@/HCբE>PI!䡧j J0vl:芰`R!{ZN`prhqe"Dl\xhI -! GLL+w\g QV.O) VNE^31#PBT ϴM%|;K#*ۼ R5#FFZ-S3"j x )*e}*eNKTbxp+ _ jHAgB@x*d8DܨT>H` ۔BPC@Yr>U 2;>[ Nr5%K E]NY7"G ;n-ظҢR|f 7PALj* &ώSIJ0 dy]|0p'&VZ oPsxSd| @s7?"SFݺI=vEݥ 5=(TX`ÆJ0dR^}5+x1%o tNx`b %Mx@5h 50lXj@Ttzk8olct^~^@"i*n-e&0؀8չXB3G}j/̡%d4,5sQ>RQOW/{Ҙs^ȐӦwB8k .n -Lo8k%_XxZ̲$NG&- \t^hr !ܫ(#҆P^^.SbV~zbi+"VzL)bD 06b  ҝf.!sͲe}5p瞛N D_2u; l[0&'Id3&]qqA@V~Ij׶,׮5 s^C$bGzBVH] 7Q#{@zBm˿$C}M8!N 9S\X@r E1@h#DdQ SLI@T\tdw*FHM@>\f_PZ9tɈ Nf:vڏ8p&@(: _~SrM7UI+d0A  g"_mB3hJv7mn>)-*:5Iƍi2DOe!_P+C8LS'qO/M{B0IaqDq @\37{M?={sqjA"yX8&P?U1X#%gi5AʖÞd\V-,P?^%V|}8W}pvLZ֏@I+nflMn\ + 2B LBh %|yIsBT̙&\3!2*GݴIǴ ?CsĆb^3YQ'dm>Jŋ= o${v*ؔ4)}0qwIHIN8AmpBg5:3E@%ԲY"?IP:G!,Zf&e䖦m7@ܟ"ZF@xHPI/3BO E^\`, }` Rn5Ad Pʬ]{ HF̞A_t&T Ԟ$BlTh XWK8> /sN!lf@0m~#.OMRe\rI GKͳd J| J˝oG*P'&4@mq}Azb(`>K$x;>f@SRTޙMU>%o$t#3H-"yT{XL8#a9+ {D|iy%ܑ)3'2erRÆ?PuVO }vP?%3O4M@˸5SQ͛S:1}(+|]SbHX򓙀Q;dy-zI%tcD]֬t>/cUv~$U-jo$uG> ,!*e@~A0%ټZ@ ȘQ]쾜s@'%е tg%pBW|MA n$DIi5spV:wT>Ix$ 3U9,5"yƏ4 !O9"M;M(SS$pM|Io״GV۶I]| bI O(eN재Y qe23LVf^K'}ϛnT^  - W'NX_~f@K[$Ӭ<i]4ɾR13`0N8]0}.LtOLmm#P9#"*~>[,i"{/9؎x.cҗbQx1։{*jU(Yg !D hٯ"SȰW]CzK D). wA0a̝ko2ľ9-)Fq$=2a 2C@% @5u$7O|ݐfK@8a߼mJʇ_qdw/JV&w7V!BӴ"͚^446l0 ^P=$0/0q4ibU|hq‚NInэ[TP3%6,`Ņ @.cp(Z Z)c`, ڼ %n-(s'˫ oN(]^)N.e Ŋ^|Q60ISާ}{B 5n@ TIc{b`L_0;ɞ{fm_xA#(6BЦEq[M@?Q>6? / e_1B|HVw@;a`FMdMߏ5&,ka&2\#Nbo 0 =ޕ,w 3 @ÆQhhdHd^ub \LrLUR ߔza" @h,epٲ6@',@'8## S2Oli|2 ,@fo&C"M{Ck\ޤݰ|r.D :di)Y > bqzj 6L+ $]Ze$5QSlm"fsStY(TI TƍKqL=7MY@sa t!AOzNrJG`RȆFs" F&`bѣD @~2UΡ8}zq-* 6& {߽ wUI$eٲ@&{U@z.i'GMKNJ8[ [媫|eZ -V-"wUB#r:` [JJ uؙȽ[_#'轤6m &#rV\]+[@b* ԭ۷ M]"&1oI=76%35m+$bU:d})gJHrߗiA|rZ&q$o'vev풎CM2eҋ-k/C+ng@'w,D(y]O끶B(/uw̖qV޷o؈Vj׶Aٚ,r'D [`[n^A쇊u^gz.]VhJeN}&2lJw|@;jy,\gTDaS 4&倆V:MFxʕ=QH`=aEaノ\RIxVf@ qc"IP 7f.LbJfAڠGkǏψңCG[?;b- hOо}/pCBJ8C P@mϷ}&ѝ٫}gO}«5m;ùB.RcloXr&M.>Ћ^ 7,ovg2el d6p/Dmk4k=5itl6I=hů8 D8BlH.Ps@Ď8@4EN{ 0>6 c+%x W~H {3@ +ڊ&֬IȺ $>5fi/̟hpDծ]bBXLwonfGlSXsNEK`з#ޝ,L`& YL3ex;uʤ %{oxrOW]T(ϔ.a)dL@᷁f"~M$IIaat@z9xѣݠclꊔdF=>(>%{D&+inݒKZqj sji 4fBZLmO0p= Q9z'MJ:p(\B}dIIzӧ'Vl EŊ= @t#CeWHl'{HqJ8mqfr 7:03!2$=f1ɲ7HWY[I +HoM.(̋@:ZP6QN2IdcB E"w)sx OdpzHsMg6ioP6RCayֹXM @3$غU{An3ҳMd$ɟŋlj/5H=sEܐpf3IڵbpntiRi1T-i6%,Ҷ |RĨ3aV^@v-!S)H0r݀?Pؠ6rD";kV`*CB iww^FhImE9=` p9vT`2dofi(x;|Bj2%xWD!\R%gQUݡl3cF`} ݶ8j+̅ #?@2HK*dy֔RU_joVuvILy\]3TFT$΂.4s?$ujQ s3)=UE~FQ5uؾWg&%eƦPOO9'ORf-kU4_r. X̲@iK\p=ӴL dXH9oG|YKƟ&_&d*^#Wgwl^xkwУ %w ڵEۺ QW}eFތG5㓦dP|Mywږ ؈}r)@uDBRlQCP2d 5@Bh7֤pPC䊦ur(78%)P AITF0: J],!(BN)ef @WTv%g҂3i]$bAv*/$ Fg?&ˈBR8NWsuƍ)5Dۂ8c,Z͊A<{3QGjP|pCh?IOqffsdѢ]; A#̾; Ŝn5nP]_,i>ĿJaC1khю2xSsl\Ldkh|,ZgOώ$Z ¦17dAh=WH|S 0/2~?hH~u3Bw^ohws\bSp/6a+5W@(>-Ćw4vq<`׫'bz_4Ao!hEPqmۚZkk'tip,UtBw.TI>)0@:K֑#E;1)_)r@*ɂ>qL΁5@A}C;he=?ehv9 dI|躣G1 (@&7Ȃ`0 P8 kpfbp eʈ] Ѭh0xvs p%vV4yÅ +mf`0]$ QK}tkҰ![q `0e.>Xd tR~0`0 FASņ #\X! bd)`0_[cA`0 FU 0 `0Ajlp}2`0 `DJzb`0 e˲;t`0  Jd;vؑ `0 #2 6wL `0_?ㅖ-0 `0"/4m`0 z`;^hЀ @(W*_>5ʖ_^ն؈a10V5kZ:XX{[{e.m 1TTD=&V }|]DcjI~Y}XmX*> o~սU`hjiIVj5jdUT-vhN™gQ햢*V5ǿsU6Y7q7\h4 ^Av>QLƝΨLʫmnם; ߞ=Mwuowv :i8h \8f.#cO;cs|jp38^~mE^FOC;aĈS =V* i*m;{i:TY3a{9 Nh#?QM( _zttm˖X4Vyxsg=7mε:H#-3Wi0Gv]gi *%oh )Ssix֒%ֿ&*uK¸^Һ;S?}/{*sα?2s*FG9P_M1x{om n+ ПO5>c=#2}k~J81qđ ?/2o?aGs㍦92N+&駞S瞫 L஻ԫof'4T&MOsES+w_NWmMJl̞mv~9ɠv5ø&!_Z晌T ~S뉆ժ/^7UT. Ҏ9Hc■q}T{a͙c+Kbt0|P Tӳo%NU?_}t1f#С'O0e!W @#I Ϛ\5ad2{m{o:V 5Y{R /@|/tS@(t+ƍUgOne1l,Z$N_nTɓNO#'I]~'뿶^v`+LO;2oZ&9hv,>z5L7{w ߩ<,nR~?\y]'l_aiQ*njRPԋT.XudrÛnL(B`io@ĝCyIqGMR 8*~fg W|.|z3*Y z?T)]t2$_9W!=T?%;.qdι|ʴz,?DGH[-]mGf֭} G{&E4xaì5k_WWЮ~*fץ}TaiZ Zm]M-tk/lʕE:T,P!K7ڿ2pVMSW'͸z9-Js}*[i"i]x4&"PG*ؗ`C$K ꕴ,p9$,Zc 1^P`t IMھ}O_AFT{5ЬY\S TrJ;O /Z/A0 *JG'!(mUda jĐKӦ%$U [m.lY<(.!BSDPOgw?489ֶ2DB-ּթrCҽjGZw΃Z sCZ+pXs/E uR91 SyA9 ]̛7?KK~aFw8 '1=Sfݺ^B3شE^N J>RLl> cD!),t"^hÇz/LZ)5hT<-OX i9E{ků=tP!sT`z0̨X:'s-Țe=wwB > @߾~񦉉3B ^{RgT%uTo8BҮvVUHC L^ 8d/ƍMѺ (  j 2LE1gTO7-dH|I8 Ity)[־;a<$x擡c81܈l^bL"!rUzN֭]eu!Y 3!-ZZd1nYHzlk3`\TOvּy} ,@SxҧjBQ#%k*s7L,$AôayALJ]{쑘AA5_Yq ,ҽ[0 @ڝϪU)6x@oid{  i@+^t9K.U=χlWF+3OݖV(jUY"oGEz:!m)"D !4HJ7I&Y"OYYaRcE+&ܯ.O&j+LVq%0Y&f&)Mm 8ssc mҳ9!3ܢ|/<& !g>R;W<";v!FiY\12oLi.iB )I>{ZQ+ mfj+%!2r/CR7e4>^%%>" Ȕhǧ8woʖ4IaOR| c '-Zwr,Gu5j4|ZqD$HJ3>p/D_jJϣ !m/>Tcu"X̋Z @`N LpZseٗqfds# Ltg'RdYٳKڷOqf&JnD"IfUC!竓mV˜#m[ա <`8Yx:ս;ʂ @DfCyTD~[) ^zӝ~fxءf:GbFJ 1Q@+s 6x +˖^&S@2JRI >Z CJЩV/ @^y&N0Dr2rv3Ic<3?B)PrK;GU}3F }(ЩS"ekan d9nFn[Z5Ψ \}$]Kz@1c47yܑ!h_DofڙpÇ'Ww 4FDW8JNI8F,RaHB'΄ՁBSޙd)3S}yPRdu͛buMR$?Ft <}l[ ϕOqL FW&5Ehw);8 X,xz~U(>j^{%u<"K3ts-0eA^s>Ґ! ^|+ 7HlII'ָQ}CYk(E^} &I3L>>S@r: %VCE4Yrq&s0aم@W7k_& V@Y)d"SCZO)<9q[EYMZ4_xAOP\}u Ч: ;~2 \@#瀂Ww|B({u(}yfU K7 H̊"=6beKM0H19we!+E}~x9s<,"4IL { ʦy @$@{?ҍzt9#Vd@O ' bE;$ځ'ˣZ±+AޣGbߓB![ݝ"vtF[9y3 9mtcXRyJӞq [ncڴ {>S=T}fr / 8Y8)/ȵDotګ$87=DX>M|V wœRdn{_2xtyLP.DP͛" G"Wڹ@:׫KS'"+VhZ#< Z̹Ly ;=-Iʝ%a4pΗvGK(%Q%KTԡFWx&Y42(.WӲ׺pz^ n1k2mHLϪK1@ .NdH`m+(Όװ[g2dHxUj&4FYnjp 9]xm/²ngpvvEpIN8=_s2 L4JjVɈRSRN9 Aݩ@SE @"7&}Jwy? h1))*kf}&Մ\'0y.41ˠ #m19GlLTR&7}4ř42e6~(jDبQ t C&P7p`iAN;#Ѐ2pLVw8`@R:y黥$d]4V `U3wߏHiJ#MC"E0X6K[;d[$)̓61 ˔,(L6A;rubUrve˹6"3/1Z?L~@q'0 ߗ @T@h36:q~Ci@;#ptw, ?6,Wuk1q>Ȥ=;vL\t2Q@.S ;-8:IeSL"D.7~i@6PuOiO}6aSIےЂ3RR%{۽h iFuIr1)+#י4 Ќ)v4q8_2 Y/0wn :uJ>&3Bidږ볿t+ ]QsxM?̋j m@vDHGdTqNw))  yl;Z/ON#^ @D`(CV0! O6&R|m-*W'b&=G4m̷p4tDIzZIfx}օ&/^ &ڕ ׯ Dsf @.{L$a89?z2g|/LX`!aыȿi+\O^@AF4iکOAfuvO&Қ  '=m?sNB}RژDD;Uh ~D- qh_&{`0sd/u@eZ۸4e}m{j r_K@m@Р@N$|הua1R>dܻs|2'#kܘ)33 c.?d{AL^, ЦKHJo_0Id`5;Ap@P2*hy(B,:&u}+%(kYVQNziNA8CeEʷn>V;#eG2ŧ^iVD\qѣXf E *]ԙfL5w4q }ɢah4ŜΜf ֭{}e վ)$4C%B,@Ci^zi"MD`fqxGzw$ e 'mi LTUSDBāPT[$z:In.J$\ɒB9R֬Is?\}& RKr0SR.\y-H " 2qn!<&=S UwpE  0ݝ@qN[aCu{Uby*}JD aP)Ձ~ $C$3{~:ɫlf_ޚXSp꫶jgsF(Pkkd2c&JnTj ZNkuBW6zhт @F usqcйxȨ0zeEe \`ˮ^-FsQS !/_-3YZZ-DECw{Y;b~r-.#aG>0׼ ςFhF*@fcI}  +"d3ψT)9D­ڷ^O+VYٯ5<6p d0 {ApCt&*AﺫfkYڽiZ_|8C.71^1p^ţQl?prKZcԡ-<ݫv}Ui0K ,{ ]G폁obs`F=?[A9s&Θ!>vA|)łz:: ySG)^Xww8>縭[n1uQfѵh6>O]' B ZHN_~c+9Q !BҰw{ t-P֪%D2( sŵ; ?_4>4B  )aÌ~ QH2ǜeN\}VVZͶxᵘ`0 -ʕ.lgx?& `0lCȳ 0L2`0 `d5(*}3 `0\ޝ e`0 @:lg >s"3`0 `"O3`0 `5:/˝`0 Fd3`0 F*+gϖzTh$'{6`0   u7n`0 `G_80`0 `@V>l﮻rf0 `B*"bm|vg`0 ZCa=Sg?%f`0 ?4h W؈OZ;rWV>}wn `0E^{#tT6:Q#sZF.Xosuu7['ZGaUjz"s"[v;uJ:xe7'G7UNreˊ0:uRDtsr10`@$aըaeˤK( BMdT6)YR4™gZW_mMf]|5|xkbJ#xpo_Qn]:tHz:OSt;>'ƹZ_otuaY+}zŊWVNW iS\kxǦM.t#ܨP4fMӭFx/9 |s*^9c2o 7H{ l(ĩ'W8(dU)Λqi%9.[bFjbz?_?V{mM '$֬i~Bö~%aUEak7tOW{j(6Y@.Qv_ZЬiU*7k n]y#e 0e{׬gF?r_mۖբE\0NHbiSqSʋ_~_GTw}Cy,po\uZUI۔x_PlYYQ/(bEڵ”4?_?ߒR*8N2*U];꫃Y!JK3UJEФ]}qf&ʃ+X$%]h#ND%KlG־&]ҬY@O( \3!={jI6 ܹ \pAe;iԫL6 NKz*a(>$`A@ˉyGʔK LbϪ^s}a^" T'i3j/MRBZHpXAaj98p"ZO?o۹sѣhݱ2'c .ɞ9֦ a4 m(^VI<߹ A =¶/}5٣Ӹctpj /nwBaEe8x%Aڸ_ϙ5+4~s=WheU#"N. 쳏=WISr> 8Y̟Hr*~c ?uً-6kOI>0.Ϲ馂%Gaah|yLU3xQk p^J@^T:(Zð`8j֯WVGStѵ@Ŋb}'_oI2"1G"e~-yCh9Bt~L{ئbqwiWqT>0 pFW˙iM0enۋģ`s{ſf`R93Lԓag{݉lbp")̝k `]%mk^cӧ*)ԩ0aq$PTz`-[uWZ*R-M|icdSuNzh|G6,@׮Y/j H @RGEʾ$BfJSF V -x>h$֐&(k[BuQCd;cYm,/G)S iqijN?=> ?u`ʕk/[Z=oS@UX%0;9U =*\w]8}w-(WN|jS'[HfPW6N=>2rd}O"0v7X]'̙C Ȇm6}$U0_@IohfM?G"R-J2Jʹ:j rvF X&J ҿ? 3^AV\Z5nhn݄`t$jZh*PsפѢM̧ hsE`Q ȝ;5s(> S; Vt46%u}s/ h*JXTh=}>8FqC=74x(hgmGakM-nϨΝ탳g~w<78P;Z3&@Pņ0%Jm߯NJu*W]nxyboe3Ly|h`c L{*. )ڍx@t…6>^01DhHj=,. "t7uj/s睉>kt&\iX zxqwn46 $(^miT{CX i_YI89!^qh8]eT~4`$1:`CXp UuW ; ?U` C;]yOk]Uϓ^k/Pj&V=nCۭAǎ"a@)ݻ׉Dhm(#w s *!Ju%B8&$ڢO3p;H-`VjKEV ,I!oi׺ cCX}{iB#ҐȽ"l ,^@[Va:u>S@g 5H+^y~mnDx?$ٶM%u)@1f-6Ҿr_VZrU-k97:قYSuO{ $kbÌX/~)]d ;vp7T >}a8ѹ/8IVь?hɮhY3ԇ6і E'>ߑd 4l/)ujeBye8w eY>`eB6mh!'M7iٿg &ߘ;U6`ZƑɑ@0S>gYئCh Vbd~.]L|Cn2ݕS:zNES%$V˦Y\M<]ݳ,Ma1b 7dɍHmEcGdh}%0ok&)#+'7lpŸPˉ͛SLGG7:Ú:ji-[*B?[1-֒\zV/Wp%Zݣnժʖ@+ׯۭ:sKPV%$ 'VĄl۶*t  :u^._qw vv= К6N˭tlU&@41aIqr]t-m,Ҧ tR63Rx#|GJ=lDˤ$oVu;, !'J1'r8sqڝi0q w3T/#].w % G9(PjfpdUY\zU֮T~?cJ bjuTi{;% |禛ԪH88a bo$}nI{TՆif'M{PehYFDPEq#NPDEP@T%sNr{{3{ɹso|Z^o ?wQ2/p00o^;{k$zr: 2Ϟkku\iS+oÞ@%C\+^B`Vbd z xX|})A&_"Q|Z+RryhdxG6z}HXp\j+Khh(jCUX|wR.oFf!8ߠZ{UãWŁ kX4n|)sF,Dž]]pk{LQ&+K3nk{ 89RNp·p6p|wH NG)6/g:%7?:(Ɇ/gv;hwф&$ *IַaG{!pn'= jQ/,Zs#y\lu Klp>ƚjV@o~aa~8s,e]pAwuqŒJ cѣ$Mp\^w~ 0߉߭>w_9\ Aj'N]'H_\͢E׮% nUJR7S j_VDCPXϞĭ[`x~u 9?kC&\:^8{k\Noԩ8:J Ҝ? `_iڴȄ zBc)8=cIk\H\qIԣUnUq A}YWT<%% vh[1m[o?aw˱_nppɓѺ4HIݠ[75g. N>C_qW'Mn)2'8 1MK#=0| 1$k>4ěrNF''w C*,S'rG\֮%+*WAIDX; 0#G:_&pש:Tu~kۖ$y1j5P\4PpZi }¶M.ރLc 'ɷ",*7;̙U WѠw1t:t[}T܁0Xw'~H/'/s8T2;hwMK)لNn҇`V }hD16ꐐx h @CCCCCCC[5E&6s:d2 d~@4EOIQ}uXOKREZX/~GCV ZTrhP* E``l^~BWUaF+@/?w,+^0w⣡@CCCCCCC{,!ɤ:ĠR;22V=Z|H}"`Ank䦤\r¾)⣡@CCCCCCCZhx^A =jc InPM NiQ{J"Hcq4tXv+ vͨȸ|\Ou%:d@PPB^Bm54ן9,$إ-m)ܤ 6kG< 4444444ڱ u~nߨy`S [wv%hl݀j5 0\8It@Ԃ^. Nx?+@CCCCCCC=842C'j=IGPFdv:#Q㥘@c BIL0 O{*\vm $@宅29^v4hhhhhhhhf9 j?Oc|AY)}">:Ȑ8RKm. J@T'd4]%'51eЧV& Z-2U/Do$ :,h[caџ)g$T@Ki^zfH6xPU}VBc>PyVQFy]۟f4H$lɶJP ;޴gI W=$&4hhhhhhhhUcoOi-88>:i~ne uڴN@_'`RiHDfivcҚ?槲tZb՘S$oψF}qPU^?GTR`jۭ0k1)WD <6.^^_:otrǒۯ  OꯕY`R,%ˢ:55Fڠkhh(jn9u 7}Mаܜ.36XLK? 7,<0k|\LOkaPͮ>*((:wzk*P)Sҧ{Î8Lh(ЪҎ(T] dV*6EzPpRRNvQ` uӜFM y}eA!,cmEaQ VD&§KO.D'h=ta@CCCCCCCb;#n:42:H ?]h^]86?r`b㓚|XM_3W*HP2,&wtV+Ιg}PdHP}HWPp̔U/Q\| !@CCCCCCCz-2<*àx{ gtȺVхDdv}:.KrLZ|z+!_䡕ͫ4>XMm,:<&S$72X42o/ȣ 2X/Km%,FCCVevS`zⲯRQe`T&I%F)"I._¸ oի7= 4"pKjPyB miZvhieD]^ M`: 6AP.@H4] I`Bdrf"d9JB, ~'AQ"$C 4IACV2،F_M$ӔbN*!B]H\j - [h /ƦCˬf!/ N԰!"i^ !Gp@CCCCCCC![ـz"D ȹp^RLWkbrwHKlMO.0fdjX)tXzS.C(fx~jG ZٷvC#*5(RK*&rшh. ) :!ØeʵAQ q j_n)\Lجax )?̬ DO/ 4444444ef4J@Dd I@h=E$7,&i~WbVD$d> J^RYpxfZ1mHiEa1 6/6BiT'WvbPը#Whe?jDj[{S?CF] O1|? :*8<#:AϗȠd֘d"f7u\ċ ͆==5Y߬]tݡyFr3Z7h6'mV-3Zf-l3:ļG5^Vctr|ɢ{rN*)zؠ{NI>R +ʼnfU A#EC&7*k'6CHxZƤW|;Zi^xM*Gk}D\Mr 0?)b}`o3h$L,: uP`\Xş7{Zo zf:s2)-HIŴJ''fGah GCCCCCCCCOx͡# +"O!SGgkȃ,tm7Kq-K R7/%hF,lǶpМz@ q֭yC.h[$$8=a+4+ӤNJl=}7_&!6lrTI ɤZ8I@ p.\\z]ϒq i?p^E T[܁\' 'X: &5@ {J1~{@ q͏6|{ڗT `zžZ`SJwRuR1MX$x{Ť޳ @ DeqG=7m^xmxe3zZPieT>^Yym2^F _ũ XMYD/.I Dy?"T/ 1r̕B͉}b}d>R1)3a:~PL 0Č8& @ DxMRL]+1TbB:jbȗuVPv"y$bKIx ^`%;GRȈ!Ʌ<"7M@  0~B%ެ@/#d" +ݟK )Kd&$:o*R1'ED <Z Lβ*sQ~2*N~>M h@ @Tׯ2)4C;De%@zfd%32k>DOҥKwP+Wn޼v֭cǎٳ~;Y/q'a.lRẋzW-Z0'A:F%LˆP*H!r f5MҹBnQ@E-X&JU@1[L[)g~y( ;/^|'R<s~zՎÇa,))yc=ֽ{BGi0222FrsU_-]wwA0a‚ v!iÇONNtp Zj5{/d3\sѢET5֬YSMOѣGOZ߾}F=zUjQF1L6ͥGOýݱc`0Pƒ֡Cavv/2<#p^s~~ҤI(?lH 6}2|x7q <,1r6O{JwWyԗn@G/[ `ͨ>4ry^"$J!K I E5]8(T<=z7hڴGK/;iذ@/^^֯_S9~Μ9SUcܗ?8'sΝ-AUuÆ kZwq^IR룽vKW_hB$9T*PnmU$xu<@wybi֬A8yIM&( .#G9~3n۶M&7fK8*#G`]-U@Yu^Ε*-\]^67,D:KS%}+B^ (>Y`Ki)-E tڄ^vaEpG(lu𛬬,}Q~ƍq= 8n 'pի%%%.)Ў;wVX3s^*X,vhX/THp7nLWǻvzȏQF[ ߿_]clJҚoܘp:͛7}Yn\U^dɒ[n9]ЃcA]`VpAl _Oڷo K^\h5N/, `bh= Hf!7r`gYh4\+.,-Y8]^ o'6}8(<̘1:ȍ5:urd]*OWPׯ__Ꭲ񒪤XlKM_nݺU㏫q^h}5[mpicw ƍϟo}dddeɕ@Bcd'nKu9~O.k'c>?,PB@Y `,C2(>KR_RKSF}<7+ ; ۶m3w-y;N\ ILL>|8իW/Y8z۶mU5Ex600d޼y /0yd`B06:'8]*\r5kV2rzֱ0 $6lPsffUOu cǎ؛ڵ#Ν #< Ϸ֢E g܁GlPi$$$T_Q[8~txL  z __Dؔ<|ʜL9G'!D)[ `ԟx ѓQ|je$$FB*8@rR"ZR(:<#&MI{z /M_'OBWtc ˗/[Nj3ʕ+Zvv6k\c@T|yS<..N0SQ݋o8s P^ թS' 7nܰ՟9|Vka.]\$h"j@@=~R>KɪQ} d_*e}gS' dV\B9gHˇZ`6bd@k͡`X}r>ڔ&EqG ;L;󫯾r9/\3jXXUVk׮~zOF9r$ܽp<ãFs`ذamܸZ@8$RwSO  o-`nVL?t:Wȶ];wȪ * &3+W _HʂtZpqM3_"_9ro8PmPV!ز@$E$,zlZiY@-" .%{u򐪐9/~)YYYF@P8RuC8q" &N涇O0|Y /7nܸb;vo`*)PxG0 {Op\;p@Nt^ |!4!)lPf ]~ILZM[E ;w ~@@qЮ]U%$}]:ٳgᅢիW}}}G:ujBrϟw{ÇD:{5P ./_e% 9aOKwi~/sfOVK'jXN긯开"躁u0-1Fʁ1m>OӆCe~Am,J#Nip|QÂ^x. (((J\Hri. ׯ۫ըQ#WŋzfowXj3g>T2k`݂K7k֬ںJJ ]v) w3.P NbL2] gYA=Q EXy 9Ӆ+XVvxi!N4 y\!u6  `CQDBWE k׮ 2$$$+ [ӓA.Gf)233L&u֕[n7gv;߳rzzzVBs9rD\+#,X t{cbbsӧɓ']:3P7V$/Iˣ`)8sng,N.#)D~)ʼzH 2-Vߧc D^ᱍ^_ . u7 Sh۶Dk^L6ͺn[|^I tiRæMp)~0CFF<ֺѣC.ep֭6mn3W@ Dxx"̣y9Ï%s.$tX.c44c)&@낱@ʁKd6r̯uKd9 "tמX *^}Ua,:eBBܗ5#@ܦ~5:&'ή޽ݺusD@6K#J K S_yoy=T~@ñuVW4883yRS(8pkxGޱKt-#͑N.pB(# e >HRN @nJKKq_M0HҩS>7oiիWWFl0ؽW/,>cp7O]D,AnȓL;Ld]F0#<. @GƯ*I"L$RY{G$\:b(ٳGV۫ eKܹsqqq6X%K{+4^0W]ID_i[U0h0F" 4Idrw?]T V6noow5rȟ= >{ӧOט0L\[ {ɓXeh֬Yfg77H$@XnڵJ@$9SXZ۷OCܴi<P dffRDХ pA˖Ii@,*݆/QF ˗> uƛ 6Ժ`Xp6zjU(˖-w</vCر^֎^&P\~LU>}T^!^7LDkEL2}YvWCJE `TS. ?WFr* ^߯. Je5@M*pa^!cE:(PA/ RϘ1 i Rճg .Ԙ+2摘LWc`_~Yh>SRR]+^[9֮b$oh4Ç׼rD{ Me̽|Ѷk׮R?848zԩSZ+ZAݻP?sAرvys8}g}%pՔ|5hx,?ɳ)-˟y <$$0 Ad.fa: ĂY`50YLPi`F,Hl6i8(Pi$FR0u:+Ο?/ɸ})Jg>ܺuKPI^n[l\7Ǒ Nb֭n?#`߾}'ύ DdBBXLm9{ &TjR Ʋ5f\&/S><!oZEXe)d4MH* Oow!FN g}fnkovmfG (--1sN{O=}+zǍމ\p"X ÒokKujXXW~+˗ | 0b¬A㎝{ N.Ԋh֬YUZfM- dԩS>|p5]bAcǢ@ j? CY >')wHr})~c6O+89B2/z eb,K))< kѢ.X_|T  Q~}~牉uV'1.]1p{!˗/dɦ6m'N:0m ;ig^׮У@PTMQ>+ 1I 6&$˝&|8'Oݴ=Sg@ՖԀ_U!֢>̮;AK.u[ܦ>l4__~ QKlں˸O? S)UP y}s_^i0K#HI\YPx{:dA`fL*YQAYgC{{{P@P`رg. z=Mo6AAA~-N8޿:+;0`BW`]lU~N ۷ 2GplK ŋΜP Մ>mPp;"eVQo۟'z_4#F*  @UJG-mגy8(PԚhڴ),&O\,W& `} n@Ϟ=mbؓM]^/Wa?p1zq wҲe*?Nh*UMޥKA'}q_ u7N#iyۋ `q$J ?-##ի"AHMMm/5qڵZ'bmkx@Ie.k&lN,T  XmU Uȫ^H4@TF֥ y>q:t;.<ֱs :)5k8O"Jn AtCNZK/z)jR]vnw5gOv>C8ĂYn2&''Ͽ Dj^% J^3⿆GR`|G Z.@D辀Зe5H,N[ܾ,] ") &2z;AG5oYӎ4 7|-[,[lɂ_\K,;)ᆄ=oݻsNx=sLsӢǏE"*..:i޼yR ,pRԘt iier*BG}HŒ9) B#q *KN%G8 ֔y9Q$4ͮ]*?pڵ*aR#7L:upق p. ]V8p*"""lv ѦS!cfd$ CJAп=)*wI?yGEr+7&Ph^ K/] |:  ucA+@[tʙtk$%%QеkWǾN&? UT]+]v +١un7*ą JKK.u8OVXe ʽ/-l|X7޲e `#61c3 'Ut2 pn|SD| R&׈Ee!jBNAKu0  % 8YJe!ّ"FwIko\<{+P o A5"i@WĉRC V哜Oze8'oUX>O? Kr|oP~VXi+AI ,ɋ4lwꔉwٓϙro KvߋO?.zn=0}L~_ Cjj;wN` ?z}rr%K_t)Lh  d[GFF?{7nΆ{јQa7֮];nܸDG _Xzʕ#G&%%jZ "͚5{w] `n݀HXPPPCɓ'L  `E!p3]Ji=H8ɓ'q Ǻcǎp.KJJ*u6 1**T8*x6lWU0iݳgO <}-^}<==I:u֭[{$2Ν]x+@*7""o6G= pUW_effd2%Py5@G+R+3G .'I T~:Q~PHWC  @~nϝӠ;4i#]ɜ @T .O?4)MJ֭9"qli޽0xoW >۲e \*'|￧O_qǏ w2U&]ߪAfyX&P cYMm}ARѲd/'13 PxBK%V9N8)00>&k>sٓGkW6@@ BRR5o  -b`\IPtr 8IŠ4`Z(A&ЈQMwFܵ9r{6gdnቭ#ӻѢ__}#ܼqo @ w3~A˱vB.bZ(;'ʭP KJ{4YH5 ﳿ$Y,rc& j3|iFӓ|tCZpS>@@/*-a  mӠGrNaço{@ ]0i%b@5^4QC=\V&X~eY}||ěysq_~Wgw@ p5F'%.=$X,2OSo6 C~et_ ID/Iʇ[ soW ,مݴի(@ w8  pqԜ8МrT k t}@b|i+F#+^at+FmμxS6hpE0uQi[vдC=K[tлoY#@˕,;,,°cB b "cۮr'{Deti=Iq!>*/7@ Q-xh t {ěݧ$=wZM{($ %qw8t_ ͈NITH ;LNpkvL+W?~,Z乩{آrW>>x>2FDEwiӵd戾O|vIE9\y)|RZ'$@ל ּ_!ZwU@ wb23NO}=;x۠Vpz^OC&LbZ(@ *~QGÊ[\t5^`GJe_&[|I~(gSD*b O= *>b(Bo)(<*cYG=Ϝ1E_;h"'yeV' +jҡh&}{ oQY0"B]DlBZdɏi-YL~ .\D@ MܼuhCF.$'L'oo#dnL?bt@,tIytSED?'L*F;;O=|=1~ /j߽{!Ѣ }N @ aMI*M:7ߺu @ m)jmzM͑{0!@梼'5}I_N@=RD>mLb^LVl̜V?|G|?tNιg''?`1P 0Lcz+mغ_~%oPQɕ!Q BIv-Jzsw΂ @ ;7oݺoЈL:P3;,kr2ObvEt^J=\'d@wiOP2zrt㷽`3NչCL(׿mǞEfcS6?"6?&ɣ{j-$"38,#a7W>9jHœ ݽCLZ6pQq/@ il⛤FM0C*O547vMHcvOgsLͯkFJA['k-,OO.jԴ?-3J[>um}`;KgK1t/@Wy!- `'d|ߏoX<.!Obw?ڀ@ ?~_ihphF,ɜ7S_ayʿ\tgmyVBDf@\RaT\3~XDZ3wѫFMP٢iġn:}RR锾A1Y]vy䨫#{ܹ?4{N[?gJAQqJ@ w~?|]1 uJT,, 5 JPS] rXJ!xO[ @iNKs2%tJHdNlNf=/JGN4z3o ԢLj6 7بOv뒖]J ޝV@ { V?,7LK3{Y|Rl38ulN]䪰&pȴљudzVn ,"cdZ̮Mt8rV}M[ޡȔ&EIEGL?q@ !\xG&6b'uguNx{To{apkg! ~ /[IRYID^(AtFW<7<2M+Հ3/o>۵~wƗxw?t2~zl'>#K}+U{/@ ӸyyKc5?]c$&LxmYT"c?0vo^૥ȬsjB@ Qw|Ia"Ė"_F?_o|5zNH$,9ZD@Væ a{Y K $KǎLJmb]U~ -},!{~9ض >X'@S}Lr ˗/u@  ز=U?S@K:Bb;w\t vqڸyۊw>s/?#0mz紎On 7bs[f5*luH׾Ӳ[f5S:YFCHPIRM9]+«'eP*5Q`Tm >+VezNH)ИHVS:((!>6&]./^S.**:t#پ}1c Ͼ}曏n7nܨof{{7֯_1GgݺusLaٳ'p2n޼MrJ:gΜqaE&MJ|=O81eط O?Y<0~x_ppݸa+~s_&^xwO;M痖 KH:}AhI)} M@1,<2)AţX#YQ]٩gnR^M!1A! fb 5= Ojٵ/q3OV#S&08<#Q^Clrk (\tz<+6t_[&sEW~'IIIn_%$vY%w_;ux#̶[;uT%@~Ptر^%U>"00pĈ`9SPPzeUv~~/P@W/3⋕2Bi к<<<D{Qp$NJnPXXXҸĉu-eA?pݦO~lq{gɻufgJRo6t]$=lSC",يj؄Zc_ݩSoܸ_ǿ};Ξ_&g1-Yl: ׷]. \$L` PTwKWo[;n/.[PT SL|=}g.M7u~\P 7Vr|Mqqqn_%Xozj~ntqF~'~~~nO-/;txUWСC/s缽+>ʏc߾}{IIӁ9.]y֬Y51`67jǏ7K36FAŋ]wKzyy9^q &wz+VpuyƍiT<--^ϯÍ,ú[r۔'i2\i55V/9d:gqU"WkӇ%Uz:(0:Eϥ׵hDˍ&?ċ&CDu m-,|g!OVЫ5f-:rǷ,BEa1yǟ=w֯].N8T*_IM6u~s`okk l <<^<@uGzzzڼ.wiN1} 9R瞫8npқ"$$2g:`{=32=T*fWWa׮]]|'վ}{WW^MV/_V6/Eܻ 6-cg"]qU4jԨ27yAA.\Xo*YƪO21DiR.8af ϱ glc蕫wʿӞqæo>kN՜:sny{?7l3"wHJHlPmBй@'Yoԙl"2*Š+MڗL:?8(ֿ|'FM`|N7W}z1ydі-[6==aÆ }/1  ??~Yq09dg= `7&H///Wgy>N#++U. #!!A O}&&&_ɁB_8KQ #Fn޼K,>)BS 0W\̆+Vwa322Dh4A;Ёw[Ə_c.w8vN ;*? !v ""*Q4FMbIlDcIX [b-!jD=&?}賷hb>Q`A8fϟgNZDj-[Y8=?/=>ubozxSR5j W]t2Neu$p) Dӿk2<^?nW==7ȋWЎGffH do |rVFr4]TR_A(\|-"2ݵ47 $`-+6C۷Ww8?|l#hQ%6 ~VrՇ3< 샤$ǃ&Ol7@y~ MgмysN?oMuc>h*yBt֬Yh"vg@0ҧudɒ3fԖ-[}TEmœ?; Grw p)otk;z豻sgǂɾ bg,r-QJ6P)=X4P`AS()#ٳg(T6,1#P|\BL5ը!Srk{5`jatڍk޶mykuлwo-/Xuj;v0Zabb _U8uTtJ?nk(GSO< U.*Qi@YԨQ#9QU%ZI 06((Hu*!!a߾}:^uhJz외hMkhy}5r0Pd,X*={vd| .$ oØ~-#_\K:ɇ|*?~99:_yNbhZ.R=rtt4VH:3jS'IRvmAis@jd;R#G mJ@X5ɓ?Ύ NRl$?+mڴ=z4@ `;;;+_;7n(P[{w,۷o߰>(^u?A`Jx𡩃1{I5+޸mkWAגV}׹2ΞwTf:98 WmD LdW\AB@#l֬JDP\ptqqقbὑ;ugΜARϟ{fСGHOOGY/owŊŅ(-iӔ+ټy}Q9e}i.>xJG@aMav&bK"iEևԑh=vޝ=Ͱ0u[`ӷ8f|^*QjƜ;~[2x@Bg.e+_7}6eoOܖGl <@ :¨`7%Oܹs톬Y&Z!99]9V@TO)\rT+,Au;l&k4a{DFF5wUaeo߾wYf)STlev84@cC5e!Ν;r)HS}FMKGԚ;v, U>Xf /{psmӧO@Z4i믿j2dʽ>*]pOF+4RʡְǨϟ׬Tvy~9 q%& (t*%KjM91ߢE zc^:VcǎRB޽;/$~С)K (GA`˯^WewǠ v}o GwMNLL\ZC;z @|jo$UPtѢv^Aė/_ w,>;3@_+i … kShjdkF89R\hܸCڳgFё9J.y4իW5 bŊ /r&>UXBwp6c'WRil% n  X)A+&dD xem<gZ5/[f8q=L/-O;aT`'trNop*ߣ?0L $r*)6xt]N~Pdkh=WMQjh-r`7n@ !-VnFqItESE g~"I@@_B\03ؔ(+hN d=-bEIݻknذA.\׎8w@ Qxٿ,cŌ)Om&P(*͚4 XQ,4ƟURP~gm͛4kH;e8222dᅲwɂ2q 2Sx;еx: +eJ{I.@*OΟG@jj* lWreRJY}SZab/ zTr9yTȻ5@^PkXr!J?}ZdIAKvqqQ5DOhsϜk IK.P U#vO…妳U@FF gj`yƍ^ .hOz*;;th6B!Lߴi ˆ9S1f`6ĂqMӈ IJ6ђ@ +VZ%-l6YjUii:yRs,)&'<低J-c`H44 k.bX䨒۝@"EiM (e˔ѣ>~6ŧ~n%M3uT`ƌK8ؾ}$j׮MF6mH#0|M ~իU}3S=Z͖@E2*Vׯ/"_u26drkMbcUgͪ#}P/c?yWXc 4Zb-4i^G,k e U e7|ʕMmdhWv:b ͳH;{6{`iy>;VyV}1ɫ\QS\Nرc~xxmE> TУF_mgΝ貟d)SĥyL*r~{-\ъl۶_A 0Ȑ:r3g_d-ob?{AnrEϟ?_ՔGnժ -Z({XnѸq,(r` A6 b*4/_^,RP2rMK3AAXX\Ə#<_? 3L>mn{ja M`&<_x<`x{{[TM#WYTbٷtzL\k 8@PAa֭<.b P=#GөY{ޯ͛΂'4&ԫWM̸u L X Mwy{%rMZ(HH˛5iVʩ'0KZޡ}{ ˸1_I5PG 2h IV熋-B xj<㏨˗/$ڶmn/h2˖-3mF"Հv W~JSŲo 2] @9`9]Y-S&onJ&M`xCwgƌ:_ *&t-DFgqĵ yb,6 ӧO]bEn"ԯUN,RPg7#VH˛F4iV 5KZޡ}; ˸FK5kHӰ! S@5j8Çgtvv6UTMONϯA%g P\rPjUtC@+|䙛|d<!WlXIyAˮ_~}[ tu> Fw@ &؝gLi}ߒQR͟r&@@C5gh  _?[$lYZwoiӦlj XiԨmiW}4ڥK{}5s] (+5WYPHB+M߱iV (7F0ŜI{} Q?-$,(H@MIIAbdؐ'dO>ͽ@w8<9ŊS~L4ӓq̙3@@yJ|ŧXC|([Zo$@jj*;mh۶-,`O`Ŋf-\0 .&VTϟ=b /7_6Yٯ߶j ۿڂ5Ts^='`atRԨ>/_7ڛ>,3 4EWƢ,j]@ÒIFWjb`ĉ<"^b &@̝;K2TVMZr%{1 05wxzzj}[QvZ7M!> Ů:W ϟW^29\JK Z([ ˗I#յiVvvOwn߶FyμD!}kK Bodx1ē(WF|2M32M{@@@V԰aP۷okLE3,Y$ dBZ3y~JYI\|Y?%%Vp;ŋ]BCC%N0BWplt%O0F[lAQC<}.)@w*W $n5EB!ԯU\ik]L؉˖J iV)ok׮ V͛7]\\[4㠍JФBUV`ڲ[#30x`yW7 ŋ*B'M2eJYJ͛VҾ} 6g}MfԏH+͚5cqww7cCiq)<TADmXaEOR.;wlgiyڶ9J^lp9m dF80gϞepEBBB8CP@DDO۷EtL W5X+EM`&O.Yn](O[M!Trؾ};6a=U{E credd(׀=U#Sȣ˛'q@AYC Cv#!ЧOU>AAAZǴDݐm d|ne%ؿy:VC:u E5kVyMYdI x)V5zï:u^>3͖]vds R7-pnqٳ')"aaa1SSSهSv;!zղ.!1_w5JswMiGls=pJvk׬;Iwd^lF*T>|E6nx0gNڪU+OZ 6}k׮... رcdd$ 0Cۥz5 lSP5ؽDq_Ncgϥ[֫k $%WA%KB c`Inkde_ܬ6Zu޽[ L6%Ox( `3۔J@@Ёi3ӧOqk N)RcQnL@KF'}n %R7GJ 7.RP5Pd֭ϝ;vB2ŋe< ?%nҙl}Vכ7o믿t}ӦM`o˖-Ҭqmm&-[Ʈ5ƍ(DILL `žs玙VZQ(OMTP3urr2U3t={XC=Z5Mҕ+W/J=zdZu:/z .s:(,`S`(MpU: ФI3rص&CѢEA~_vrDC܊^ayN-9l}";vZVrʪA3xv_~I\zjlw7#"":˕+dz<,,@݇QfMs>:u2R̟?_~WF8SVsަj޽{1f JZW"yzǏj$?ӧkEɘ֭F%5޽;N޽?{,2S'H9rVAKM888 ;#:M62ep)))h@ rP;(еH!\8['aPv K20鬰0 韅C+ ~7RC,+qF8SؿG]xY 6D4Fa~K!aK2ot;Xkwߩ/ݲѝ-[յZj?u|ȑ#``l ~7gΜݹs>-[Db" ov&///q$999** ;RJ_~| 4%ݿ?\(wwRJajfc WN>>>ڵy8|0:\M4QxܻF54 2o߾cƌƍZr7ԋB5xkU_={4%^i޼9ҥKC두 Æpx`WXVZZ`޽p)7 ̬Ν;߻wOS%O;TϪ+W‹ 뻹ɚ]ĹsfVh"##͛ANïR׮][TcUrrrÆ{mjѣGu/)<9NԩS y^+X`I&)T$4k0`s΅o9v#(:uOJ**W*]m$ Wfۛ2!X8\m7u -(Lj5wk ?.zM:®9Op׎ 61X2,BlY-&YjۦqY=[Y`fsǯ<V?nd™_1;)T8ǒnoI҅^ݑl}4`i߾}[nOF 1ѣGرc۶mt,AA؞f.o%K CA`leaP_27D6%n1e`|㎓Y&5O) q*Y;pXr͔ Уc#A<',`d% a5'Iz{N  @gG`T7E0*& Mal%%ǽ`dK Q# jJI_lY.<)K|abcqFR`ɼ\ kZ|#zIAAh?hV/L,ll l+\?寏xfXn%%,CP߲Bo6q&hBS6Rm5?Aӽ$# \3Z)dq~O܀5%]XدF3L  ]07固F\tAqA  0B3jxp'-{ ?}BAAA   AAA   AAA$   @AA   HAAA   AAA   AAA   AAA$   @AA   HAAA   AAA   AAA$  AAAvoð}zIENDB`prey.orig/modules/alert/lib/prey-wallpaper-es.png0000664000175100017510000027272512250331650021764 0ustar guerreguerrePNG  IHDR5؂ZsBITO pHYs B(xtEXtSoftwarewww.inkscape.org<uSIDATx OUa cƾXǾ/=TRRD!e-iE)IZD)"DB1|~~^ϯi{gѦ\F g.1NU+;ThAw*UpfP2Ӥ Y*VDq7&Cr8Ndqw(SǩW,J!8uݡdIԮMw$fM;$&"8ժݡpaJ;*TLwp+Gw8L;"8J!W. HHPXjHK4Bwh //F~*v-)xC4nL] $'KL+w\abv* X1 tX[B̘A$&]cG XDG3niт)\8!b8?r$.PqڴA` ܡ@ j=ENFo5#civҦH+7py.ЬjwkD׮Ll,q22SشI#/3+q5BLB{c_zOMw ߒ'czu <qyCITxu/\9 E$rIKCɘ1oEr2cGԩ5g}4 ڑȝV-ot릱j * I6$rQ-ZCMoץjE"wj uBM>+bb4MTaChLY3TBJ>!A1MȝBƊEB99⦛1 ȝha%^y%-zO4h@"w2eos!D.TzHNSm~Q.iJD͒%gGET#;Mɝ[z 1ex5*O&FW\!ʗԮM"w$\F $&"ժȝpa\J*KTL"wpINK+G"w8@t|DT.+hKUL8ؕ!RRD{sωV;'}gشI|xU1tj6LzʯYS)FP=bZzCT$Ebd1p`=(UD4C}o]"RUW ѺRKŋMͦM!.RB/tQ drRUQCDBhL[KQ nyyuꈻ|pݲm7O $[%%Kȝ>*t׮ʳ:Z? kUЎ1|"-s+"ˋ/_i2OO }s{WA=$%];GZ5qZGC8+68x}#5q/_ӦNTNjxi'"uVxm`ҦMvo;>Pew ֭srdpjxE1jCBY^ȝsgjղ2d7Ϳ?g{q5a(XP T/dm7o@zkTޚ2N7DD=ӐH(w{6̯9sGr9IB#oFDrK˓3U H/a_/ 6IZNj@Ŋ>(\P(>_g?8߿mY2#%+KK8i(I܋իc=xn&W__w]D Ν o tA< z4￟pҪ`7ѻav&xLN ,hؽ[_{Ϸw tAso:]}{">P(-Z g.Cg~#`gGCNSnX=TըO'(Ҭ\yX%B$&l?$ۺu-ὒ'(N7ʀ[\"f}02Ϛ2eĝwI̡k6cxao5բU邴`O\45 Ke0{?T=XJJ5m>Tn٢y";˝CUGw@8?fre ޷ϖ-rzٳ@K'_:;s| @L2GcGrsԩ FyYnv4@Dyg)n ,(o֯W/LzxNܲ p D&;FZ`l<…\O릾9 K;(;z5`2*1ڴ!;G`A\ā-+M;=\V9!;t7ݼY%fi矧kZ50DTXV;zG9 ͚iwr)h ʭ[VѢ9ZsTءF:R=dG@'z)S\8\Nj=i' <1*UBC ߟ@Zq:4B!#\* !8{~aw"9Y /NDs@ωSCp5ĺuLpڵCqb9))M$|f$+eKZk*D4w6m( ;w3ޛ@ ',q54w(Ph 0@X)׋Ν0 #2{6S\ >h͛#iį j@ic ڽ[MLbP"h M" t,;m41ڵ#;AZ@d @NZ+Áh؊.D]z p̟P\dd;Byiтt@ aN̥8;qDѢpgLjUGk&>^2Ei|\uZלH:͚ΝR% `*'9Y?-gKBr[ׅiVm4nwYBoOFG:w td* !bEw(_>1dfw1#kAFs'p|D{ܬ\->"HIDpj X…ݬ⋶\;sР ʔA"^ڶuȑvp_F˒%efOl..dgrheR RR;;xXr` 0a& ~i{p4ҹ8&R\z'ā6ر8Y>$k5BdŇx{k$+H=&;@7`PŝsgOMGĮ]v=ghLۿaC;w -ػׅKЬ,#C-Vf܀C"=SUtII7@^ nSڧlf[/W_]OHjvaS8ҹ$&"ɓG#~<.&kjU#;k!@DG/_~i;e  @H$&0lâMUΝ`AaxF"xxqbc]֭ pJHN??矛yFWKlnZ*PT@:w@"Q23?xΟ h?4%zQ\9ҹ!4XuCGVEBT&D:eʐΝ 6@y-=}W` ~$*JvR&!)Utr!@PyKO.C§|ywA;w:?3[,I:w(ު | `BQ$'m'3+ ӹ0ժ!VFNfĽNRv:uB"6''"x0fMj"Dt ep+V WIej"… Ӯ(ڏޜ@02'xN^w:Y4ti@"Aҵ+ `^]7\  N˖t ~u `pv+ON rys:Ejo y'JTv4@T)G?#&^^h`* "ݤ#@Pޣ|^/tTD.;%- @"8 &]PЁn/u @P4!&ݧ ]y%Kvdt{U @" o d8^HTD,mڐF v{ d ^ȍsRD7ި@0ҥ5sJE 2"@0sE6@CEKB8tHZ[GADӬ^*UB7طO[1BĬYTD4dt{P@V/t 7z[n iԈn/!sN.Æ!HL{BURo4h@F2eŋ{qni@_F{&O6lBS^RRJ5kYl$G㉣+W=zMDG#?Z9rDӦr<$}p42( &8ek=Mگg@$ N]zs/낤-~S^NŮ]9sEŊ%Ç"9@qڻf~1xk$cb' {[V2ժ񤲲.LUgnA8 (Wn/qqgS5Nre?ob4'cӧj1壏ੲڿ)SEڈ^"=d7l˖YL(\cjiG82eFAPrr4ĉV(RsBȚ+|ƙ^z_Osimᕑ?}5t j u+r9|Xc;W^Q/PH{P^ 541Q Q##-άjUW&N$6eE|RtS[L-fxxDh%-!Cyg$)n#:!6v0)?}ݻ`2OznoPwodO) jߗuk͓G-.s}pDbtDKw͝3ھ]\pM`iSO{T/AaA'| &Hv͌GC]oй9"&M?E>X$'O6oN0}ڭwͦ];kOKjر*W6cbc?tg6Ҽ9`?KXƏ7o^*^}Չ ˗g|4Y>O}DvUg;P4*_^ ~}o).HMJ&A\1F6E|:|=[|י7OuSƪF.2}\qmjoev1gZf nEhnii|f,\KꫢM{kU]k22E}m(T`5*##j%WEŋhDxQѥ(P)XP4n,B\}\u2ksK\# ?.yFmY+Z%ʗWmߗ5} n;:{N9RLRu^ D[qGNX:Prr+9UΝErrDN͚?`JwR_ q-J0II!EL `'bǎP۶Y!o=UU[`w ,ڶ s}ݲy=[Xݖ-+D5> |(T4I6I|zK&eQkʼn+Ï&k׊ʕX2zX S)2+r+qc1o|ٷOL"41:nn]S0A^VC^?'7[o Çkz|Yu:^( FH6pnЩY{@:?(\T,WN̜:=[ԨAHXX;i6a"o^OdT0'8S\H9pz &Bvg3AdZv@N?/EVD$$\uy_>-{vkp8º-4m  kW|I K_o'?mQIXk -s渳ŋ͟ᅨ ^?.zHuNq?#fK-[ܼy$D&AÆ\C|&jPMvm Uj'զcb ӍbP@KExKnL"B\n=X1?ZXŎ2^ܹզZ˦Mj9#YdI|,[ط//c&C}T 'Үyr})ha:+P@S+]҈-:DZ)Bhӆn 2@ O=w-GcG:)SL7jܼ¥x*x-qo%8+:eCpb@j0r[/fbp0fj?fECptyo 7oUV*O= E;O?x8K{aHK#G>g "O_]{Aw'NG,#|![h8o>Ny׀ ]w:[w&9pspt?*-BY#r"@Un$ S06Rm @/@ IzGxaА!z?$o7 @d7Lv10qbHp@ߎDXwmڄCoC|@\@Q 0[#@SOzlN ^;|8z:z Ҳ% gOgdwx_}*">nQQ*i^@_;4Y3mHO'.@#iS@NGW@LJQqDl,0YW@`BcۼYDG[j 4bbi@3Pֻv\:u~ܸqz'dQQDv|_ Aĉi @kRN8so͘AVIj7 c=zlÄxP^xA;ϟo-  @:u"$- @r}ڙ pU+K?z? :MR6 g%o^qܺUA$7ݤ&y떥KCzط/AHvvԬ K; Dň`qr֭I&^@X\"/JB|/K+O?t!E lIj7Iժ@6Q @|ZQ"?֫o3g"iZU0ݢNT\o&N$RݍP<8Ch?WPOGw;&F;®]V۲E̝ 祗DxefQNM/''"  "5i?]xcN y?pZ3\+'/04n|Ed8ͫ4JFyl}k|G}Z8)a Ew=Snφ ?mO}& IO'!%p55^X rh&7E$= F]zv%KvxÆuTfOXy&رjYIǎ[F-?AHĎ`F|pӻ ( Os{IJ:dw3ČF,;g%T)ۏ0~1Njl[NV@r`{x6mR_87)[V˷̾6_[:lѠ ;|)_%'G,]*[k@;7p#!]Jv7c4"gK=-<". ՝d`T}IRq(!I22ŸVtr8gx {]&:wVnб8|ѽzjo2y'fe]y:)TDv75[(wb$1j+g+W Hp(^C4o.(A*T !o^tn֞O\9c!QZ^xK nݍ' Ĕ)~}ZTmv"rd0Lzظ,'$?R4 s#^ݯ7 @bV0Lg;SQCEJ ENÕWEgw9p@BW$_ 才O?yhӆ x.ݍx O?yi|Q+5kq]p23o HJz?oݭ# n_JZțWV`9|X}w{XticrUpzSk ֛/\&$:vDMӦϽ3GmHڷC:p6 |h2[7?C(Rn9pZ/[&Zh@$;ԠD̒.ftӢs !!nm#.X,\“;+Kh'G{DS#*Wf/TH6 WD͚j~QgaTU%0)Xn5k" N /ުIeg`qSoWwrV?;YL֞c1H9X$~<0.' R3d5XSQ*kUXfx5Ѩ?%:Zt"^xA mڹ4t>\#v;ϓGm Gb׮ӷ;ԗ\_ߕܼOwe7N},Zc |+22^RoxN'V扑#lP! D W:dbci'ˋzj+^Q-fɕKԯv#bbiLîm(VT_` ݻNvJ$‚nM hyRqM7kQ]Evn]H]@_SwU⎏Zw4n!aC@T#23IVIOG'tDe)@ht@JvHVYк5 *ի#Z$[jU|B$x"6%[bE|BF *#6$[lY|B$x.OHO'[%%FJr2>vmUC'ԬIJѢIV)RP* * D|z)nA/ <"ƌO?-MSL,|R!x@}Ot"HNT D ZD.o_1`!|RSIV)X͛b2mRņ E*(ILSrb(QB)#*URER6?m޼"W. mڨ#o!Ja։ [K/+RàIɗpee='^xv$ops]$5Rr;7A)]R7[_ Շ5y8*୒7/ cw =:Y#|S=;uRj۽9S8NUo$yF\pw+)I}~β{ o-zH%!T,~p_/+:KNb3G(UDDBj!w.ͺublK]* "$Xe "ß| %ZN۪1CJ޾]^{xYnܨ^^rI5:Z|-u:,SbPbԡ,\MGҥpI-OXnj~)v=Z99jzehԩ>hjKj||0:y.=}{~o:#G!@7yv_.֣a1{F>-ZjR|z^tR^,5s_qt*VXKf] MİajqOs8k*|XE%HV[h; _~{`Yzė_zgT#"ܪ=}&W .y`0 r=.99*uZT}w NePPS8 ^RoU|_߻&L7!q!>n;vI!<=w_ 9 l,nY8?M߿_-DXpc {0ύ"eKw|Hv^~6oT_sT֯w"3"/uo޽h3"Eƌh<'xe}F=:PaBL۶̙AQ4qZ‹7"x_Eh~qqjׅ uDÆ#!o oj[w49Yr䈸@87?ޡ:;pS]r 9,p;7!#O޸ƺrwi @ob?p.Tŝw"k]9XFJGݢZ5"r![kg!>/>dI"2}mÇɓG9¦:9;RNmٳmGµ˲en%fr첲xI⮻Sۼv1h1B<%-pBRrԉ>睇G{N~uJeʈƍ8~Z āe2zv"Z?F 5(lکzVPcwٵ˖F@SL'*ŨQ/l=< ̝Z駠 oXyvd0A-4}=[jnwqn{u"ϛ&ۤ!+Iz?8Q6T:t LJO@Fy+Pzvu$&毿l|@S ؽ.ĉҶ-9>|8N.o1Let k׊x"}=+:PR @QS˗;4TƁ -WR,_>P՞=6OWLZ&LJO@ Df4&6]k'LPkQQ><piefW-njeFƟKN%l%#}{v}~oLND 1m]u>{6Y96D<-Gijݬ> ֙Yi/6ͻh6 䜊pOI$ y?ڼ9ҊO6@ w֭;m;,•W_t \95Ħ"mЦwR]yԪg/F\ MçbE z:9fdTO?T+W^/;|Ԏfo*vqGp!0;Z(ŋh•4J6R1LA\zr睆{i\fΙ-2[$z{]+Uts?gfP+Qv6{#G>w-+~7#-6$LJHɥd-z0y-[ կPAm򌲲en dū?h"t$McZ4/-\`y9IZ ?΀`S4oΝf:Y-mUp\~`jU 7ԕF.^￷:ߑzo%.281%Fu6k01"C)V @G*:Y+&M2vQ]`#`80P*^ܵ+ne/SÊQ@g !fW㓸r *dot<7hH|ӣݦ/۷{MR9>L:vED!b-U*1X/m ŊHjX,*8ݹ11V=tu:|_~ocwOIFGTFtrL|8N @_ݜ,M7׬m F^-GYd9mZ:sOgMV/d.R #kjI"XX}7984iBQ x7h @ͭ}֮FŴ \;_Cμ 7;SwYd%͇A|`kf@>S1* V mޅKks֡CgRSY<`9sܟ:a8xjOÇ͜޽Lܙ@GF޹ 5+K9w v8lzۿߝXcC ^[wtym`vgo_7G*dN>hjIvZ /s}Ot\4Cv,gOtÆ;_V&ևHƞ|wtW^Œ/VxHO7vcS^yv͗OgjD,nNT)YfS3CRprd1J2@f~<ωYɈ'ہyST1Eh:wŹgcvаa%53IGG5?ǨgLMf;Q>ܤx!n Afz՟~ ^x̚&aj/mۂ&yɈnj=?]XBfn?3ӓ'4VU$树+G? n-xW̼Me73,<YMh)R$P/YCVšC1; $ Y[զMf~o_txb!#4 蟆Ν=J99a. A3pžiwaLƊ34qc{Ocޛd|m/.Z6mnscgDb *Wf{hko5j;T4퍝uvAR zA.X:޽'6iindw .Bn+u"tDѱTGY^rIaj3ˬ,Lm K^"EtFSz˵D q䈥?Z.L9VR@9>`jZz3?yg]w@Pҥ۱Uܹ 6V nl}Y6n xc{bW7VR*V^+Mv+D~ 2oϙ%L}A3?g~6˕3W8ŊS8rfUYk8+fXR-Vj>gbN3'nex9yU5}Rx#-!_42 诿D<@۲fgQ@N !.tsё#}mnbǍ#G(R#SsS }W&j=<p[ʗWc|'}gY+f$EH}:axpn7>Gk ť/peuVE #ܹ˗2ez$ ;{kTO6jڵk&.AZ|ʸgSOӏغu^Ake(+c.˖wnD@>لBmW\8>ũm))jZժ*|ƍB2w`Fdѱ Ѳ:uDjҥEbb>2f1$mVW~AfT?M  L5s ~Eck=fĿ:`JSE smQ@s"aR.!֢Ϻ^0sK@櫙Zgj;UZoժjL_-N>~(C  sg(ns$3'd/,'EZ~F4̉s8k@ulе?fGpG#e߾P1%TϺMiFd/<lӒ?ckg{͜ Ѳ|96օ||(?F l9/VhƩRgݦxZs 43\3IIQ#2s6 | ы-6ot]g0QJ#aԨa)_gQfN/^pr>\a7^3KG  [LÎm ܪ?E8 SdDȚ<"Bz"WL 8K^R{dT3e;f"tз"~S3:p'OvyQ@VVXȓLݻ7_l؝C, { ^G͘a~)(a[YxUƩL{`jWYLe׮P&5jۜ8̉ϙC@˪Ujx##I"C /VnXtxL^hlCZ5cHZϺ)S̜d/8<5cp]}*F6sV ȲhĮ+7Q@?Qzuhp }m: eȟQ*={U<5 8[ٶ͖I,jr( [OO22Ww̝ۧk'O&{ ' bl_А}*dp7R^|8G+f/_nVo$ÇtEfkHW*Vحq>6?ܗߺS]mrs𠙣^ŋ͜. @Ϟ*BO5d`~if8?-…[Q@7ͭL}PP!cE>6̉~; @\֮+[9ePGYG3'~-. @–AfTB]]vCDժ&~ 7ҨLo_ 1cBXcqu!~ 9PLN槟sUo/p;=Ғ|q?fGM8=-U)Uy 4n r௿;iziwb쪜?6sVqx32#Eh޺`}]S'FHh.c`i~6k2TH@|"ǟcThZ8Pli2ۨf$ Y\۾g5܌ĝ+|1; S'DGר M-SiqK|< HRj婧lc^hz/7sGZ >Һ!gGw_ELo3s֋ y&ݢdIÕsiS4wV D+5>t0۹KsfO~]ey3ȗ_9 ^@@h"WmZhGR ! т,=K5kB_k"}'YT$P)B{s=wΜ9;w|3+ss<~<3J9s=dq V7GfWy4 oTzMLq <$ Jb׼i-R4l殻:۷yqx1,ʖuz&-fX<>z"ܢn]k|! 5Z~Wc;v,n֚zx?ݱ-fM<  <@"G ݲ<; .6-0hF;вShe8kܶmP+ڼyEl:qJ&^  @;vj]gym"ʖe0}z _d['a kkM4vou1, I<`|E i^bl ֤ nmU`Ŋ;wZHZ,@R-J. 4n6s] x̺ &mQĉj5yrwfͬ=9H3?J;ur Yd7\pA*jk=:fϞvHf]  vsXisC_ԩ,?Zyg5Y cFf1b0X\W;S+˗[RjO?m1O8,6o/h,3fx`5y!kx@}c|0S.@ ફ[nS!ClΩc MEK?Y:.mq}e PpڱU֯O%(mB2mz[a,3b0Xho;&05kd yXa۲̝GUʚ8;'~zˌ,nf^ziZ{oy|4oio0g5zv6'޽xͧ<IvZ.oay&/ iVV;日C[  ]X+V񹇐X ''lYkܙ@i;;[2kׂ-[Z;ZGP+Y8Rf>c``?XLda%~}@G믷\\_^I^'ŠX(n]-gn*֪Z /f6 ,*,*MeӤIA ooIً8km+ȍ^~QPN;x|}巌͹ݦ…g|  +FrdXPհ g5NK3R 2³V`=T >;Fx#ݟ'k'6oӆ۷LT,Μ{W2:o1ۘl(։2֧XDm˕YO+F.@kT)C |!#ǹތx g7ym1TʄG>D{lq`-Z8 Ddgh@,:uuΐnqb& ``ґE?u+ij@5k.r7Nwdq|f0_ԫ+PD=7_6,-[e'VuW+6w>/p*T+ڼ9O|3ipOxG-=dmwچڵL !wߵfvgͲSļrs"MH eD/`!I|kп } 4j8]&ԏ?fׯ~dI*3(꯿5s)@*_-H6ngɌ[#KeO`J6LȪ "; ? qf͚٬b0X3ƚiۺU8Z3`ްAlv/^,9{L,p.^`d4Is{1E[+֞KP СYzŻNq:γ Uo!Nް~Khea->`/B3ԪaC4V1#=@@ܓM/fEGǎ֚WYD*_-ZH&"T$V0ȅ`&k믭Ŋ E,\3 Al;!:pe۶;+WZۛJ-zA ҉'-_lΛ3OgWPpͯPADV$ Tſ >/WN/9 ׍,w[41p523ػ:XS[tvD!?ً9d*nb)S 첋Q5k&M-vı*=zLp xNnbcuk=e=AU @V[ s٬؜95}5B,ᅤ&V1"OmQ֚Y۝#/|}ZL=جj};̻F g=z~lA{+8Pıt {; Ql~ڪX"@ʲeb ;= mad׬Iw X&߹DJw,Xu>~Qb%s[^, N`6aʔq<-ZzzuT~)@oBFksԮ+"Txqq6 Sr]F:QC[ѷo$A_ZNbO`}l;:=U.\<]{f~(BR]7[FvXZo]]\nTF_֖ҧOYb:=//Bl'}  MFXs53ᩧDכ7;Y?8ܒ֦S߾E"]vf1*pe87ϗPSs"Ų~ӻwlV>BD ժ \ 헽0BMw53_iiB|(4mi7-0iƍ7Z i[6m%9[_)etгš{Nefuds®s,ÏU.] +< FbPdl?[3vbFm^_?g"-"q+UY͟oA.iz">~%ePy{1 {ms6;Do?؎g6k&TxcMMC~5,*FukkokbI7"h@N<"cӸ13u(]Zd^,W\apL:/\h|-Ggwb2A{}o1c28l-[DsO}"`;ڵM9`Vk J/inc``~X,wMva^{e}ر+Vd1[?85Oʲe>{B|3T{Oq~v+bvc켦+MoAeN :soa1:n3R y󬹹_>ș8QrU+llߞC-]jeA[<}TdIY2Ed_i.)? rv;6f 뙷p3rYyMA9:]l~7e}~ٮm(YR&[.U%o%ܲEMpɻRg);{zDK(ON &S$U)#y .g@fNO3߫|ؐ׻+ l&<2//,|3FR7v]\s`8sjqR֭)<w>{D//@7hnK"NF (yE֨!ǎu.HHLw29,B;\իE#-ֳ-66]1]/^,"s,E:7;w! gkHτV礓Z<рֻ܅:&9&% + ~absgIV}8W]ABs̘Z)#NZ0R=8=zp u $5_cMu.rKRҠC<Κ5)">At]S~NA90hH(((yW?{o}X=[N|s <1̜)}LO?ua0 =|H0wbeW_ws`0 8pNrVy vۍ#vuyƙ9өT[`0;%K2#4o`0 XsYZM*VdڝGhߞ tΖ-?;o-vfe-[:?,Z:8>*aX+5j8^ᅨD=g'E{ܹ.7ݡMÇ'O窫~ě~R%2rݘ1˗7fhSN C`s0^~YtI' C Q{ċ^_nޯp{hvD&bWN.qa qM '9<nA6AU+a|a4DFyW; hLM 'M>)(PkEF o=ot_t~o &oߐiFi&a:d?}ooajzDq瀅AW|睁M{7E$0 fD0fR?|~X2;s̳ϊ֛$%[U .>n'Y@?,X`Z Ï? 0]ba(n]9!Loūd7_[ J+]Z,P#ڵ3=2t{&]pAH~E 3n7JM3V\*?h*ABB_\Js7e{-\l(&$d@dٸQ,zXӕ]YT+HZ@X~^z*)9敓O7&sˎ8B y/?>>眓4`ލ5 ǘ9FX(&Ml "s m*Ib"V;&>|aCLydM}4"b 5!/y\$rif-zwR:5j??A-0sf @~ZBCی} 4K\hZ 7]ڽC2qԄKL Ԑʎb&kMV&k&w3JnɂyT6]wk(VVdѾA/ҥ =b,ˉ [˥2$ng;v#IgIEвv;W`a@8kaw@Yj[xܸDat28PSu%!&zM*~ÈgCyxdnJiyUi n& N;MUb,˂C61w' # tʟ0%2&tZC+r^}x6JM&)F#$TeMȹ ;6:+0믽}o>PYЪJx eߥND< s$R2)D4d'c wP=ޕ2L+ G(,9NlO໣G~1qa?a(&Cqf 9ټ\I{ 2}NlDdήAׂ]qĨy)0iI)?~=.  o .NIy@//~Ul3=W_em( Ӳ`JN'Z=T>j\ ߾GMN; 4…zp}-@")Cf{4[ݠ (Y C,'Z]@sG^#@+yh!dy@mrK] sHǤ1̆#D?QW}Ю. T;Y3A@ kG}]!Z TXhe|yIn$a18eAm&3WTJ[o$֭x m]vI|0~>HHt);jTDKj9&,H~KY( \඘5 ;_~U+#%Ɂ@ņ([Y Sj+) ܫr8y 9s:oP8,u), 9HڵTfjop*)},?>ӹs*C˖ĪUzKv[:ţI]cLZEww|avnJ<0$*U\vRZ6i*dͼ`"M[I0#/A{ahKN~ޯ5@wDL"/7)Pk+N<%(@EU.f0p{@`ĦPT{eR*g41wĘ1>*`pdѣÝa#ʖMt iqm+dMb907]˂nx\$4y7kR2Βcܠ/n, 0k,JN06I#~z3'/*}~p≩ ~{ߋ/&+rсGiS!Ep0x) x]%W]aC7IY7 (ڽ,`ad~~)IN5+;Zc2LWJ˖DkL{*ԯPQv&(Wo%bK`2R6c 0zU((+} 0VF5BQУWe鍀 @Cx:9`ɓ.AA~D&&?(_M%2k5s˖%=V̚}CG WĖ4(17K8M9) sSd^ tAR'f =}$vb_}܉cW܍~h.qȚT6 ^p@ [DO+d9  H(L+֮WLl )S8.W*&hBSPR۶z@ s@GY~e"1olO-Cߍ?&qaKO>^!"R&j QQ0o^Z"(7A ?b6.p+*h_L[đ(mb(^fWP:Ԧ ŒӘ1:Tiy5Cu0AK(5ȹݥSr=?(Od:aBG(p{C.@K{6M @fJJa+هi'Ah?>aCX F h)\faͽHJ&G7Ԅ !x_ݴ^}~7 EʀH)(vʼZ)tt o{͚l{(ҶD9+OHEMΣhLo^ bEF'peH>n X  U*9ł7uk~Hjp}_zU@ʎ p;\ T10y }P!ᄦL dABPsrWlEɿ2*tIL0)ǑDIO$[-rD x>}ܢr:GYnEmhC(0Soۖ~@m=trw Fd'M M Hz b5BzmPlCW$JUKx0 9NK|C/A`jdY$LѴG+Vd ~`ôNcږƣ?,TLi-4N̴ q!(~Je)

E (PG,ʹkg'$& Vh%v .h}lkP ?TFeWϾɜ(S;wZ@@ ED,< @>PN2tV%K4wnHz:aP0ySh~NYxU!dKqC 5ZÈoQ_DɅ Shlә)+;Ki:J3)G!%^}kf 1t{dt@TN^xDr @I)(GCt 6M"ˆ 2 nC`Ja@azt?n,'uQqMGjUC<>.naS6y&w),;(B/FMSx$ "J `%ɟ݊޽π orK 6s 5hҀ$g$gMOb;t<8R@<`m~+frL@bjEI6@NѶ$9d?$u{@w[4D('-^N'i!lw (+#h?W BsR ޹?'?|ћ$7{OiAs(t9 ` HMGրt^~*rҖ '%3 MB /]zmS%<'vE2daKAx-@4<Y S't7ʩ%!E%3ga`p\te!G9-+HS`tȂ{ eVD|'@&U(޳@_rs9@9(;Odq0$ء9n5>ִiT ^m訅 ̇:HĪ/0Py# T^GJ/b} =X h0i ew(/O86h)=-@u횊@d1 Sgd[PwQ/yz@0̥WƂ-@^XtEd[T f̲Ye{EKSܙ(Ju*SeQ>JYTP,Pz" UЩXY3_C+Q$cA餟'LÏQ'9n_[tP'`J3(@cJKFɟz, CMMPf5kL{ Ik¼s37zb3'FZ. f (6n4u% =D6ZC%K"8$C*c ph'x_2ӆ)*%[,PH! ۑ+Z;h,TsA;i@ЎBW^rI) ޽|~ТE"VA5OA{ysA'-m, F/= A 2g$lf9^-5^#@;v$p(U*=S;vX"_'껮G? Z2 ʮt!APsBf7m8\ /H g*1;~Q*UsFXOD)TL1x DE,Cۢd`51٠ QR2$+}&VtfQ#ah(9^@4H %7 fP T.Ƅ HdzRʃ>CСX9`QH+dI F/"Z,鈴 )yB,Õa4l%fh<>ɽjQ&NIGi[_?W qT`1n->*0aԲ)r x`1׭+l M0 {+6M:?mC$X84:9$>ƫ矏!OS!gѾA֕D·.72%-) !zU^V+ra,#^Cma*zRbٵk!/֯/z p+݁Gi>IDi%7LJ!A|yl aR6M̒ /|YLɞct0(a\?F LtÆ r@0GI *w؇NJCJƅ9m! #gb^0dQEp[qr L1a@ʧpm##|i"eٺUPo%E+قG`hk9&wĜd.ACD"j% Z *+W{)?A5op%f1K*%l@I)eoChbpᯆiRf>#Aj( +Z(>?I0X5c%yYNKgH=TD[l/@j%|y:tS{51,i? 'mtCsAt@PV @̞hV;C85 pXZt$|K2yLtd>q`A3 YXAZ"=6ѣ57:c@-t1L-XxSHvM\ƪ7@H60O$m f%䔜DN$4/Z[{m߼-޽]ͺuBRb҅rHM5|K)? >cx]FDrmD^UҶ쫯 0>CΩܑ?~䜃ӸqO 3?^:ܒovZ fN9E2*gSzܞk(2Ԩi4>FԪ%~z ϡ L$JbwyroD9TN,L?psύ):]<*ݰ!mi/Jwmd,3l$j+Q\F]}/$!u25>~h4^ 0inoWLTX˖e_;`Ccn*D&20 `AFx9Qg4ɴ*=|Pk [pPpi(;ŐGOPʗ_^t;LN3wMQU; /Pzm@`ы{L؇Bј,Byq@10̾Ÿ23M"jXYXA  cgO XZDL-D'_O4MlIwJD:UU¸ M1Z\cnxdTӼ&e@Dbۮ]s=|=JB^&-͹YR8YlR0"pAĮ"/Ҽ@(4jܸ4/}ţC{[Qܹp [:ROqmxݘ'Q/ժYLh=3(;q%sdxXUS7JW\׍Co@D&M4!' b8CiRUhc ŭG}1eRX0" \11`-נ?sbͣ`m:`p xcG 3f͘m#\X0bɓŤ8>7(; `0)SD@|\(M`8蠼?1 `0b o gb0 `s9 >`0 #x!qHQy:3`00F{2R Ə/P4 `0 Fo0`0 "gN`0 QبWv!b3 `6jbw0`0ʕku>#q,׭j3u*7#-Tʄ;Я `0 OxxM&_oE;\}3gV=&~#Eɒ^zsm^{sqosgg4glZw~}^?`U0}C`#ҢMW%q` {4e(S h^|)`?,\<%0 1+X(@Ղ.pq\6D-|'p7ވAt$'`: &}[ X;Ձiw6QO"xg__+))VB|wnοg}/Ds,.QG̝T0 U~`E fk /@Di0O> eKqͰajڂ E6=Hk0^ |u`!K$%^4PZO>6^_/(=?]pP_@E9l&~~+R5~1c.ot= Fk]{ :?Qh]`Аٺ5eHU˹DP_#aΝ_",.H+?Hs*T|[8+?P˗IDV XF* Ȱ0N Y|R^ ·}V)rwyZ(dAd|eK3bz%RW/"3x㏉u[nqcE۶W Rډ;vLj'&D;Bì[o* ]51Oz$at+/T{%K?i^e نfR~9OcZ5˂DŽ3y$Z5}%}[\:f"QED}{/~Q c Cn+4$V})n)̚tm%*, ŽvFWnNL8k8 S2ASL :0ܹk%;7)n̹ 9'ctEKkf`5N_M"| $;jhڶMu*[6 39L$ID3Pβhw]C@ĥ/yN1.\^fWD+qA"]OZR+peWA>? yf+`]F"(ߞ>/7:wN^@MPgЍO=51'e}:5inhP}ZC`ڴnĉ*;|v{pz@o-/p{$ѮXW,mt1T`jϖh*RU8zx2=5C:i7@KSZW, /a&bΝWd ~+&M[ԂP+1Z(H޺Kc%E?\ho=eQ/=$`Rr1f)4q`0Eg2th[b$ u(W@%Ayq(d7(n>Jgq2Q:--HT8*J-[s*1! KH!ZkG:tHKmeyKY^y{y!~=0vl мybDhz/#hs,Y;h#n$@d#_Y9w^!ȣ@ E^Z1n~0X eɕ  sW L>PunEa{$@}TuϦf 4(B`m%QG+zʽ9bͩtX,o wo%pgZF@۶7"˜9%K&t1݊|{.O{}3_gvr!DjJ^ۂHT#Я_>'سq *b~QӽvG{'Ft:f m()hLQ )Xɚ9wM4X+CCvB.͟+$gw=uЖR}<}2h%&hnd}&pbQz5'_YL)ओ-3ӪUj=c bWT) 57Z 5-~M/X(fl rbDlnv|Aȭw ]!ںU(|ُ_ ͍)WolZu#x> vF˞ J;~Eѿ:)mr5r0/{7d6xiwz ]@uޜC[ңhAw{34-Inf'$-tkK`4}x]A!` /uV%#am^>;u0rd?ryA m[@vv76lj]m`Ϟ +^>^[n5jU?Fq pA2}]5#y-(iyr(cPDVa QbJ@&]ͦEP.° /aڝ?0"c`AHWpo\_D)d\q4]<*3xx$7 hU$Q?R3R@:w5$˂"W|把}ww Ko0l(84tѓi0+lYA( vԜA|eڍiic$93İIgs OJ8~WdTc{`B\P`RdV^CR2h:Gzl͙ͼ(0}9%3u^,*AD 0z//Uy];KX T%j~!qq9/(U*bϻ:aav]3JnwxF@MUqd$𤲝1bB|K,`VރğHTjfXVCSЖe4Qxhe3b_Č@yg'\?@ݍ>.)nP2fj9iQ)HĈa=GЋk)݊k/w^qC%`(E,  zSZ~T(w߹ ޚYPωۤQDJL Nk:eBErtY^~tGԶy!*` 07_q=ɣP +(㮼YIJ\$;_}PAxHS%(GRCa]u x |b mx (@J. %+KP&Jm~t6$L3V"dzEqeep*JJW}M /fO{+.Min{﹗y--$<{Z@*i/7]/hO[n]Eh#, ̇w*@ =3PL(»*M$6oV{QEpX_պ\.0ZLt%J@D9NxvHJY pnP$$1A0Z)i+Bkn?w/!iE*qZhcWb@)b&}(W;*?"P-@i P/( EQT .]F{+GgJ2ms>8WF7-Ti弊[{_d\Pz-XiQm[ou\;OQ,@)AsJ/GS Z_*P\)/&V㵜pàPnZmr"fiG( 6/x|j/ڳgFb-jo/Ne-[GJ Ň,[:͍XFF^ŔF ݋~ؚ 䚤38F/GٽLUΙ8ʹJ2*Y>8Q HMH[ü)|\CwMGxrDxWd@ͷ(E w͸s2Y莟tO_ n;`X;f[< `OKxRIb ȻsR `:h ,G*(f>^oz~a.bᨣk4d Be4JR)E]_+\}k1B)c ] }fCʲzuReb' aye:[H= !P%'+4HG -w$ lѽ{,hY=֚}D/Ү^ueҽG+&L'wVs3.^onl<(+QtU_@ѷY("R98zܥrAf2s4`oұ. `B tBjޅ|X`bY\.JVםh8P T>e^@NP&\vYU%N% 5諭ޖ|i;{ϧJ|HSY@K4!CkyD9aweJ4oƺ'`д8}4 (c-Р;xWeAPtGhfN!PJ|(@6@Ӧ9K!]=&?E+cK>φ\ ?H,')o-s`犢hޝ,,I4x@۷_s=v=C4!EzSM򌰔9Ϡi_g'ZX,$ /h4Nt zfp䑁ėξPVMK$ot/<95TT?<oLרݺUbQx=8(@O<1p^pg^{ Ly_ye`Xw 75g"jb6m^U`qv_k74cFtǔ4F0 ڵ]Oɳb 2C@wDYx;L`~:|]r}t;ZrIޫv;3<]S]ўkCJX%7ipI~~(H Уdț0Z5/"/wĈ'?M! X|Wnc xLmT^ 6 (,5Kd(>\Ub}ZdZc ,nJ{V] f\C=aҤ/4eDR: Xp\JM:D0fWN2$߲2hD㷂|b ٰM,4myIS!%}m(F(&F4060=W$t&f(2 `%yHQi^!7%UPr7Tl0La)A]ʯn_tF֭zP㝜$@ A<Xc2CS߅ 0$J?(_>q7rŽAob8B~EhY07fuNM`n56AIfl 9MVq}̘ +a~yA`ө$mR))Egf*LW]_F1&Ù`" u0;!~7C0~YacyXn*ƍ3]&U(fJyćrD@b]KAلYCyKsygd'h'=xݣ!̑=x 8*zh}+=񇲰bR?u0(887գpk긗ZNSN(~':oT)Ð(An9D/0kM^="Q  L{ k\5ЯhS!|S\45#WhVz/O>i:zuah DHLns) sE=CoҳgbkBVƒEX답i~ Ç#GEMYBI<^ҥBbCKbVSAɰ@@RishV0B hۯ ͚E'Hb딌O3,#\ "+V2X`-4$|}euX-8Pl^v,^MeAf瞂ff][i?):ngl4=ei\]DLը&050h 菱ВfnϘ1ᬳD(AhIp3ԩ" }Q|CX0 `0,iS9@߾Y{ `0Ǩ<08`0 `d;2#*i|Y0 `05gP\Y| `0>tμ`0 `NYB׮Y~ܿ `0 P(, `0^yѮ],wn`0 F:t`A ?,.8#F8vDz΄ NlYg@fž{rf0rwdn GΊPl7#hЀzFЭ[)wk#8eТBXTLпNX0ƈο:tУdIg|/w؃*ˬ湿5krf0rΝ?tvp<[`_ԩ[[KT,"Ve FwԪM`0LhiVrS0rY=]4kWYx}w]>7NkkZ c8}ЈlpMNN˖OUj_m?3bUx`$Uމc}iIԧo_q;p3esٛ4I덷j {sNϞ/bhwWk@X345mRv2%:!WU5? u;UGp:˙4=Z4,:=ڙPD=zc퉹' t*h^XQNcAU_\ܴi0Jbש +YR)쳝cm;mڤx< 1,@\SܥݎS9 u2z0C:L|3x0W:ATIN_}b>:( l`U`l22 L&)Xdˋ,+(_3$ tJ_ow+pC&7V ,+N _<ᢴ…3d.?}}֯w30=_k֭ -G݌-d؜l\}?]LQngx,S&uxᅉafJfoASOwzJ x}}~0bl]41} vBPGl{ 6IDyhFL]`W 7W6v^ >J`Pw^}5*GC'ٳMJA>^(Dq  ;?} aė_TchcIlhN5jpsR:-˅BmPp}m%,ͨApƀ'0xa% V.իMn4~ r #wgO!ey%3CYg%Ȳe-ō*Cwјg gٰx&$L74j`!Dn)Bcذ8^b׮bo_a]U%MsbFen~ 0] QLb)$ NSv k~Lѿ:u>py@0omG0ۀ]C'HN1BDePʡnD&׳1NEh3~8ʂIQnyH(2h/wm5ӧ;K\$cᮻjTuHmy޻ T\To` 1d]/k Ν5?e(W]IA."YZ/uʌͣ\ڰ!srA{lIrfŇ6[S;tпK\!+<>H߬IG_-;W@bRM(YjVܤiP(! "x39'D\!kƍJrκue_?mʽ3ܕW@Ϟ>4%K/5" oWHoܖW({ –-iE̎iRWwygCH_2P2e\'[F}5r!JII]D AŽ-ZB&YF׎!TмVQ@2(J5 u&̚~F|̙wީ +\tQm˽cH%ź \Vvp:uB6JSNɶ !(4aCŞ{NՠEJۣ 鰄=;O!1 z;wI.n*G0_~~޷oH(Zird 3ϤW_ƒ{vdMe&p!L#GWe@{˗]ICd?$M|93,6VR\:+a +TBS% kȶmyR'EԞKY4kv oJR2Pigc5otL';ywܑm@A.}&@ĉ|@9&7PCav;82$. 7No@}2@Eg $,U"k}{ 6fuk'~ҢSO.x R*ZFLj|C   eKNYr ,6@&ћ RǰRjR}|;A84!.#38coPZ*SnjGtBlȀ^ c5j>?&Ǝ=K2"grś[ʹ|;w&q t>ϩS'1m-{}YemlGM.k&͏P=cEgzѯ_"} (OHp L/ʔ\V.]xįty$yiɄGH X(F\ؾ5:e{oJV\jz\ܮw6]p `UBDn̛^Sd^e]`n91Aw鞤Kɡ[ݟ&~YӛV,XYf u/yH5?Nm 9^/E&䯏N"c4"_<􄞑o)FwEHDcdz!U돮ur"u.UemvT)'1S6ͼQ.Mi#>̆ C0 IAL.{DTU&ax&:?M@{Vp:]ZGzĄnآMrmzԭRNnMhԲpLBѽ{qӴi,K.cnxSm$0QP .%(ޱD6zE7wu@.a 'wAkrfTU93K /q%QS!5l(\{nS=XJÆԭRe9j-[[rʕ [YFdٲ"S'WIA! _0ikM̠_-4Ck0P&p/>w<覟Ƒ=ZNj|2ҳZX=HPJl̬MM]?vv cRAZF Μ`xo G:dZ FK~,xAmۦ(j%]"5κu8Vo8S;:iڙt`vn g^(^wE'Acx==:_ҷ0IN l_3Դ33f=%㦛b(7'FR}zȚch ݐpð_"C{ Wz*Vֺ!j6_a5*ԭTuAtH͛QTÅNT2ȱ6N95A9+#\/ü97% h0֬.'ϝ+bVG ե7]SSVU iR߱C0iAMYѪZvK)/P޳gxZH䈌h^}5A 6\9 5?zD bP#\{mx:vL8D'+VhV$+0c*K:3#wеhko{b|i X$i ?;ptM+4mG,WXRͻ,de`vuT]\Uw;[R#05i#QGXfJhߊ{B+w<f4Чmro`tV\NQ?x+( -+jh)1|(?iP(c,Jx]:)|l.A2Jh &۫W EYV : 8A;Nd1(B,xӀ~'bG9 :4^G:P3\ Qȅ_ލi rDͭ)2=&ivGMۧrw߭]|=h)VTByȀzNkߛ[2|l`eoϞb^t$1~A P%E! cOSȴpft}q@G( 9e\P:~0O# Pc:6I6wSlz) ;SQ"ņ( *b*R,bCQ@ "?wdrgg2['Μsm 8%Jjx$Qw7cx/"!!y|auuŤĘظQ餁h$-.>TJx-CҤ2NI^RIP,%`3JOEV6[lUt]üsm.uNiu XBғOGH Ho5TɩslMHkV?kR'3fiZͮ4K{%Ҳ:1c$5y| ^PXDw_):rH3{ν|u2?/wタ;)!*o9sFܰAUyN̐ƤJrP-bTGL@V@)Q+_& ScI-Se4KY+'p+Nȸ cGʊL֥@ kT׶W)Ԥ6*2!Wד~|AȾ}^|[5y!s:O{>x_X&$ǁUJ9eJ_ސs4YQm_+ӄp k>D2!ڃ *sTRJ!l$@%r*(W-8,OD:GDx$14H'/7IihZV.O㨲 <ݗ.%[kZpE v;݁=e2EEi'Oa%OxkkIC2f ynUY xcl E1<bm`1 @Y]^/Itt2<8,]^~n% WHX%K+3~ ΣP5$=7$#Vbe?Y >+mBYg!? VyvM<@ئ,*ơGX+P&q/ǻ$uOAt_{ +?d*Qؑ#xp)a Uw\ =xi؄QLLm^^y{"pŻHUO؍{Sw!,fը[ʴ<H?H61سKzBj ͤE~K2SL-rg P T=X@Aui*T!4[Zŀ NC=C,jT\._ $%BmyOz#u:ۗ uE<}?N PV Lyuv#\"{p qΎdWWlyWHa)uTUqaGE2n?gBu/ ǹאzPU4Hx ~ңΎscɏn޼߭!C.r)U{Y1%żnT_mdhW6xAAojU6$d9ShOD:.?ݼi'6a %-&SrF(<H$Q %K%+V{QPSDy?۾eO?MKT Hvl )S=|8 iܺ<ẕ/`x\I00\'2fdCLŦMG/3Sў#3g\9Mdo1%pࢂՕX%Oe>k#+k6Uһ79f)} \papnֵ\Ѿ8&%jO UeWTLo Qtl6EpPLYoKrҟC3SGyE]{-95p0xޝ< {X=‚A'e!s&B~oK)<#ˁpwQRwvyU^g35-̑uvn4*ܴO:=1>MjNk뚶H00000000.B@ʞޜV8L{ _EiL~HW)2fvD&W3n)z46` (?"*)En #K~bueǦm du)٥/'Xq&\r6| $!>vqa!6("Zv/Md5+iL %L'$7y0-m֕6%z]jnu<H00000000.N?@~1x*ԢVY5᤻U2M6G|bR-w XgԥWesBf닊˱ EsZ$5jvΦ zFe7E䶻_a^t~etͰMu˃蘁j5~jqǦRc`^g7[uÎ!3iՄ۴Uj® 2o2R2`7Gm@Ѭf(lUqO'a@q1ܖ I4la4ZT!;&-7'^@J9L\'P`saQoaD!%0p3 )Ym33 DD4 9=FMuzh\2[ssUwsFD=H+1dv&ƌ[N$p6ƢoR $JbaA67mH8]=b.bi}R'ePԕ1^<.&k &RoըSKsdM1:YѪ7& $#zcK+ Ymo:ux^H$fU06Gg5忌fe&p˟UuoER@NK[1Ixn@ ":QRZKy1 $۱IE{F#UTPH+ E=ߋIv-mͻdLE? 6Εt@~{Z]R %^ۢ ]`yzl.4V6B  n/k3.6Jl:3,n4ef5Q٦}&:-?#Aih3Ssڤ/+LKo^l6YCp]vDDyZ`=Z#uWv4ѭi2_ߢjW ]" %@vd Qf='@vҟ\Bl}qvp#$)Fػ@Q/<V$א~戴&lf9-: SM.꒚٦'cm˿҅o/uF;(DV>iϢn݀~&Zj| $?U-{ep*=`W%uۦ{Ҡs1@h&"V'$7Ѳ'-J% *O*Y4p7Ss}kBw0 $tE\ 9V-Q\tVҒWƸ=niRZCW|1)Eg/Dz~yaƈb% X*4]΄䗹9Vmh7W6c EۢsBbM`)Z"!SfKbZQ}J+Io\ :,촺 [ov Ӵ4zڂ]K\ǒ?yev:s(kO 33 ڦeMį`ުU+Tu5--y<0+s qqZ:Һ8y#A녈Ѹ|kLb^A{:E@&cG FŹFmݸ]eQChinQ9&'Lnۻu--S j*f"6J )%&1-ie?)9esKr :8~\lmMD` h؜ѣUo+n4~N6!6A~WT~cty% 9^g Ləmn֪\o\|~Y|ivs<H00000000:Ά.jVԴK#n4Z&a2J]آV9Y%e洘Ԥ1ȀUa9C2iۀh Q19'e,HPJNsc - SrqBNi͜v u{F9VѴgvږ Mbh8cITHL&5&w3hSwڬـ e: ,4, McR4)q1+>INk6/S=[Ѫϔfe5'کyTC_ʝsu 2EdiWuO $ׄS@'!J{ ! p{80 $5vka~am۔,JsFFi-aDm;&cZ1usHPԪyI);=W+-qF;z=sAz8{5>0)nLtm#VMhX#f' lR%lҮO&]cH4AMwC@ %91dWRajnY}{wsuSO>U5%rs^u?' :ąl@Uz.9) SsA^>=sAJ툲[!AWJU$G眹_^tHGlLFbZQfAV8H+Ye:3 @iUC?`r/Q3'Fȕ<H00000000ӡ*VԢgrZ[mQ 7 %Bp/ZN_W،&%>ޕ[֬U^%nly]Z޲fݛwspuAI{C pET@ Hcƻrn FdFE]۷葛.19?沛"mZR-'!:w;/ظ6;8"lWD:FAHnyPϊ?XC\l|a r7%fޤ]&]qHML&sC GTK UD)+ ך0Xgx0000000000>se];#yq^^X]5U=^qoMRQXG `(F@ ۃnS[K @@,(d SMfΚ(D@@ Apܹ?ܺg7=쩻<6'|fW|ؔ&kmDU ),ߪa1ZCZJ<$@ 5}dfD;vCkmD_CUx#P$e4>`C/U/fr  e $H@m?<Y 8,# @8{wzYnU_WiP&2%'$&d%5MH$ N^xlxŒv^OAl >%6nse<$/~i<$@ >ܹsYzp4{M~^yq7NlPDND"%0&9U! @Is=&UkU׮w6@uBM+S*5@ZLLO<2A@ 0;Lf8p9F X: #&b;.AIPΓXRwD@@ Ν;w͔;bR ^@1x .תĐM%ȜCHdnqV&%6yD @ ?f'g$fa0Wd ޜpVw9x MhFH16[a940VZ6ID @  7~0֑jUٯt*4iN?>zg?:pa@J@ԄVcR{<$@ > %UY4ƣ )&m%0&5ă 2l\[ M-bxH@ "))UAV )8&U:f5u29 k/l2{*8yk \2ⴀFSg<"@ @(®ϾL,rL鯻Cצ֤\(7r s[&vc6zRsp9}^'<s[dBh-DBS@0$@ e8};>9(QH.Eǣ/p&_~u@苔P%P:O\*!f!N?  aӊ~|J$}zÆ >}ݷf͚'N1A {ijT$(k]o]c I W!d@&zZۗ lhjդ{s:€`Pc䬒'݈ Ceee5`̘1xX@!4 r=&`670 ||+(KZN`H1ȵuE vx7T"@\_NNP<2@ x+g k鵧844 @^{s~nD_kyY5jFޠ.S8n@ Y=ܢO+;l"q -Z;v @ G;"  g|]P-021C|%p] L鵐~=7H;=aKXڬ}>g WVV :Y5y0rs>qD4I,j#"0]'O%+SNf@ RXZβdt}H}]m*~rz>iZ] k5tȟ5"{%~_K aő0l0eOdz… Ϟ=@  <.&aQCN|m\mq>_N4u\ fbwW1!ĝd X*gȠ`ynu#\]T~xB\AXn]hh(O8xX@ԉ{gdvnYlK;})I@d~M4!=P\h׹R~5Ъ-3@-!Oǂ[ecd {AaJZ-Ϟ= @ ;ql!=WCmNχ %>rk "H;@ ꇺ˄"|l9RJ,?&+Νڵ @ _Bt4L3OF9M9)F4:Ӎ }i" @)}q`?eZijx6* :T!魯^|xϞ=?~w] qܹs'D1{#L*I8&O#AGfd=4'7O(6Y s/!\i+C2.Q!nF%uxrniEp9-[{Xk߾}J>>;zrhkJmݺ7/KIB9o޼{?~\~׭[7q#F :tܸq3g0gd޽ .vΜ9˖-{W!i;۶muNztM-|ݿ]W^=|萐6P8wߎ;|O_qIC=Nr￿qqqj#""cǎrܯ4ѣG9kfp?su/^"T6nܨ({nO2n{W9/_O;0o%4w\8VV=oˀc"\5oڴ .7ܹs|׶`HNNnٲeee_umذ!787o0.]?ͭ[msԨQUUUcƌ'`Vʟgy~+WOsZZ -!\[K9i-&@zxOWI-}4wFƛQP`3naUxZrFvѶm:cX iDY2F[oUf?#*:tsOnݺIsRR{ァpSvbt@nn7%H&y8D;}d>R+Rk: r\~\RZ.>y@șY'@:+UbO8h_NpAP(|EYߜPxmôZ ?7//' [KLL +[JVVd&@ȓ(&]NyB NJ}srF%S2ԩuI0k }r% p3~S SAW&!#5xHq[K~"gGR%Ȥ^{O#‘wuW ֮]ٿ;?oz1Ũ->eK}B28![TL:|(&1Ǟӊ ɥ:wuΝ߿p;AƎ+[ QV}k>uy.]~A9'O !߫Szi`hhhP/III^禛n[}h^{5%2f?pܹӧ/l@~5!!! .Tqd6A:=x4_6۩S`aWROZxi쨸0ZC(NC3~Z.nPZ*R1–_}q0eӗNpbD#w>]GUJ Pv\I#?6OA 䡇:{xn ? &a '.v}Ń&|K׮]U |r U ܻweI727hHУG6L\$W 5'yȑիW{-kҤ.m6nLY8}̌u]' ,^Wwu^/|E9{K,p0o??)S^z8q,\3R{駟͛7/Z( UMKl#EFF *&/cΝزeKP'xB<8 /ȯ,%--M<+ clЉ:0`#F_2eJ nya fc۴iQPx3tXr=|nH<(hD*@yׯȼE5xQ{X[~ ] !IEUQ"8q ~Z <OR9HJJ/ٳb{X?6ljGٳR:·K3?J%H.]T(O'ׯgH6lb6N JާM\"|J޽W0aXIW~4~ƍ3i۶ZLyF-]cK?~BhO0)Q5Ara5?D\pԉmD@z 4-ĊЪln?tD\|)wEpEs1UW"vAz H5HG.:%^()QZnɓ/MuV)i_~E~]XJD/̤pZ>} > ΅pO=U~@vv6"9s4L2;v`ʓh9x`LL sE>xYZf'QP>|88馛["l}@\!x G= '͵f3-?d Uݷ$%e<"_LIϱVC4&dBrp|(]T9ͪshr%"[]n! x߂Em&C 5/35h>p[@ju?K!!Rdڡ&7 >!` .@ 6崺G܄HD1A z=s S#bŊ#uMռT8|6)~Km->(4AJ}`[ mڴv‹ϟ|K0uG1g/Px3y9,bիWD.D( dL~y|[۷o0+ msԙ&Hi=I35%n;^Nē!p? ؛K -\i̴ "gu\o1v˘Skp\ihb$%%Ӑy ~*ST @z'Nq1{ޤDcbb.A jr[3J|!!S3uT2&b?v*\rxX;eۤk+0dT_}:G}t @T_oj`?/LH*!ԁ)uT>J׿/tR҈KKR{R /2 c.?+={G}|!:/H@޽[4%[3r@2R)Fp 0*Li'ӁqW|UljhM!5P_*Mp&c-0 Bxc`6=yVQQ n6 B6;f 4`x\Y_R]t'' Xdϟ?rr6 ٳƫ)T7O //!ݻW*P>R5K#G}D EP>Ad2[nRa2BmL&sM S`h+E+Go'6NpAE>T3k:P(Vb=*!Ā*Ҹ]8y WRq# %O GTBWl۶tʨ/^?s8RInxz%eee\sdHY r.J$ !^$m۶5K\MiZ^3gRL处N Dطoߨ(8)S['Û7o+S<֭[7b+~>  SsB38_+$$Dدt p=w.ޙLswwU*NuKMm] &? XkXI~)3?@^X1!vW($$7?^yꉜ.fds##5s@ (iQ೘a~Ϊ([!핚3Mr9x\@l=uT)K֧ggp @^[0sD!6oXfTBwaT o`":~x6t:WG(F^1ekPĴΩQ@!t5#_*'8P (Zh!6`:e cHܹs1U'4/-'RAO^֓Z.Y!Rʞ6Z$(l_$5pn_z)3/Q1jF&RҞ8@g?<#Gj6+j 0`?N94bĈ&?UV~Q,|QHV\YG<#&I65P6r%jڷoo m*f"ذ0_ @tt/0u`dmE#|+;"$V#G,T ևǦ׷:狫C4鯭#4ޗaVbF?͒= -@Yz|*$A&UUU+'O)?6l> TצvMu8w0)@ @z!u_{5 <(?@CU dJ>姟~4i|sj!.pAԅU|r*^{1&`GGPQQѽ{BÇ&1СC}1,$q o?zdjJ)%غupΝ;/[oշB'm,2Į'}DG)uq?vAzN [/Q  0KfWhF\?GT`sa)| b$ l "_E @K{a͚5 Lz=ztFTl޼Y*H5ד РA RR8xĉK/Wnn.3ZVI_)1P#2MvL2E9ٳ[n{D9N%gL##n& _Vcǎ &YA{L~3.fAׁ@08s+.ݴU%}FPjH f,V%T!72AFC`L5a#tahcw)O(׿ۋB< r%k1 VtPV"ԦOLL @Ǐ;wܗ'DWW R26YA^ʕ+>i^2#Jd@tޝ9˪S[㧟~ %î|IbsU2+!QTBt?MdO!e'A/ !8D jAxuS PGW=gL 1. h70% ̢ n5p蛶_3@ t ?P).>xЇ1 6k,%k-[>zh3gmShѢ,e˖}^u_%)_u̙BX1.{32B1__ Sv7*1zcqv(t[o٬XHڱ'f&  "sRfHjA!?pr%G?W V=sy?\3yuzkb:&W_{%Lѿ@)<309\cKL.oWݡ3b՚y#Dp ]xۧqb cV .nĽ 8 6'C~g,YĿ/k.mݻH(fggp?<3^>}ێɷ+'{8d~<򅅅J~b ώu rpْ&wC9  V!O?2 F|E0*]B/^匲ڴDGKmJTAIo-O"c %HُFE׹ ۂszcBjqv!R=N=w}?$kcxMd |<{?Yf^#ȆPjjȌ_c^7hZpP(μhp=zt#\.EL /?+oGpu ukh{Q[hU"C_fps s``7l3K!,f'B [ n\Rڴojy%@&Lkx\H^3>>  &$>J ._pǎR uIe˖e&mȿ0㦐l߾w9s`ԩA z%h` Ɂ%p _T;wq ٳgEl 3C0G;::(۷o2PO?Aԁ@ԉ7cqZ5*g]m_&E&@( =zA"LHfhԟf6~'~ eHD+`:ǭ#W{) 5`xW|wfC , ɓ'E|B"u[doժcg`sarO?1NOIJJ \g}v*)sNg_EyyMALs:;)6mf⋠a3u[A[6iD!`*"""| 29Jl `۶m }%}2Wpw3{]8%0p@=ԩS1JuСG(o6>]x-.:8sL~ڷj3"Kk{jZ7 Y,97:U=> w&j(YTYdB56*sqRlLfr^wt;j'K eE'܍ƍ+`:u˖- ORj Pj-% ŋKmNSI}_'oF;ڵ+/ȤY~a@ 9t~1֐!͔>,s7o|q c,'lܸO?-0aaa…&Hbr^>>ŭ=< P9`DŽ 'ԓ?LnZfMI0q &5ɺ#S;Y> @ w!"$hŪČRa#|$G`~52u >ÒyA,Y"zK?326RAFGGϚ5Kä́ Zv`Lw}!&E,pq1YRvh48y2¬UUU0QĤ )>YVV&|^K&""BR?p+!!bX_}`MſG^nnn}@ ƾ0G ~lc@ëMNN6Z5-Jʸ.|9Pv! @p~W>V^]oBFdYHNoɈCZ?}N%Ǐ.ѐr :8t9w\~X;^}ՁA3$yw 'x nLJ5k0%2,2`zɓ'/ظq#"~_H-3 *+uf̘p^-Z!`CCC+L#(с@Y@ꉐsCXaBM?zY C, C8O!O;KxSR5=xƑ\BrDNO*>c*FOOq_ 03x*Q!f] 8MՏ?8<\?ꫯ“_~L _^ @Ϟ=g(«K, 4++WA×}ꩧ$ hp%10Uo{&sӥ0n8XK鶾 _-㏃K8˷>3JTdb۶m۵k:W|wRց maÌb@@f->\NQ=wqNs3f7* ky=P&5 <&B 9C1RBJ)r%5KsyO:KE0 9r{'3"j*q0`xeuL<9@ {}l)j?hm|_Z]{TniUz }i܅  ؿ;NӏtH@Gr%%%iӦ2GI&Js̙뮻NaL7rA /04d*z7WHa„ >MHW]u=o e=<3PXXR>MyzJ&9(ש_Lԉ^A.xcTn]'8y$ ;/(S%VJ,?UA[:[T!ߗrEA(7-lA-k%ϕ >!s0sߦ:Eue[4H/͗H ;=َ7W;F#.38vmݦ|)>>GB9`222? ^*@| ɈR 8^ѪU-?H + |Y%<\.{+yt| 8RRRK2F@Η_~111B"s /vѴiS_o---<&::C>J qÇgee9NǭgϞovwӧYf E,]ԏL C=4h yN< 1w\ٓ`Nwuuu;ѭ[{z#G C' y?\6mjHQ?HIg͚?7ROsN.c#@KJJ8t؋x1 \ :t`~;>?I%v=zCc…^<6l@ZkKe@*O/F3fKK9wJYwZ@pBW5nqp]ݻw9jѢ,^u>vgbF1yd8!!!V"pCtD X1U!C+T'n_|e?W#rp]HT13EڄSMNKUmܪߩ߽ $܂o5r!9ICP1zXZ~Y2|ĸ Ϯ^vt08$۷o߸qڵ qطo}W^ {쥗^zkyWΜ9_nٲeK,3@`wi d`ǎFk~t@\H={R;3!n;;B \"xbлzF'kӪ=*i3]c}:Uvpe?ad@3HhWWw+g|}kO̽o@Ǽ4+H*KHm=hP~^̛s-$@ />GD$/o7L! *DLw9mNK|x%A h!~ĩ@gbǫw^_ YF==o܊#zBq5UIiE\A#:&Ƒܸ[z9%U-7'ߑ#xy @ sFDs9F':zN)DG_*n-:@%]}%cnyrwnߺuΜ0kO`JfbLu`8QќU ༲6VZMH@ H8#-6wHmz--z y**{Z{ak6)"rᡁ4V抿ٿO?IYeIy-1+T5YX7mѪiOHm[5Y<$O};ǟk @ 决9#<)\_$*^Gz@ {:xȀoH\ @()"2عXVٶ`*L>(pZ/"'NlY+.>g˜acG3hT۞Û =_À@5sΙ\팎 PZ=Ȝ6mz.9vИ]@ r0GBMeylz-dd0"I̓I/`Ր~j2+rmF*h: ,ko GT̝33?{1njױo}uC7lhȜA*J*: /(5UTq TddTx3$f90~f"Acn|<@ qc6 xk5dh]ΈZ0[H=z"Iz~"ĽE^Z#DFU`ڍ5,e ?vuêGztp쟚;v=c9r[l90> ִ֙_f\K@iU%*>Rd$eMlHbR z6!E ^9q+[$@ KOLRɿCI5v^ 2x_*ûz>Nܓ(2! ! xHC? :r $&ut};jXuFnf-;3br5rE#3uD9ӛ1p䄱{:jjIB##&3֙QYG5n3!գE;LjP)*dFiMp׶|e;v @ oolݦ7CiM<9)Ow-'d@D~0X&d_% WTΐIs,-B?-2[?7xz#bcst9`a7_S ~{CU5UoHHmjkn}A?׊/4g7 @ rqC'BtNyyC+8U4?I*ntOyEِ<ym9wrӲ[-rZ5W'50G,ƑҸsQבݳx~?uj{VݐjHF^{D @{Jn'"ۭIkjuWȸ{v=5</=\p~ ^K 6cdJf+1b2l)JvF_[ @ ? u[wqDȍF{oL?TX߯0 c㲪>9wKB f}SiM|֔'Pd8GiMe i][R[Zٸ*;U巭jܶ*thVVCT+%7톛8tLH@ ,={v%M{:ce!S}Q$˷CUie@6ݬZ$_E%􊱺m:2Z/8IYeӎ# k7qIeve h9E}'tlCBpYEvsUrDؓ۵3vNXW@ K{ۡծM~ sZVaw&+lոuZFĤ\++>6=cwF;1f0z @!naPسPVk3()n0ٍ&(N/(7*RyG3{צUS4f(hRfgg|%XcVNt.I#ng"@ qcLKL+bڕ$x5.95mAw-X́o'Ͽ~wǮu/G- *RE1VP+=lPXQl`X@Ewk4QA sgq~Yfgfgvo͛E.1qvpA;+bv}C,M,*VoiQ+6z{mݽs߱2vqrl)(hݷ g3vJV-xW |List yOk<[U bԨg.9pÇ$  /^PY'Fe+9n۽^Ӯε}9x:8yUwQ߿M1Q[>x"y%)N>͛^Z˻9 )əd$)E*hͻ ݻ }V]-PzN i0vF- >>~t@VVhoR;>kDB+%GД΍ʙ~T1(ePߡ琨E?/Zeϯ'3_gۜ1{{vŒ/ +KZlGऩQ)=TMlidOe`b>ҥKA X7ITT!g̘A# 2ui(nUx*x*n\v-t]h^7RenAv ׯ߰aÖ/_q@2eEcʕ;r%|Nlmm GW_YZZj*""A I~^cl#Ш]ZˍH0; xp%W]VA9ֳqicȅk,+YZۺ7_OGƦ'P"`k_ڵω MdE5k5li?ӹexvAV&C,SνW&(geޮKIN?I3~q`2gϞwh^"N_YWlcԫ 2e z;vLo5M0RnϿo}T(X*fkhw)l M,ы/:99-ԩKjÿ+ܹ'C0`-[mx͛ɳ ncc#˗z!z{usoңSa+Zɳ\_㓎'5=|M LJ4Uwoڨ@˜޳Y/nw>LӠiG$T@6veZٳg[ͅ_cr|(@?)SFA>mڴIgomCeB8+)ƍc_RX1^hd 34/Qt /+j Vtڵ54hѢ5B8ٳ~Xb@=>JI6U?hDh6F-]׼@FVp ~pռ|%_+VǪt^ffe*Vsyh~^mIIIEƖ7?VRE+ĉG>>f󼼼8ptM&6AȉlM J(ojm嘳X~Q_YT13ωѰ0th uJ3?|«IU{q:|04 жm[!8pUdz##D;b EcEǹs%KхC & MvS|RJln*$ ~E~}ZҦMVVVv[Kd&YWhժj+u%9r$ ? WhE}|wJ۷WwݳgK$}||Z\K_`+ؗZJ~ĉ1Bx`MjS̟?_aY]( 4P\t vppP*:̙VYmo )) ՘ >}.]g tNPb8MWG>`E0%JA(܁tPhzz:S۷R_zə۽-*ȿ|7_fR$Zk^\;-[Ѽ [}>wB$ g6\,#G|ɒ%KvYB`xښXӧOGg222tykC9([ pEԩS5ٛ/oT=z4jeAe7p-JApGR)+|@%4PlP&l mڴU3g0%n ۻ ~K+W2 /#`r?~bWvO~YyhWC'%kVdb}Mr,YcG"Bկ__\p=.糁Lv]׻ ߿|=: 5,g_qF_/^(nIߣG̵ .@53K\Pi@g@?ecjd(Q%^Z mh{`Yf ,b(vz}aaa([_ ĕlff&7ߗ"##-s \]}auX8p\^^:(-VX|YLƎOmmaEWZo=^+\D1GW{3)e s.R~zիW_CBBDD{DPBz.w‘ݙ3g4={Vᆲ>>>W^A߿?txpG"b@ߢİ5j֕vV`߾}P7n(B,]*p]T.7۷oѮ蟚?e!įect{\`V|[UwRQӓ)4Aߚ2طy^O YL!мUҥMJ}e_ DC+ c]:Onek/$Xp!]HnO驥U#apQ#wo#hc[AۻՀttppPX+V( 実`ݺu.@̴a uFCC!XnjŊҥ / pttTVssHG> x+~ԪUKfܲe *ɆItП ~42S ВNqY @vv6'N*b8qvVza#ҥKn'Ubii)>>Ύcml8 ۺe snnӳvmx邳eyþMO˖1)ὄϘJVDJ%WsO _b6nC߽{6?~yݻ 00wx6ho#h@hFchhS: ˗| Op;QQQJRR^NB[ sht,%w˗/ ?*TrwHGuԭTn:SWW>ql&4"H4o`/?oR-O%f|-u$k1J,XyXʜӳ>c:#$y۞#V̌7B _:al/6W!3HSb5H e=>ȥ;зo_I(4)G.KK˟Y׽a !hBDcKM(@Q$~ ,>R ܈&]tЁUxqΝnWX&WMa EӦNժɏqR &[8Nnݼ9J'^&Shߟ}ҥޒ >y6ԝ{ =zޱڟ47C&MfҥKֆӞh%Z&222أ򦦦`o޼9hF8_k=H5 An\)Qm_p{} ;;;vV#x?T#GnV"񖐐UrMDз՚,M6(Y 4"-]`mڤzU;=.VlA0‘[6mb6븹룥--Yœխ2s4&Q  ŤIu?(> |] h8FMatW^N\8...hp&>|-W! oڴ66FFUV tXXO⤤$nV +++ڵ:lܸQa|zM| v\)P W{nT7~R\mTWiV~lR0sϧnnk v}t\r%~d*1m*a$Hp>}:Fˑ;B4rH+tn}Ibb"4L1M;wq Vhqyihh2 l?oěoߞvڒ4w0t]i: :UO0Aa23~xY ggػwoDDD-,,P000pIk~nnnV8w @D"`ὨѼ6c[V -'ܸ9߲Y3ܦ >Z:/-q1sgˌ0&COp@𿌳* BKiXYYqMp0ݻUn͓WuE %%ӧ;$ S@tQWmll#pႾ a@322Vݺu $.꒝ ;nho]E~mR070[6k۬:!$d8>}ʔtb;I9!$H(>Jٗ 3vQQQ]̝;WȨ$ CcBjP`ŋ`zr+,Nb^ I&!{-^>2d*TvĉZR C/qJ-#$`97@jj**wA=4fUY~m"`D—11M6k:Ug =zJ\hSbN߅29,#H(% k`_haa/#.j֬Dv@/I;'?((KrTO2=牓Wy(,w.5o-Zl)Q;!u#͛@pwwg_5zh~S{̙KCE%Nl|-e29p*Z{hPTg8wkSoFMLK-dJֱ9O erLg᩺spYG=CDQMqF%І#ۤIQnx>`OkR nݺ#*4Qrew͛7`4שS А;M֕|e422@ҤݲY2=-Ynڰ9Өnnў)_u!.`JIL u KgSUy"&L aSH!Tbb"|…Z]vE% D@W{&KKKCɂ4l TFe?D.]ZEr>|䏳\X|9z(G)Tj \%.4vW=[s39soOKr:yc_ֻoZ9߼@ jL3gٵK{ 5a8yX   ^~PmM1fQIFz{S ҰYodɒ/^0OCI{_ٸqceeVW255|#+q9-YܪBUp r$+x4WTG+f us.ժ6/_?ġ' 677g_5jԨ/np+T\r ۛ4,^ jQlYv摑Z(&=0VŋСC%=z Uyx9z(쇭~ຸ ht [+V)nGD+|}}ٙ.]ZGh???M|Pˋ$6#3`ct4sY:v:?AC' 8x 0h޾}VYYY(f|0`w}vT܁$yC9Eˮ+Lc}E/^ݻwka#Gz%ꆆQ =>|iӦ =9+VBx`ͫ5͒;j̙3·Rb.Act&޽{ׯ_?pR ƍUʶ5PݻwKN^CIիQx({UĔ5˗/رc3[9riQ`޼y*-j ]ra]۽rrcKL O # П`Æ X>|@P֭@q6ELJu[~=;Eथʕ+I# 7n膕/tU!_x>IХK!#T98ޣGtur$&6- kZ+#?l 1?# ߏe˖REED`#S4)ڙlzG;C;#Xϟ?WۣG \,*TlhB𑃏1X<+{AN*n޼O?1"Bܿ$0:;z@*Ulz]Cq~[n۷/'#E -}|}2ΖՀZ& /_ݻwȑ b+ ݌eWyfƍ /_r%gΜv(jY1[6TvtGܯ/$4)))(&{N:^-/`␈>~(/%,, UTR`C?~ʕB 8yYj& ˝Z*ȒX0& .l޼5 üPԯ_@nvYߢٮ]-Pnݙ3g[ #""^Ukw*t 3ٳUV 4@~PC9`)z  ]Cԁg^BBB(S !{n۶-@Bg6۷Wˏ D5:YUT)((hٲe۷oOLLHDx(H:2̙3GeK.EWYXX<;qiyo(`ʸ# ۇl} dihm 9!_TUFHJJBΟ?+X-f̘a'A ܜRC L )Q1BN> ؓCŊ/ڽ lY4i&}"U0k,K333xեhѢ` ).<<@ ^5Kʏ룿lսdp&+8s{?+_"% \(Mh9+n'Nō)4GLk"X,lѕ.VT NMwN1ۼ6wj# [FPcɚnHNNFiN44TCg?!C(,_!wzJrb ")OTOtτu~>zh.gBpqq{<;^ g3RcS4K瘳ﳾ6E: dz{>?/}9bJyD}lUkKٜ?l]̖Q9>پpُmd7@rlaKفHٙr6GDr4qB'd+:wqPN?ΐ]`HawE> Ǐћĉ Νy"ϟv<)SPO>j]˄oTCϜ.]_Sh߾}1c }x bŊIpU٩SB 4fׯ_ƄB?WwYNLL+$rxO\fذaիWZժU;vl#F899A䙨t߶m[* h#GBk rB <ܻwoNP?^77ɓ'={Mb@mNtr4)YB~lZ[;1M>WJ8& sufy_Nn'aV>f=;9γOn#FPmfΩ_MLD]A 2iX={D,*0oܸpdeL;wJ?zŋU/ɓk׮?~Owgf ;w^Y*WB.dSǥs fgeR?ޒYɏ粻IY`,/LپNW,LG)]xOd7۬W9SPiYY@q_@O3 cM @A!X՚}_ k\~~ HAA   HAAA   AAA   AAA$   @AA   HAAA   HAAA   AAA   AAA$   @AA   HAAA   AAA   AAA   AAA$  7@gIENDB`prey.orig/modules/alert/core/0000775000175100017510000000000012250331650016050 5ustar guerreguerreprey.orig/modules/alert/core/run0000664000175100017510000000157612250331650016610 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Alert Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### log "$STRING_SHOW_ALERT" alert_user if [ "$alert__say_message" == 'y' ]; then log ' -- Saying the message out loud...' say_message fi if [ $alert__change_wallpaper == 'y' ]; then # if [ ! -f "$alert__wallpaper" ]; then # TODO: finish this, to allow setting the wallpaper remotely # if [ `find_in "$alert__wallpaper" 'http://'` ]; then # wget $alert__wallpaper -O $module_path/lib/prey-wallpaper-custom.jpg # alert__wallpaper="$module_path/lib/prey-wallpaper-custom.jpg" # sed -i -e $module_path/config 'alert__wallpaper=.*$/alert__wallpaper=\'$module_path/lib/prey-wallpaper-$lang.png\'/' # fi # fi change_wallpaper fi prey.orig/modules/alert/lang/0000775000175100017510000000000012250331650016041 5ustar guerreguerreprey.orig/modules/alert/lang/en0000775000175100017510000000061112250331650016367 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_CHANGE_WALLPAPER=" -- Changing the wallpaper to alert him and nearby users..." STRING_SHOW_ALERT=" -- Showing the guy our alert message..." prey.orig/modules/alert/lang/es0000775000175100017510000000076512250331650016406 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Spanish language file v 0.2 - by Juan C. Mardones (http://juanmardones.com) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_CHANGE_WALLPAPER=" -- Cambiando el fondo de pantalla para alertar a la persona y a los que esten cerca..." STRING_SHOW_ALERT=" -- Mostrando nuestro mensaje de alerta..." prey.orig/modules/alert/lang/fr0000775000175100017510000000064112250331650016377 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_CHANGE_WALLPAPER=" -- Changement du fond d'écran pour l'alerter lui et ses voisins..." STRING_SHOW_ALERT=" -- Affichage de notre message d'alerte pour le type..." prey.orig/modules/alert/lang/sv0000775000175100017510000000074312250331650016423 0ustar guerreguerre#!/bin/bash #################################################################### # Prey - by Tomas Pollak (http://bootlog.org) # Swedish lang file v 0.1 - by Dan Sellberg (dan@dkcp.com) # URL : http://preyproject.com # License: GPLv3 #################################################################### STRING_CHANGE_WALLPAPER=" -- Ändrar bakgrundsbild för att göra tjuven och folk runt omkring uppmärksamma..." STRING_SHOW_ALERT=" -- Visar tjuven vårt varningsmeddelande..." prey.orig/modules/alert/config0000664000175100017510000000125412250331650016312 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Alert Module Configuration File - by Tomas Pollak (bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### # alert the user with a message, y or n alert__alert_message='This is a stolen computer, and has been marked by Prey. Contact us immediately at http://preyproject.com to clarify the situation. YOU HAVE BEEN WARNED!' alert__say_message='n' # change wallpaper to alert nearby users -- EXPERIMENTAL! alert__change_wallpaper='n' # which wallpaper to use alert__wallpaper="$module_path/lib/prey-wallpaper-$lang.png" prey.orig/modules/alert/version0000664000175100017510000000000412250331650016522 0ustar guerreguerre1.6 prey.orig/modules/alert/platform/0000775000175100017510000000000012250331650016744 5ustar guerreguerreprey.orig/modules/alert/platform/linux/0000775000175100017510000000000012250331650020103 5ustar guerreguerreprey.orig/modules/alert/platform/linux/functions0000664000175100017510000000433612250331650022044 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Alert Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### change_wallpaper() { local gconftool=`which gconftool-2` local kdesktop=`which kdesktop` local xfce=`which xfconf-query` if [ -n "$gconftool" ]; then wallpaper_command="$gconftool --type string --set /desktop/gnome/background/picture_filename $alert__wallpaper" wallpaper_command_two="$gconftool --type string --set /desktop/gnome/background/picture_options 'scaled'" elif [ -n "$kdesktop" ]; then # untested wallpaper_command="$kdesktop KBackgroundIface setWallpaper $alert__wallpaper 8" # 8 = scale elif [ -n "$xfce" ]; then # requires xfce 4.6 wallpaper_command="$xfce -c xfce4-desktop -p /backdrop/screen0/monitor0/image-path -s $alert__wallpaper" fi if [ -n "$wallpaper_command" ]; then run_as_current_user "$wallpaper_command" if [ -n "$wallpaper_command_two" ]; then # couldn't find a way to run both commands as one (gconf complains with &&'s) run_as_current_user "$wallpaper_command_two" fi fi } alert_user() { local dialog_title="Important" local zenity=`which zenity` local kdialog=`which kdialog` if [ -n "$zenity" ]; then # shall we play with the guy? # $zenity --question --text "Is this computer yours?" # if [ $? = 0 ]; then # TODO: inventar buena talla # fi # alert_command="$zenity --info --text" alert_command="$zenity --error --title $dialog_title --text" elif [ -n "$kdialog" ]; then #untested! alert_command="$kdialog --error" fi if [ -n "$alert_command" ]; then if [ `whoami` == 'root' ]; then DISPLAY=:0 su $logged_user -c "$alert_command \"$alert__alert_message\"" & else $alert_command "$alert__alert_message" & fi fi } say_message(){ local festival=`which festival` local espeak=`which espeak` if [ -n "$festival" ]; then echo "$alert__alert_message" | "$festival" --tts 2> /dev/null & elif [ -n "$espeak" ]; then $espeak -ven "$alert__alert_message" & else log ' -- Text-to-speech software not found! Please install "festival" or "espeak" via your package manager.' fi } prey.orig/modules/session/0000775000175100017510000000000012250331650015474 5ustar guerreguerreprey.orig/modules/session/core/0000775000175100017510000000000012250331650016424 5ustar guerreguerreprey.orig/modules/session/core/run0000775000175100017510000000174112250331650017161 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module - by Tomas Pollak (bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### log " -- Getting current logged in user name..." add_trace logged_user $logged_user log "$STRING_UPTIME_AND_PROCESS" get_uptime add_trace uptime "$uptime" if [ "$session__get_running_programs" == 'y' ]; then get_running_programs add_trace running_programs "$running_programs" fi if [ "$session__get_modified_files" == 'y' ]; then locate_path log "$STRING_MODIFIED_FILES" get_modified_files if [ -n "$modified_files" ]; then add_trace modified_files "$modified_files" else log ' !! Nothing found. Make sure you type in a valid path.' fi fi if [ "$session__get_screenshot" == 'y' ]; then log "$STRING_GET_SCREENSHOT" get_screenshot if [ -f "$session__screenshot" ]; then add_file screenshot "$session__screenshot" fi fi prey.orig/modules/session/core/functions0000664000175100017510000000157712250331650020371 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_uptime(){ uptime=`uptime 2> /dev/null` } get_running_programs() { running_programs=`ps aux | grep -v root` } locate_path(){ if [ "$session__modified_files_path" == '~/' ]; then find_path=`eval echo $home_path` else find_path=`eval echo $session__modified_files_path` fi } get_modified_files() { # we dont include hidden files modified_files=`find $find_path \( ! -regex '.*/\..*/..*' \) -type f -mmin -$session__modified_files_time 2> /dev/null` } compress_screenshot() { log " -- Compressing screenshot..." tar zcf $session__screenshot.tar.gz $session__screenshot session__screenshot=$screenshot.tar.gz } prey.orig/modules/session/lang/0000775000175100017510000000000012250331650016415 5ustar guerreguerreprey.orig/modules/session/lang/en0000775000175100017510000000151112250331650016743 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Getting public IP address..." STRING_GET_LAN_IP=" -- Getting private LAN IP address..." STRING_GET_MAC_AND_WIFI=" -- Getting MAC address, routing and Wifi info..." STRING_TRACE=" -- Tracing our complete route to the Internet..." STRING_UPTIME_AND_PROCESS=" -- Getting computer uptime and a list of running programs..." STRING_MODIFIED_FILES=" -- Getting a list of recently modified files..." STRING_ACTIVE_CONNECTIONS=" -- Getting list of current active connections..." STRING_GET_SCREENSHOT=" -- Grabbing screenshot of the running desktop..." prey.orig/modules/session/lang/es0000775000175100017510000000161712250331650016757 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Obteniendo la direccion IP publica..." STRING_GET_LAN_IP=" -- Obteniendo la direccion IP privada de la LAN..." STRING_GET_MAC_AND_WIFI=" -- Obteniendo direccion MAC, tabla de rutas e informacion de la Red Wifi..." STRING_TRACE=" -- Rastreando la ruta completa hacia Internet..." STRING_UPTIME_AND_PROCESS=" -- Obteniendo el uptime y la lista de programas en ejecucion..." STRING_MODIFIED_FILES=" -- Obteniendo una lista de los archivos recientemente modificados..." STRING_ACTIVE_CONNECTIONS=" -- Obteniendo la lista de las conecciones activas..." STRING_GET_SCREENSHOT=" -- Obteniendo una captura de pantalla..." prey.orig/modules/session/lang/fr0000775000175100017510000000160312250331650016752 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Recherche de l'adresse IP publique..." STRING_GET_LAN_IP=" -- Recherche de l'adresse IP privée sur le réseau local..." STRING_GET_MAC_AND_WIFI=" -- Recherche de l'adresse MAC, du routage et du Wifi..." STRING_TRACE=" -- Examen de notre route vers Internet..." STRING_UPTIME_AND_PROCESS=" -- Recherche de la durée de fonctionnement de l'ordinateur et de la liste des programmes en cours..." STRING_MODIFIED_FILES=" -- Recherce des fichiers modifiés récemment..." STRING_ACTIVE_CONNECTIONS=" -- Recherche des connexions actives..." STRING_GET_SCREENSHOT=" -- Capture d'écran du bureau en cours..." prey.orig/modules/session/lang/sv0000775000175100017510000000143012250331650016771 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Lang File - by Dan Sellberg (dan@dkcp.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Hämtar publik IP adress..." STRING_GET_LAN_IP=" -- Hämtar privat LAN IP adress..." STRING_GET_MAC_AND_WIFI=" -- Hämtar MAC address, routing och trådlös info..." STRING_TRACE=" -- Spårar vår route till internet..." STRING_UPTIME_AND_PROCESS=" -- Hämtar datorns upptid och en lista på program som körs..." STRING_MODIFIED_FILES=" -- Hämtar lista på nyligen modifierade filer..." STRING_ACTIVE_CONNECTIONS=" -- Hämtar lista över aktiva anslutningar..." STRING_GET_SCREENSHOT=" -- Tar skärmbild..." prey.orig/modules/session/config0000664000175100017510000000133012250331650016661 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Report Module Config File - by Tomas Pollak (bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### session__screenshot="$tmpdir/prey-screenshot.jpg" # should we get list of running programs session__get_running_programs='n' # should we get modified files session__get_modified_files='n' # route where to get the modified files from session__modified_files_path='~/' # timelapse to watch for modified files, in minutes session__modified_files_time='60' # should we grab a screenshot? session__get_screenshot='y' # new stuff # session__get_reboot_history='n' prey.orig/modules/session/version0000664000175100017510000000000412250331650017076 0ustar guerreguerre1.7 prey.orig/modules/session/platform/0000775000175100017510000000000012250331650017320 5ustar guerreguerreprey.orig/modules/session/platform/linux/0000775000175100017510000000000012250331650020457 5ustar guerreguerreprey.orig/modules/session/platform/linux/functions0000664000175100017510000000112212250331650022406 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Session Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_screenshot() { local scrot=`which scrot` # scrot is lighter local import=`which import` # imagemagick if [ -n "$scrot" ]; then run_as_current_user "$scrot $session__screenshot" elif [ -n "$import" ]; then local args="-window root -display :0" run_as_current_user "$import $args $session__screenshot" fi } prey.orig/modules/network/0000775000175100017510000000000012250331650015502 5ustar guerreguerreprey.orig/modules/network/core/0000775000175100017510000000000012250331650016432 5ustar guerreguerreprey.orig/modules/network/core/run0000775000175100017510000000200712250331650017163 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### log "$STRING_GET_IP" get_public_ip add_trace public_ip $public_ip log "$STRING_GET_LAN_IP" internal_ip=$(get_ip_address | head -1) add_trace internal_ip $internal_ip log " -- Getting gateway IP address..." gateway_ip=$(get_gateway_ip | head -1) add_trace gateway_ip $gateway_ip if [ "$network__get_active_connections" == 'y' ]; then log "$STRING_ACTIVE_CONNECTIONS" get_active_connections add_trace active_connections "$active_connections" fi if [ "$network__get_nearby_wifi_hotspots" == 'y' ]; then log "$STRING_GET_WIFI" [ -z "$wifi_info" ] && get_wifi_info [ -n "$wifi_info" ] && add_trace wifi_info "$wifi_info" fi if [[ "$network__trace_route" == 'y' && -z "$proxy_server" ]]; then log "$STRING_TRACE" trace_route add_trace complete_trace "$complete_trace" fi prey.orig/modules/network/core/functions0000664000175100017510000000106112250331650020363 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_public_ip() { public_ip=$(getter --connect-timeout 3 checkip.dyndns.org | sed 's/[^0-9\.]//g') } # for linux and mac trace_route() { traceroute=$(which traceroute) if [ -n "$traceroute" ]; then complete_trace=$($traceroute -q1 www.google.com 2>&1 | grep -v -e "^[a-z]" -e "^$") fi } prey.orig/modules/network/lang/0000775000175100017510000000000012250331650016423 5ustar guerreguerreprey.orig/modules/network/lang/en0000775000175100017510000000075512250331650016762 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Getting public IP address..." STRING_GET_LAN_IP=" -- Getting private LAN IP address..." STRING_GET_WIFI=" -- Getting Wifi info..." STRING_TRACE=" -- Tracing our complete route to the Internet..." prey.orig/modules/network/lang/es0000775000175100017510000000103012250331650016752 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Obteniendo la direccion IP publica..." STRING_GET_LAN_IP=" -- Obteniendo la direccion IP privada de la LAN..." STRING_GET_WIFI=" -- Obteniendo informacion de la Red Wifi..." STRING_TRACE=" -- Rastreando la ruta completa hacia Internet..." prey.orig/modules/network/lang/fr0000775000175100017510000000105712250331650016763 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Lang File - by Juan C. Mardones (http://juanmardones.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Recherche de l'adresse IP publique..." STRING_GET_LAN_IP=" -- Recherche de l'adresse IP privée sur le réseau local..." STRING_GET_MAC_AND_WIFI=" -- Recherche de l'adresse MAC, du routage et du Wifi..." STRING_TRACE=" -- Examen de notre route vers Internet..." prey.orig/modules/network/lang/sv0000775000175100017510000000072612250331650017006 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Lang File - by Dan Sellberg (dan@dkcp.com) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_IP=" -- Hämtar publik IP adress..." STRING_GET_LAN_IP=" -- Hämtar privat LAN IP adress..." STRING_GET_WIFI=" -- Hämtar trådlös info..." STRING_TRACE=" -- Spårar vår route till internet..." prey.orig/modules/network/config0000664000175100017510000000100512250331650016666 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Network Module Config File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # should we trace the complete route? (it's a bit slow) network__trace_route='n' # this is quite slow sometimes network__get_active_connections='n' # should we get the list of nearby wifi access points available? network__get_nearby_wifi_hotspots='n' prey.orig/modules/network/version0000664000175100017510000000000412250331650017104 0ustar guerreguerre1.9 prey.orig/modules/network/platform/0000775000175100017510000000000012250331650017326 5ustar guerreguerreprey.orig/modules/network/platform/linux/0000775000175100017510000000000012250331650020465 5ustar guerreguerreprey.orig/modules/network/platform/linux/functions0000664000175100017510000000054412250331650022423 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Network Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### get_active_connections() { active_connections=$(netstat -tupn | grep -v "127.0.0.1") } prey.orig/modules/secure/0000775000175100017510000000000012250331650015277 5ustar guerreguerreprey.orig/modules/secure/core/0000775000175100017510000000000012250331650016227 5ustar guerreguerreprey.orig/modules/secure/core/run0000664000175100017510000000246012250331650016760 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Secure Module - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # AFAIK windows doesnt have a keychain as linux and Mac do... if [[ "$secure__delete_credentials" == 'y' && "$os" != "windows" ]]; then secure_folder "${credentials_path}" fi if [ "$secure__delete_firefox_data" == 'y' ]; then secure_folder "$firefox_path" 'firefox' fi if [ "$secure__delete_chrome_data" == 'y' ]; then secure_folder "$chrome_path" 'chrome' if [ "$os" == "linux" ]; then secure_folder "$chromium_path" 'chromium-browser' fi fi # Prey currently handles Safari only in Mac/Windows, not in other environments such as Wine. Sorry. :) if [[ "$secure__delete_safari_data" == 'y' && "$os" != 'linux' ]]; then secure_folder "$safari_path" 'safari' fi if [ "$secure__hide_thunderbird_data" == 'y' ]; then secure_folder "$thunderbird_path" 'thunderbird' fi if [ "$os" == "windows" ]; then if [ "$secure__hide_outlook_data" == 'y' && ]; then secure_folder "$outlook_path" 'outlook' fi # Prey currently handles IE among Windows, not in other environments such as Wine. Sorry. :) if [ "$secure__delete_ie_data" == 'y' ]; then secure_ie_data fi fi prey.orig/modules/secure/core/functions0000664000175100017510000000245412250331650020167 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Secure Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### secure_folder(){ eval ${secure__method}_folder \"$1\" \"$2\" } # receives $1 => path, $2 => name of program # example: delete_folder $safari_data_path 'safari' delete_folder() { if [[ -n "$2" && "$terminate_if_running" == "y" ]]; then kill_process $2 fi if [ -z "$1" ]; then return 1 fi if [ -d "$users_path" ]; then for user_path in `find "$users_path" -maxdepth 1 -mindepth 1 -type d`; do if [ -d "$user_path/$1" ]; then log " -- Deleting $1 folder on $user_path..." rm -Rf "$user_path/$1" 2> /dev/null fi done fi } hide_folder(){ if [[ -n "$2" && "$terminate_if_running" == "y" ]]; then kill_process $2 fi if [ -z "$1" ]; then return 1 fi if [ -d "$users_path" ]; then for user_path in `find "$users_path" -maxdepth 1 -mindepth 1 -type d`; do if [ ! -d "$user_path/$1.backup" ]; then log " -- Backup folder already exists for $1. Skipping..." elif [ -d "$user_path/$1" ]; then log " -- Hiding $1 folder on $user_path..." mv "$user_path/$1" "$user_path/$1.backup" 2> /dev/null fi done fi } prey.orig/modules/secure/config0000664000175100017510000000226312250331650016472 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Secure Module Configuration File - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### # whether to delete data or to hide it secure__method='hide' # should we make sure the program were wiping the user data for isn't running? secure__terminate_if_running='y' # whether to destroy the keychains/keyrings that holds all the different # passwords in your system. recommended if you do use them. secure__delete_credentials='n' # delete all user profiles for firefox secure__delete_firefox_data='n' # delete all user profiles for chrome secure__delete_chrome_data='n' # delete or hide all user profiles for safari (mac & windows only) secure__delete_safari_data='n' # delete everything for running user in IE (windows only) secure__delete_ie_data='n' # Appends '.backup' to all Thunderbird profiles in your PC so that none email and contacts can be found. secure__hide_thunderbird_data='n' # Appends '.backup' to your Outlook profile path so that your email and contacts are not found. secure__hide_outlook_data='n' prey.orig/modules/secure/version0000664000175100017510000000000412250331650016701 0ustar guerreguerre1.9 prey.orig/modules/secure/platform/0000775000175100017510000000000012250331650017123 5ustar guerreguerreprey.orig/modules/secure/platform/linux/0000775000175100017510000000000012250331650020262 5ustar guerreguerreprey.orig/modules/secure/platform/linux/functions0000664000175100017510000000065312250331650022221 0ustar guerreguerre#!/bin/bash #################################################################### # PREY Wiper Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### credentials_path=".gnome2/keyrings" firefox_path=".mozilla" thunderbird_path=".thunderbird" chrome_path=".config/google-chrome" chromium_path=".config/chromium" prey.orig/modules/system/0000775000175100017510000000000012250331650015335 5ustar guerreguerreprey.orig/modules/system/core/0000775000175100017510000000000012250331650016265 5ustar guerreguerreprey.orig/modules/system/core/run0000775000175100017510000000147212250331650017023 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module - by Carlos Yaconi H. # URL: http://preyproject.com # License: GPLv3 #################################################################### log " -- Scanning current system's hardware..." scan_system_hardware log ' -- Sending updated data...' send_updated_hardware_data #get_os_info #log "OS Version: $os_version" #log "Kernel Version: $kernel_version" #get_cpu_info #log "CPU info: $cpu_info" #get_memory_info #log "Memory info: $mem_info" #log "Memory Total: $mem_total" #get_system_ids #log "Serial number: $serial_number" #log "UUID: $hw_UUID" #get_hdd_info #log "HDD info: $hdd_info" #add_trace cpu_name $cpu_name #add_trace cpu_speed $cpu_speed #add_trace cpu_number $cpu_number #add_trace cpu_cores $cpu_cores prey.orig/modules/system/core/functions0000664000175100017510000000310112250331650020213 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Core Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### scan_system_hardware(){ get_system_ids 2> /dev/null [ "$os" != "mac" ] && get_mb_info 2> /dev/null get_cpu_info 2> /dev/null get_memory_info 2> /dev/null get_bios_info 2> /dev/null get_storage_devices 2> /dev/null get_network_interfaces 2> /dev/null } store_system_value(){ [ -n "$2" ] && store_key_value 'system' "hardware_attributes__${1}" "$(urlencode "$2")" } store_network_interface_value(){ [ -n "$3" ] && store_key_value 'network_interfaces' "${1}__${2}" "$(urlencode "$3")" } store_storage_device_value(){ [ -n "$3" ] && store_key_value 'storage_devices' "${1}__${2}" "$(urlencode "$3")" } store_system_params(){ for key in $(echo $system__vars); do local value=$(eval echo "\$system__${key}") [ -n "$value" ] && store_system_value "$key" "$value" done } full_hardware_params(){ store_system_params local system_params=$(generate_query_string 'system' '&device') # log "$system_params" local network_params=$(generate_query_string 'network_interfaces' '&device[hardware_attributes][network]') # log "$network_params" local storage_params=$(generate_query_string 'storage_devices' '&device[hardware_attributes][storage]') # log "$storage_params" echo "${system_params}${network_params}${storage_params}" } send_updated_hardware_data(){ update_device_info_with "$(full_hardware_params)" } prey.orig/modules/system/lang/0000775000175100017510000000000012250331650016256 5ustar guerreguerreprey.orig/modules/system/lang/en0000775000175100017510000000061112250331650016604 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Lang File - by Carlos Yaconi # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_CPU_INFO=" -- Getting CPU info..." STRING_GET_MEMORY_INFO=" -- Getting memory info..." STRING_GET_HDD_INFO=" -- Getting HDDs info..." prey.orig/modules/system/lang/es0000775000175100017510000000061112250331650016611 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Lang File - by Carlos Yaconi # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_CPU_INFO=" -- Getting CPU info..." STRING_GET_MEMORY_INFO=" -- Getting memory info..." STRING_GET_HDD_INFO=" -- Getting HDDs info..." prey.orig/modules/system/lang/fr0000775000175100017510000000072112250331650016613 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Lang File - by Carlos Yaconi # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_CPU_INFO=" -- Recherche d'information sur le processeur..." STRING_GET_MEMORY_INFO=" -- Recherche d'information sur la mémoire..." STRING_GET_HDD_INFO=" -- Recherche d'information sur les disques durs..." prey.orig/modules/system/lang/sv0000775000175100017510000000056612250331650016643 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Lang File # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_GET_CPU_INFO=" -- Getting CPU info..." STRING_GET_MEMORY_INFO=" -- Getting memory info..." STRING_GET_HDD_INFO=" -- Getting HDDs info..." prey.orig/modules/system/config0000664000175100017510000000062312250331650016526 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Config File - by Carlos Yaconi H. # URL: http://preyproject.com # License: GPLv3 #################################################################### system__vars='serial_number uuid bios_vendor bios_version mb_vendor mb_serial mb_model mb_version cpu_model cpu_speed cpu_cores ram_size ram_modules' prey.orig/modules/system/version0000664000175100017510000000000412250331650016737 0ustar guerreguerre3.2 prey.orig/modules/system/platform/0000775000175100017510000000000012250331650017161 5ustar guerreguerreprey.orig/modules/system/platform/linux/0000775000175100017510000000000012250331650020320 5ustar guerreguerreprey.orig/modules/system/platform/linux/functions0000664000175100017510000001055612250331650022262 0ustar guerreguerre#!/bin/bash #################################################################### # Prey System Module Linux Functions - by Carlos Yaconi H. # URL: http://preyproject.com # License: GPLv3 #################################################################### # system_udi=$(hal-find-by-property --key info.product --string Computer) #get_from_hal(){ # /usr/bin/hal-get-property --udi $system_udi --key $1 #} get_system_full_info(){ system__full_info=$(lshw 2> /dev/null) } get_system_ids(){ [ -z "$system__full_info" ] && get_system_full_info system__uuid=$(echo "$system__full_info" | head -10 | grep "uuid" | sed "s/.*uuid=\(.*\)/\1/") system__serial_number=$(echo "$system__full_info" | head -10 | grep serial | head -1 | awk -F ': ' '{print $2}') } get_mb_info(){ system__mb_vendor=$(echo "$system__full_info" | grep Motherboard -A5 | grep vendor | awk -F ': ' '{print $2}') system__mb_serial=$(echo "$system__full_info" | grep Motherboard -A5 | grep serial | awk -F ': ' '{print $2}') system__mb_model=$(echo "$system__full_info" | grep Motherboard -A5 | grep product | awk -F ': ' '{print $2}') system__mb_version=$(echo "$system__full_info" | grep Motherboard -A5 | grep version | awk -F ': ' '{print $2}') } get_bios_info(){ system__bios_vendor=$(echo "$system__full_info" | grep -i "\-firmware" -A4 | grep vendor | awk -F ': ' '{print $2}') system__bios_version=$(echo "$system__full_info" | grep -i "\-firmware" -A4 | grep version | awk -F ': ' '{print $2}') } get_cpu_info(){ local cpu_info=$(cat /proc/cpuinfo) system__cpu_model=$(echo -e "$cpu_info" | grep "model name" | tail -1 | sed 's/.*: //') system__cpu_speed=$(echo -e "$cpu_info" | grep "cpu MHz" | tail -1 | sed 's/.*: //') system__cpu_cores=$(echo -e "$cpu_info" | grep "processor" | wc -l) } get_memory_info(){ local mem_in_kb=$(cat /proc/meminfo | grep "MemTotal" | sed 's/.*:[[:space:]]*\(.*\) .*/\1/') system__ram_size=$(($mem_in_kb/1024)) system__ram_modules=$(dmidecode --type 17 | grep Size | grep -v "No Module" | wc -l) } get_storage_devices(){ # hwinfo --disk --cdrom 2> /dev/null | grep Class -A8 | while read line; do # key=$(echo "$line" | cut -d":" -f1) # val=$(echo "$line" | cut -d":" -f2) # echo "key: $key" # echo "val: $val" # done local disks_path="/dev/disk/by-id" local last_path="" for disk in $(stat -c "%n" ${disks_path}/* | grep -v "\-part[1-9]"); do local path=$(readlink -f "$disk") [ "$path" == "$last_path" ] && continue local name=$(basename "$path") store_storage_device_value "$name" 'name' "$name" local full_name=$(echo "$disk" | sed "s/.*\/\([^\/]*\)$/\1/g") local interface=$(echo "$full_name" | cut -d"-" -f1) store_storage_device_value "$name" 'interface' "$interface" # cdroms are owned by the group 'cdrom' if [ "$(stat -c "%G" "$path")" == "cdrom" ]; then store_storage_device_value "$name" 'storage_type' 'CDROM' elif [[ "$interface" =~ "usb" ]]; then store_storage_device_value "$name" 'storage_type' 'Removable' else store_storage_device_value "$name" 'storage_type' 'Fixed' fi local model=$(echo "$full_name" | sed "s/.*-\(.*\)_.*/\1/") store_storage_device_value "$name" 'model' "$model" local serial_number=$(echo "$full_name" | sed "s/.*_\(.*\)/\1/") store_storage_device_value "$name" 'serial_number' "$serial_number" last_path="$path" done } get_network_interfaces(){ for device_name in /sys/class/net/* ; do [ -e $device_name/device ] && { local name=$(echo "$device_name" | sed "s/.*\/\(.*\)$/\1/") store_network_interface_value $name 'name' "$name" local interface_type="Wired" [ -n "$(cat /proc/net/wireless | grep "$name" 2> /dev/null)" ] && interface_type="Wireless" store_network_interface_value $name 'interface_type' "$interface_type" local pci_slot=$(cat $device_name/device/uevent | grep PCI_SLOT | cut -f2- -d":") local vendor=$(lspci -v | grep $pci_slot -A1 | grep 'Subsystem' | cut -f2- -d" ") store_network_interface_value $name 'vendor' "$vendor" local mac_address=$(cat $device_name/address) store_network_interface_value $name 'mac_address' "$mac_address" local ip_address=$(get_ip_address $name) store_network_interface_value $name 'ip_address' "$ip_address" local gateway_ip=$(get_gateway_ip $name) store_network_interface_value $name 'gateway_ip' "$gateway_ip" local netmask=$(get_netmask $name) store_network_interface_value $name 'netmask' "$netmask" } done } prey.orig/modules/webcam/0000775000175100017510000000000012250331650015247 5ustar guerreguerreprey.orig/modules/webcam/core/0000775000175100017510000000000012250331650016177 5ustar guerreguerreprey.orig/modules/webcam/core/run0000775000175100017510000000116512250331650016734 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module - by Tomas Pollak (bootlog.org) # URL : http://preyproject.com # License: GPLv3 #################################################################### log "$STRING_TAKE_PICTURE" take_picture if [ -f "$webcam__picture" ]; then add_file picture "$webcam__picture" else log " !! Couldn't grab a picture! Please make sure your webcam is correctly configured." fi if [ $webcam__capture_video == 'y' ]; then log "$STRING_CAPTURE_VIDEO" capture_video if [ -f "$webcam__video" ]; then add_file video "$webcam__video" fi fi prey.orig/modules/webcam/lang/0000775000175100017510000000000012250331650016170 5ustar guerreguerreprey.orig/modules/webcam/lang/en0000775000175100017510000000062712250331650016525 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Lang File - by Tomas Pollak (http://bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_TAKE_PICTURE=" -- Taking a picture of the impostor..." STRING_CAPTURE_VIDEO=" -- Capturing $video_capture_time seconds of video..." prey.orig/modules/webcam/lang/es0000775000175100017510000000062412250331650016527 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Lang File - by Tomas Pollak (http://bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_TAKE_PICTURE=" -- Tomando una foto del ladron..." STRING_CAPTURE_VIDEO=" -- Capturando $video_capture_time segundos de video..." prey.orig/modules/webcam/lang/fr0000775000175100017510000000063512250331650016531 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Lang File - by Tomas Pollak (http://bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_TAKE_PICTURE=" -- Prise de photo de l'imposteur..." STRING_CAPTURE_VIDEO=" -- Enregistrement de $video_capture_time secondes de video..." prey.orig/modules/webcam/lang/sv0000775000175100017510000000061112250331650016544 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Lang File - by Tomas Pollak (http://bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### STRING_TAKE_PICTURE=" -- Tar foto av tjuven..." STRING_CAPTURE_VIDEO=" -- Capturing $video_capture_time seconds of video..." prey.orig/modules/webcam/config0000664000175100017510000000104312250331650016435 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Config File - by Tomas Pollak # URL : http://preyproject.com # License: GPLv3 #################################################################### webcam__picture="$tmpdir/prey-picture.jpg" webcam__video="$tmpdir/prey-video.mov" # should we capture video webcam__capture_video='n' # how much time should we capture video (in seconds) webcam__video_capture_time='30' # frames per second (for streamer in linux) webcam__frames_per_second='12' prey.orig/modules/webcam/version0000664000175100017510000000000412250331650016651 0ustar guerreguerre1.6 prey.orig/modules/webcam/platform/0000775000175100017510000000000012250331650017073 5ustar guerreguerreprey.orig/modules/webcam/platform/linux/0000775000175100017510000000000012250331650020232 5ustar guerreguerreprey.orig/modules/webcam/platform/linux/functions0000664000175100017510000000274412250331650022174 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Webcam Module Linux Functions - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### take_picture() { # do we have streamer installed ? local streamer=`which streamer` if [ -n "$streamer" ]; then # take four pictures every 0.5 seconds as JPEG $streamer -t 4 -r 0.5 -o "$tmpdir/streamer0.jpeg" &> /dev/null if [ -f "$tmpdir/streamer3.jpeg" ]; then # we got it mv "$tmpdir/streamer3.jpeg" "$webcam__picture" > /dev/null rm -f "$tmpdir/streamer{0,1,2}.jpeg" 2> /dev/null else # some webcams are unable to take JPGs so we try to grab a PPM $streamer -t 4 -r 0.5 -o "$tmpdir/streamer0.ppm" &> /dev/null if [ -f "$tmpdir/streamer3.ppm" ]; then # good local convert=`which convert` if [ -n "$convert" ]; then # lets convert it to jpg $convert "$tmpdir/streamer3.ppm" "$webcam__picture" > /dev/null else # lets just send it as a PPM log " -- Could't find Imagemagick! Sending image as PPM." webcam__picture="$tmpdir/streamer3.ppm" fi rm -f "$tmpdir/streamer{0,1,2}.ppm" fi fi fi } capture_video() { # we should already know if we do have streamer if [ -n "$streamer" ]; then local frames=$(( $webcam__video_capture_time * $webcam__frames_per_second )) $streamer -o "$webcam__video" -f yuv2 -F stereo -r $webcam__frames_per_second -t $frames fi } prey.orig/version0000664000175100017510000000002012250331650013741 0ustar guerreguerreversion='0.6.2' prey.orig/platform/0000775000175100017510000000000012250331650014165 5ustar guerreguerreprey.orig/platform/linux/0000775000175100017510000000000012250331650015324 5ustar guerreguerreprey.orig/platform/linux/bin/0000775000175100017510000000000012250331650016074 5ustar guerreguerreprey.orig/platform/linux/bin/sendEmail0000775000175100017510000023574612250331650017744 0ustar guerreguerre#!/usr/bin/perl -w ############################################################################## ## sendEmail ## Written by: Brandon Zehm ## ## License: ## sendEmail (hereafter referred to as "program") is free software; ## you can redistribute it and/or modify it under the terms of the GNU General ## Public License as published by the Free Software Foundation; either version ## 2 of the License, or (at your option) any later version. ## When redistributing modified versions of this source code it is recommended ## that that this disclaimer and the above coder's names are included in the ## modified code. ## ## Disclaimer: ## This program is provided with no warranty of any kind, either expressed or ## implied. It is the responsibility of the user (you) to fully research and ## comprehend the usage of this program. As with any tool, it can be misused, ## either intentionally (you're a vandal) or unintentionally (you're a moron). ## THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM ## or anything that happens because of your use (or misuse) of this program, ## including but not limited to anything you, your lawyers, or anyone else ## can dream up. And now, a relevant quote directly from the GPL: ## ## NO WARRANTY ## ## 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ## FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ## OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ## PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ## OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ## TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ## PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ## REPAIR OR CORRECTION. ## ############################################################################## use strict; use IO::Socket; ######################## ## Global Variables ## ######################## my %conf = ( ## General "programName" => $0, ## The name of this program "version" => '1.56', ## The version of this program "authorName" => 'Brandon Zehm', ## Author's Name "authorEmail" => 'caspian@dotconf.net', ## Author's Email Address "timezone" => '+0000', ## We always use +0000 for the time zone "hostname" => 'changeme', ## Used in printmsg() for all output (is updated later in the script). "debug" => 0, ## Default debug level "error" => '', ## Error messages will often be stored here ## Logging "stdout" => 1, "logging" => 0, ## If this is true the printmsg function prints to the log file "logFile" => '', ## If this is specified (form the command line via -l) this file will be used for logging. ## Network "server" => 'localhost', ## Default SMTP server "port" => 25, ## Default port "bindaddr" => '', ## Default local bind address "alarm" => '', ## Default timeout for connects and reads, this gets set from $opt{'timeout'} "tls_client" => 0, ## If TLS is supported by the client (us) "tls_server" => 0, ## If TLS is supported by the remote SMTP server ## Email "delimiter" => "----MIME delimiter for sendEmail-" ## MIME Delimiter . rand(1000000), ## Add some randomness to the delimiter "Message-ID" => rand(1000000) . "-sendEmail", ## Message-ID for email header "ssl_available" => 0, ## If IO::Socket::SSL is available ); ## This hash stores the options passed on the command line via the -o option. my %opt = ( ## Addressing "reply-to" => '', ## Reply-To field ## Message "message-file" => '', ## File to read message body from "message-header" => '', ## Additional email header line(s) "message-format" => 'normal', ## If "raw" is specified the message is sent unmodified "message-charset" => 'iso-8859-1', ## Message character-set "message-content-type" => 'auto', ## auto, text, html or an actual string to put into the content-type header. ## Network "timeout" => 60, ## Default timeout for connects and reads, this is copied to $conf{'alarm'} later. "fqdn" => 'changeme', ## FQDN of this machine, used during SMTP communication (is updated later in the script). ## eSMTP "username" => '', ## Username used in SMTP Auth "password" => '', ## Password used in SMTP Auth "tls" => 'auto', ## Enable or disable TLS support. Options: auto, yes, no "ssl" => 'no', ## Enable or disable SSL connection support. Options: yes, no ); ## More variables used later in the program my $SERVER; my $CRLF = "\015\012"; my $subject = ''; my $header = ''; my $message = ''; my $from = ''; my @to = (); my @cc = (); my @bcc = (); my @attachments = (); my @attachments_names = (); ## For printing colors to the console my ${colorRed} = "\033[31;1m"; my ${colorGreen} = "\033[32;1m"; my ${colorCyan} = "\033[36;1m"; my ${colorWhite} = "\033[37;1m"; my ${colorNormal} = "\033[m"; my ${colorBold} = "\033[1m"; my ${colorNoBold} = "\033[0m"; ## Don't use shell escape codes on Windows systems if ($^O =~ /win/i) { ${colorRed} = ${colorGreen} = ${colorCyan} = ${colorWhite} = ${colorNormal} = ${colorBold} = ${colorNoBold} = ""; } ## Load IO::Socket::SSL if it's available eval { require IO::Socket::SSL; }; if ($@) { $conf{'tls_client'} = 0; } else { $conf{'tls_client'} = 1; $conf{'ssl_available'} = 1; } ############################# ## ## ## FUNCTIONS ## ## ## ############################# ############################################################################################### ## Function: initialize () ## ## Does all the script startup jibberish. ## ############################################################################################### sub initialize { ## Set STDOUT to flush immediatly after each print $| = 1; ## Intercept signals $SIG{'QUIT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'INT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'KILL'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'TERM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; ## ALARM and HUP signals are not supported in Win32 unless ($^O =~ /win/i) { $SIG{'HUP'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'ALRM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; } ## Fixup $conf{'programName'} $conf{'programName'} =~ s/(.)*[\/,\\]//; $0 = $conf{'programName'} . " " . join(" ", @ARGV); ## Fixup $conf{'hostname'} and $opt{'fqdn'} if ($opt{'fqdn'} eq 'changeme') { $opt{'fqdn'} = get_hostname(1); } if ($conf{'hostname'} eq 'changeme') { $conf{'hostname'} = $opt{'fqdn'}; $conf{'hostname'} =~ s/\..*//; } return(1); } ############################################################################################### ## Function: processCommandLine () ## ## Processes command line storing important data in global vars (usually %conf) ## ############################################################################################### sub processCommandLine { ############################ ## Process command line ## ############################ my @ARGS = @ARGV; ## This is so later we can re-parse the command line args later if we need to my $numargv = @ARGS; help() unless ($numargv); my $counter = 0; for ($counter = 0; $counter < $numargv; $counter++) { if ($ARGS[$counter] =~ /^-h$/i) { ## Help ## help(); } elsif ($ARGS[$counter] eq "") { ## Ignore null arguments ## Do nothing } elsif ($ARGS[$counter] =~ /^--help/) { ## Topical Help ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { helpTopic($ARGS[$counter]); } else { help(); } } elsif ($ARGS[$counter] =~ /^-o$/i) { ## Options specified with -o ## $counter++; ## Loop through each option passed after the -o while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($ARGS[$counter] !~ /(\S+)=(\S.*)/) { printmsg("WARNING => Name/Value pair [$ARGS[$counter]] is not properly formatted", 0); printmsg("WARNING => Arguments proceeding -o should be in the form of \"name=value\"", 0); } else { if (exists($opt{$1})) { if ($1 eq 'message-header') { $opt{$1} .= $2 . $CRLF; } else { $opt{$1} = $2; } printmsg("DEBUG => Assigned \$opt{} key/value: $1 => $2", 3); } else { printmsg("WARNING => Name/Value pair [$ARGS[$counter]] will be ignored: unknown key [$1]", 0); printmsg("HINT => Try the --help option to find valid command line arguments", 1); } } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-f$/) { ## From ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $from = $ARGS[$counter]; } else { printmsg("WARNING => The argument after -f was not an email address!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-t$/) { ## To ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@to, split(/[;,]/, $ARGS[$counter])); } else { push (@to,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-cc$/) { ## Cc ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@cc, split(/[;,]/, $ARGS[$counter])); } else { push (@cc,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-bcc$/) { ## Bcc ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@bcc, split(/[;,]/, $ARGS[$counter])); } else { push (@bcc,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-m$/) { ## Message ## $counter++; $message = ""; while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($message) { $message .= " "; } $message .= $ARGS[$counter]; $counter++; } $counter--; ## Replace '\n' with $CRLF. ## This allows newlines with messages sent on the command line $message =~ s/\\n/$CRLF/g; } elsif ($ARGS[$counter] =~ /^-u$/) { ## Subject ## $counter++; $subject = ""; while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($subject) { $subject .= " "; } $subject .= $ARGS[$counter]; $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-s$/) { ## Server ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'server'} = $ARGS[$counter]; if ($conf{'server'} =~ /:/) { ## Port ## ($conf{'server'},$conf{'port'}) = split(":",$conf{'server'}); } } else { printmsg("WARNING - The argument after -s was not the server!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-b$/) { ## Bind Address ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'bindaddr'} = $ARGS[$counter]; } else { printmsg("WARNING - The argument after -b was not the bindaddr!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-a$/) { ## Attachments ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { push (@attachments,$ARGS[$counter]); $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-xu$/) { ## AuthSMTP Username ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $opt{'username'} = $ARGS[$counter]; } else { printmsg("WARNING => The argument after -xu was not valid username!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-xp$/) { ## AuthSMTP Password ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $opt{'password'} = $ARGS[$counter]; } else { printmsg("WARNING => The argument after -xp was not valid password!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-l$/) { ## Logging ## $counter++; $conf{'logging'} = 1; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'logFile'} = $ARGS[$counter]; } else { printmsg("WARNING - The argument after -l was not the log file!", 0); $counter--; } } elsif ($ARGS[$counter] =~ s/^-v+//i) { ## Verbosity ## my $tmp = (length($&) - 1); $conf{'debug'} += $tmp; } elsif ($ARGS[$counter] =~ /^-q$/) { ## Quiet ## $conf{'stdout'} = 0; } else { printmsg("Error: \"$ARGS[$counter]\" is not a recognized option!", 0); help(); } } ################################################### ## Verify required variables are set correctly ## ################################################### ## Make sure we have something in $conf{hostname} and $opt{fqdn} if ($opt{'fqdn'} =~ /\./) { $conf{'hostname'} = $opt{'fqdn'}; $conf{'hostname'} =~ s/\..*//; } if (!$conf{'server'}) { $conf{'server'} = 'localhost'; } if (!$conf{'port'}) { $conf{'port'} = 25; } if (!$from) { quit("ERROR => You must specify a 'from' field! Try --help.", 1); } if ( ((scalar(@to)) + (scalar(@cc)) + (scalar(@bcc))) <= 0) { quit("ERROR => You must specify at least one recipient via -t, -cc, or -bcc", 1); } ## Make sure email addresses look OK. foreach my $addr (@to, @cc, @bcc, $from, $opt{'reply-to'}) { if ($addr) { if (!returnAddressParts($addr)) { printmsg("ERROR => Can't use improperly formatted email address: $addr", 0); printmsg("HINT => Try viewing the extended help on addressing with \"--help addressing\"", 1); quit("", 1); } } } ## Make sure all attachments exist. foreach my $file (@attachments) { if ( (! -f $file) or (! -r $file) ) { printmsg("ERROR => The attachment [$file] doesn't exist!", 0); printmsg("HINT => Try specifying the full path to the file or reading extended help with \"--help message\"", 1); quit("", 1); } } if ($conf{'logging'} and (!$conf{'logFile'})) { quit("ERROR => You used -l to enable logging but didn't specify a log file!", 1); } if ( $opt{'username'} ) { if (!$opt{'password'}) { ## Prompt for a password since one wasn't specified with the -xp option. $SIG{'ALRM'} = sub { quit("ERROR => Timeout waiting for password inpupt", 1); }; alarm(60) if ($^O !~ /win/i); ## alarm() doesn't work in win32 print "Password: "; $opt{'password'} = ; chomp $opt{'password'}; if (!$opt{'password'}) { quit("ERROR => A username for SMTP authentication was specified, but no password!", 1); } } } ## Validate the TLS setting $opt{'tls'} = lc($opt{'tls'}); if ($opt{'tls'} !~ /^(auto|yes|no)$/) { quit("ERROR => Invalid TLS setting ($opt{'tls'}). Must be one of auto, yes, or no.", 1); } ## If TLS is set to "yes", make sure sendEmail loaded the libraries needed. if ($opt{'tls'} eq 'yes' and $conf{'tls_client'} == 0) { quit("ERROR => No TLS support! SendEmail can't load required libraries. (try installing Net::SSLeay and IO::Socket::SSL)", 1); } ## Return 0 errors return(0); } ## getline($socketRef) sub getline { my ($socketRef) = @_; local ($/) = "\r\n"; return $$socketRef->getline; } ## Receive a (multiline?) SMTP response from ($socketRef) sub getResponse { my ($socketRef) = @_; my ($tmp, $reply); local ($/) = "\r\n"; return undef unless defined($tmp = getline($socketRef)); return("getResponse() socket is not open") unless ($$socketRef->opened); ## Keep reading lines if it's a multi-line response while ($tmp =~ /^\d{3}-/o) { $reply .= $tmp; return undef unless defined($tmp = getline($socketRef)); } $reply .= $tmp; $reply =~ s/\r?\n$//o; return $reply; } ############################################################################################### ## Function: SMTPchat ( [string $command] ) ## ## Description: Sends $command to the SMTP server (on SERVER) and awaits a successful ## reply form the server. If the server returns an error, or does not reply ## within $conf{'alarm'} seconds an error is generated. ## NOTE: $command is optional, if no command is specified then nothing will ## be sent to the server, but a valid response is still required from the server. ## ## Input: [$command] A (optional) valid SMTP command (ex. "HELO") ## ## ## Output: Returns zero on success, or non-zero on error. ## Error messages will be stored in $conf{'error'} ## A copy of the last SMTP response is stored in the global variable ## $conf{'SMTPchat_response'} ## ## ## Example: SMTPchat ("HELO mail.isp.net"); ############################################################################################### sub SMTPchat { my ($command) = @_; printmsg("INFO => Sending: \t$command", 1) if ($command); ## Send our command print $SERVER "$command$CRLF" if ($command); ## Read a response from the server $SIG{'ALRM'} = sub { $conf{'error'} = "alarm"; $SERVER->close(); }; alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; my $result = $conf{'SMTPchat_response'} = getResponse(\$SERVER); alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; ## Generate an alert if we timed out if ($conf{'error'} eq "alarm") { $conf{'error'} = "ERROR => Timeout while reading from $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds."; return(1); } ## Make sure the server actually responded if (!$result) { $conf{'error'} = "ERROR => $conf{'server'}:$conf{'port'} returned a zero byte response to our query."; return(2); } ## Validate the response if (evalSMTPresponse($result)) { ## conf{'error'} will already be set here return(2); } ## Print the success messsage printmsg($conf{'error'}, 1); ## Return Success return(0); } ############################################################################################### ## Function: evalSMTPresponse (string $message ) ## ## Description: Searches $message for either an SMTP success or error code, and returns ## 0 on success, and the actual error code on error. ## ## ## Input: $message Data received from a SMTP server (ex. "220 ## ## ## Output: Returns zero on success, or non-zero on error. ## Error messages will be stored in $conf{'error'} ## ## ## Example: SMTPchat ("HELO mail.isp.net"); ############################################################################################### sub evalSMTPresponse { my ($message) = @_; ## Validate input if (!$message) { $conf{'error'} = "ERROR => No message was passed to evalSMTPresponse(). What happened?"; return(1) } printmsg("DEBUG => evalSMTPresponse() - Checking for SMTP success or error status in the message: $message ", 3); ## Look for a SMTP success code if ($message =~ /^([23]\d\d)/) { printmsg("DEBUG => evalSMTPresponse() - Found SMTP success code: $1", 2); $conf{'error'} = "SUCCESS => Received: \t$message"; return(0); } ## Look for a SMTP error code if ($message =~ /^([45]\d\d)/) { printmsg("DEBUG => evalSMTPresponse() - Found SMTP error code: $1", 2); $conf{'error'} = "ERROR => Received: \t$message"; return($1); } ## If no SMTP codes were found return an error of 1 $conf{'error'} = "ERROR => Received a message with no success or error code. The message received was: $message"; return(2); } ######################################################### # SUB: &return_month(0,1,etc) # returns the name of the month that corrosponds # with the number. returns 0 on error. ######################################################### sub return_month { my $x = $_[0]; if ($x == 0) { return 'Jan'; } if ($x == 1) { return 'Feb'; } if ($x == 2) { return 'Mar'; } if ($x == 3) { return 'Apr'; } if ($x == 4) { return 'May'; } if ($x == 5) { return 'Jun'; } if ($x == 6) { return 'Jul'; } if ($x == 7) { return 'Aug'; } if ($x == 8) { return 'Sep'; } if ($x == 9) { return 'Oct'; } if ($x == 10) { return 'Nov'; } if ($x == 11) { return 'Dec'; } return (0); } ######################################################### # SUB: &return_day(0,1,etc) # returns the name of the day that corrosponds # with the number. returns 0 on error. ######################################################### sub return_day { my $x = $_[0]; if ($x == 0) { return 'Sun'; } if ($x == 1) { return 'Mon'; } if ($x == 2) { return 'Tue'; } if ($x == 3) { return 'Wed'; } if ($x == 4) { return 'Thu'; } if ($x == 5) { return 'Fri'; } if ($x == 6) { return 'Sat'; } return (0); } ############################################################################################### ## Function: returnAddressParts(string $address) ## ## Description: Returns a two element array containing the "Name" and "Address" parts of ## an email address. ## ## Example: "Brandon Zehm " ## would return: ("Brandon Zehm", "caspian@dotconf.net"); ## ## "caspian@dotconf.net" ## would return: ("caspian@dotconf.net", "caspian@dotconf.net") ############################################################################################### sub returnAddressParts { my $input = $_[0]; my $name = ""; my $address = ""; ## Make sure to fail if it looks totally invalid if ($input !~ /(\S+\@\S+)/) { $conf{'error'} = "ERROR => The address [$input] doesn't look like a valid email address, ignoring it"; return(undef()); } ## Check 1, should find addresses like: "Brandon Zehm " elsif ($input =~ /^\s*(\S(.*\S)?)\s*<(\S+\@\S+)>/o) { ($name, $address) = ($1, $3); } ## Otherwise if that failed, just get the address: elsif ($input =~ /<(\S+\@\S+)>/o) { $name = $address = $1; } ## Or maybe it was formatted this way: caspian@dotconf.net elsif ($input =~ /(\S+\@\S+)/o) { $name = $address = $1; } ## Something stupid happened, just return an error. unless ($name and $address) { printmsg("ERROR => Couldn't parse the address: $input", 0); printmsg("HINT => If you think this should work, consider reporting this as a bug to $conf{'authorEmail'}", 1); return(undef()); } ## Make sure there aren't invalid characters in the address, and return it. my $ctrl = '\000-\037'; my $nonASCII = '\x80-\xff'; if ($address =~ /[<> ,;:"'\[\]\\$ctrl$nonASCII]/) { printmsg("WARNING => The address [$address] seems to contain invalid characters: continuing anyway", 0); } return($name, $address); } ############################################################################################### ## Function: base64_encode(string $data, bool $chunk) ## ## Description: Returns $data as a base64 encoded string. ## If $chunk is true, the encoded data is returned in 76 character long lines ## with the final \CR\LF removed. ## ## Note: This is only used from the smtp auth section of code. ## At some point it would be nice to merge the code that encodes attachments and this. ############################################################################################### sub base64_encode { my $data = $_[0]; my $chunk = $_[1]; my $tmp = ''; my $base64 = ''; my $CRLF = "\r\n"; ################################### ## Convert binary data to base64 ## ################################### while ($data =~ s/(.{45})//s) { ## Get 45 bytes from the binary string $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $base64 .= $tmp; } ########################## ## Encode the leftovers ## ########################## my $padding = ""; if ( ($data) and (length($data) > 0) ) { $padding = (3 - length($data) % 3) % 3; ## Set flag if binary data isn't divisible by 3 $tmp = substr(pack('u', $data), 1); ## Convert the binary to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $base64 .= $tmp; } ############################ ## Fix padding at the end ## ############################ $data = ''; $base64 =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set if ($chunk) { while ($base64 =~ s/(.{1,76})//s) { ## Put $CRLF after each 76 characters $data .= "$1$CRLF"; } } else { $data = $base64; } ## Remove any trailing CRLF's $data =~ s/(\r|\n)*$//s; return($data); } ######################################################### # SUB: send_attachment("/path/filename") # Sends the mime headers and base64 encoded file # to the email server. ######################################################### sub send_attachment { my ($filename) = @_; ## Get filename passed my (@fields, $y, $filename_name, $encoding, ## Local variables @attachlines, $content_type); my $bin = 1; @fields = split(/\/|\\/, $filename); ## Get the actual filename without the path $filename_name = pop(@fields); push @attachments_names, $filename_name; ## FIXME: This is only used later for putting in the log file ########################## ## Autodetect Mime Type ## ########################## @fields = split(/\./, $filename_name); $encoding = $fields[$#fields]; if ($encoding =~ /txt|text|log|conf|^c$|cpp|^h$|inc|m3u/i) { $content_type = 'text/plain'; } elsif ($encoding =~ /html|htm|shtml|shtm|asp|php|cfm/i) { $content_type = 'text/html'; } elsif ($encoding =~ /sh$/i) { $content_type = 'application/x-sh'; } elsif ($encoding =~ /tcl/i) { $content_type = 'application/x-tcl'; } elsif ($encoding =~ /pl$/i) { $content_type = 'application/x-perl'; } elsif ($encoding =~ /js$/i) { $content_type = 'application/x-javascript'; } elsif ($encoding =~ /man/i) { $content_type = 'application/x-troff-man'; } elsif ($encoding =~ /gif/i) { $content_type = 'image/gif'; } elsif ($encoding =~ /jpg|jpeg|jpe|jfif|pjpeg|pjp/i) { $content_type = 'image/jpeg'; } elsif ($encoding =~ /tif|tiff/i) { $content_type = 'image/tiff'; } elsif ($encoding =~ /xpm/i) { $content_type = 'image/x-xpixmap'; } elsif ($encoding =~ /bmp/i) { $content_type = 'image/x-MS-bmp'; } elsif ($encoding =~ /pcd/i) { $content_type = 'image/x-photo-cd'; } elsif ($encoding =~ /png/i) { $content_type = 'image/png'; } elsif ($encoding =~ /aif|aiff/i) { $content_type = 'audio/x-aiff'; } elsif ($encoding =~ /wav/i) { $content_type = 'audio/x-wav'; } elsif ($encoding =~ /mp2|mp3|mpa/i) { $content_type = 'audio/x-mpeg'; } elsif ($encoding =~ /ra$|ram/i) { $content_type = 'audio/x-pn-realaudio'; } elsif ($encoding =~ /mpeg|mpg/i) { $content_type = 'video/mpeg'; } elsif ($encoding =~ /mov|qt$/i) { $content_type = 'video/quicktime'; } elsif ($encoding =~ /avi/i) { $content_type = 'video/x-msvideo'; } elsif ($encoding =~ /zip/i) { $content_type = 'application/x-zip-compressed'; } elsif ($encoding =~ /tar/i) { $content_type = 'application/x-tar'; } elsif ($encoding =~ /jar/i) { $content_type = 'application/java-archive'; } elsif ($encoding =~ /exe|bin/i) { $content_type = 'application/octet-stream'; } elsif ($encoding =~ /ppt|pot|ppa|pps|pwz/i) { $content_type = 'application/vnd.ms-powerpoint'; } elsif ($encoding =~ /mdb|mda|mde/i) { $content_type = 'application/vnd.ms-access'; } elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) { $content_type = 'application/vnd.ms-excel'; } elsif ($encoding =~ /doc|dot/i) { $content_type = 'application/msword'; } elsif ($encoding =~ /rtf/i) { $content_type = 'application/rtf'; } elsif ($encoding =~ /pdf/i) { $content_type = 'application/pdf'; } elsif ($encoding =~ /tex/i) { $content_type = 'application/x-tex'; } elsif ($encoding =~ /latex/i) { $content_type = 'application/x-latex'; } elsif ($encoding =~ /vcf/i) { $content_type = 'application/x-vcard'; } else { $content_type = 'application/octet-stream'; } ############################ ## Process the attachment ## ############################ ##################################### ## Generate and print MIME headers ## ##################################### $y = "$CRLF--$conf{'delimiter'}$CRLF"; $y .= "Content-Type: $content_type;$CRLF"; $y .= " name=\"$filename_name\"$CRLF"; $y .= "Content-Transfer-Encoding: base64$CRLF"; $y .= "Content-Disposition: attachment; filename=\"$filename_name\"$CRLF"; $y .= "$CRLF"; print $SERVER $y; ########################################################### ## Convert the file to base64 and print it to the server ## ########################################################### open (FILETOATTACH, $filename) || do { printmsg("ERROR => Opening the file [$filename] for attachment failed with the error: $!", 0); return(1); }; binmode(FILETOATTACH); ## Hack to make Win32 work my $res = ""; my $tmp = ""; my $base64 = ""; while () { ## Read a line from the (binary) file $res .= $_; ################################### ## Convert binary data to base64 ## ################################### while ($res =~ s/(.{45})//s) { ## Get 45 bytes from the binary string $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $base64 .= $tmp; } ################################ ## Print chunks to the server ## ################################ while ($base64 =~ s/(.{76})//s) { print $SERVER "$1$CRLF"; } } ################################### ## Encode and send the leftovers ## ################################### my $padding = ""; if ( ($res) and (length($res) >= 1) ) { $padding = (3 - length($res) % 3) % 3; ## Set flag if binary data isn't divisible by 3 $res = substr(pack('u', $res), 1); ## Convert the binary to uuencoded text chop($res); $res =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 } ############################ ## Fix padding at the end ## ############################ $res = $base64 . $res; ## Get left overs from above $res =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set if ($res) { while ($res =~ s/(.{1,76})//s) { ## Send it to the email server. print $SERVER "$1$CRLF"; } } close (FILETOATTACH) || do { printmsg("ERROR - Closing the filehandle for file [$filename] failed with the error: $!", 0); return(2); }; ## Return 0 errors return(0); } ############################################################################################### ## Function: $string = get_hostname (boot $fqdn) ## ## Description: Tries really hard to returns the short (or FQDN) hostname of the current ## system. Uses techniques and code from the Sys-Hostname module. ## ## Input: $fqdn A true value (1) will cause this function to return a FQDN hostname ## rather than a short hostname. ## ## Output: Returns a string ############################################################################################### sub get_hostname { ## Assign incoming parameters to variables my ( $fqdn ) = @_; my $hostname = ""; ## STEP 1: Get short hostname ## Load Sys::Hostname if it's available eval { require Sys::Hostname; }; unless ($@) { $hostname = Sys::Hostname::hostname(); } ## If that didn't get us a hostname, try a few other things else { ## Windows systems if ($^O !~ /win/i) { if ($ENV{'COMPUTERNAME'}) { $hostname = $ENV{'COMPUTERNAME'}; } if (!$hostname) { $hostname = gethostbyname('localhost'); } if (!$hostname) { chomp($hostname = `hostname 2> NUL`) }; } ## Unix systems else { local $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; ## Paranoia ## Try the environment first (Help! What other variables could/should I be checking here?) if ($ENV{'HOSTNAME'}) { $hostname = $ENV{'HOSTNAME'}; } ## Try the hostname command eval { local $SIG{__DIE__}; local $SIG{CHLD}; $hostname = `hostname 2>/dev/null`; chomp($hostname); } || ## Try POSIX::uname(), which strictly can't be expected to be correct eval { local $SIG{__DIE__}; require POSIX; $hostname = (POSIX::uname())[1]; } || ## Try the uname command eval { local $SIG{__DIE__}; $hostname = `uname -n 2>/dev/null`; chomp($hostname); }; } ## If we can't find anything else, return "" if (!$hostname) { print "WARNING => No hostname could be determined, please specify one with -o fqdn=FQDN option!\n"; return("unknown"); } } ## Return the short hostname unless ($fqdn) { $hostname =~ s/\..*//; return(lc($hostname)); } ## STEP 2: Determine the FQDN ## First, if we already have one return it. if ($hostname =~ /\w\.\w/) { return(lc($hostname)); } ## Next try using eval { $fqdn = (gethostbyname($hostname))[0]; }; if ($fqdn) { return(lc($fqdn)); } return(lc($hostname)); } ############################################################################################### ## Function: printmsg (string $message, int $level) ## ## Description: Handles all messages - printing them to the screen only if the messages ## $level is >= the global debug level. If $conf{'logFile'} is defined it ## will also log the message to that file. ## ## Input: $message A message to be printed, logged, etc. ## $level The debug level of the message. If ## not defined 0 will be assumed. 0 is ## considered a normal message, 1 and ## higher is considered a debug message. ## ## Output: Prints to STDOUT ## ## Assumptions: $conf{'hostname'} should be the name of the computer we're running on. ## $conf{'stdout'} should be set to 1 if you want to print to stdout ## $conf{'logFile'} should be a full path to a log file if you want that ## $conf{'debug'} should be an integer between 0 and 10. ## ## Example: printmsg("WARNING: We believe in generic error messages... NOT!", 0); ############################################################################################### sub printmsg { ## Assign incoming parameters to variables my ( $message, $level ) = @_; ## Make sure input is sane $level = 0 if (!defined($level)); $message =~ s/\s+$//sgo; $message =~ s/\r?\n/, /sgo; ## Continue only if the debug level of the program is >= message debug level. if ($conf{'debug'} >= $level) { ## Get the date in the format: Dec 3 11:14:04 my ($sec, $min, $hour, $mday, $mon) = localtime(); $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon]; my $date = sprintf("%s %02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec); ## Print to STDOUT always if debugging is enabled, or if conf{stdout} is true. if ( ($conf{'debug'} >= 1) or ($conf{'stdout'} == 1) ) { print "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; } ## Print to the log file if $conf{'logging'} is true if ($conf{'logFile'}) { if (openLogFile($conf{'logFile'})) { $conf{'logFile'} = ""; printmsg("ERROR => Opening the file [$conf{'logFile'}] for appending returned the error: $!", 1); } print LOGFILE "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; } } ## Return 0 errors return(0); } ############################################################################################### ## FUNCTION: ## openLogFile ( $filename ) ## ## ## DESCRIPTION: ## Opens the file $filename and attaches it to the filehandle "LOGFILE". Returns 0 on success ## and non-zero on failure. Error codes are listed below, and the error message gets set in ## global variable $!. ## ## ## Example: ## openFile ("/var/log/sendEmail.log"); ## ############################################################################################### sub openLogFile { ## Get the incoming filename my $filename = $_[0]; ## Make sure our file exists, and if the file doesn't exist then create it if ( ! -f $filename ) { print STDERR "NOTICE: The log file [$filename] does not exist. Creating it now with mode [0600].\n" if ($conf{'stdout'}); open (LOGFILE, ">>$filename"); close LOGFILE; chmod (0600, $filename); } ## Now open the file and attach it to a filehandle open (LOGFILE,">>$filename") or return (1); ## Put the file into non-buffering mode select LOGFILE; $| = 1; select STDOUT; ## Return success return(0); } ############################################################################################### ## Function: read_file (string $filename) ## ## Description: Reads the contents of a file and returns a two part array: ## ($status, $file-contents) ## $status is 0 on success, non-zero on error. ## ## Example: ($status, $file) = read_file("/etc/passwd"); ############################################################################################### sub read_file { my ( $filename ) = @_; ## If the value specified is a file, load the file's contents if ( (-e $filename and -r $filename) ) { my $FILE; if(!open($FILE, ' ' . $filename)) { return((1, "")); } my $file = ''; while (<$FILE>) { $file .= $_; } ## Strip an ending \r\n $file =~ s/\r?\n$//os; } return((1, "")); } ############################################################################################### ## Function: quit (string $message, int $errorLevel) ## ## Description: Exits the program, optionally printing $message. It ## returns an exit error level of $errorLevel to the ## system (0 means no errors, and is assumed if empty.) ## ## Example: quit("Exiting program normally", 0); ############################################################################################### sub quit { my ( $message, $errorLevel ) = @_; $errorLevel = 0 if (!defined($errorLevel)); ## Print exit message if ($message) { printmsg($message, 0); } ## Exit exit($errorLevel); } ############################################################################################### ## Function: help () ## ## Description: For all those newbies ;) ## Prints a help message and exits the program. ## ############################################################################################### sub help { exit(1) if (!$conf{'stdout'}); print <${colorNoBold} Synopsis: $conf{'programName'} -f ADDRESS [options] ${colorRed}Required:${colorNormal} -f ADDRESS from (sender) email address * At least one recipient required via -t, -cc, or -bcc * Message body required via -m, STDIN, or -o message-file=FILE ${colorGreen}Common:${colorNormal} -t ADDRESS [ADDR ...] to email address(es) -u SUBJECT message subject -m MESSAGE message body -s SERVER[:PORT] smtp mail relay, default is $conf{'server'}:$conf{'port'} ${colorGreen}Optional:${colorNormal} -a FILE [FILE ...] file attachment(s) -cc ADDRESS [ADDR ...] cc email address(es) -bcc ADDRESS [ADDR ...] bcc email address(es) -xu USERNAME username for SMTP authentication -xp PASSWORD password for SMTP authentication ${colorGreen}Paranormal:${colorNormal} -b BINDADDR[:PORT] local host bind address -l LOGFILE log to the specified file -v verbosity, use multiple times for greater effect -q be quiet (i.e. no STDOUT output) -o NAME=VALUE advanced options, for details try: --help misc -o message-content-type= -o message-file=FILE -o message-format=raw -o message-header=HEADER -o message-charset=CHARSET -o reply-to=ADDRESS -o timeout=SECONDS -o username=USERNAME -o password=PASSWORD -o tls= -o fqdn=FQDN ${colorGreen}Help:${colorNormal} --help the helpful overview you're reading now --help addressing explain addressing and related options --help message explain message body input and related options --help networking explain -s, -b, etc --help output explain logging and other output options --help misc explain -o options, TLS, SMTP auth, and more EOM exit(1); } ############################################################################################### ## Function: helpTopic ($topic) ## ## Description: For all those newbies ;) ## Prints a help message and exits the program. ## ############################################################################################### sub helpTopic { exit(1) if (!$conf{'stdout'}); my ($topic) = @_; CASE: { ## ADDRESSING ($topic eq 'addressing') && do { print <" Just Address: "john.doe\@gmail.com" The "Full Name" method is useful if you want a name, rather than a plain email address, to be displayed in the recipient's From, To, or Cc fields when they view the message. ${colorGreen}Multiple Recipients${colorNormal} The -t, -cc, and -bcc options each accept multiple addresses. They may be specified by separating them by either a white space, comma, or semi-colon separated list. You may also specify the -t, -cc, and -bcc options multiple times, each occurance will append the new recipients to the respective list. Examples: (I used "-t" in these examples, but it can be "-cc" or "-bcc" as well) * Space separated list: -t jane.doe\@yahoo.com "John Doe " * Semi-colon separated list: -t "jane.doe\@yahoo.com; John Doe " * Comma separated list: -t "jane.doe\@yahoo.com, John Doe " * Multiple -t, -cc, or -bcc options: -t "jane.doe\@yahoo.com" -t "John Doe " EOM last CASE; }; ## MESSAGE ($topic eq 'message') && do { print < -o message-header=EMAIL HEADER -o message-charset=CHARSET -o message-format=raw -u SUBJECT This option allows you to specify the subject for your email message. It is not required (anymore) that the subject be quoted, although it is recommended. The subject will be read until an argument starting with a hyphen (-) is found. Examples: -u "Contact information while on vacation" -u New Microsoft vulnerability discovered -m MESSAGE This option is one of three methods that allow you to specify the message body for your email. The message may be specified on the command line with this -m option, read from a file with the -o message-file=FILE option, or read from STDIN if neither of these options are present. It is not required (anymore) that the message be quoted, although it is recommended. The message will be read until an argument starting with a hyphen (-) is found. Examples: -m "See you in South Beach, Hawaii. -Todd" -m Please ensure that you upgrade your systems right away Multi-line message bodies may be specified with the -m option by putting a "\\n" into the message. Example: -m "This is line 1.\\nAnd this is line 2." HTML messages are supported, simply begin your message with "" and sendEmail will properly label the mime header so MUAs properly render the message. It is currently not possible without "-o message-format=raw" to send a message with both text and html parts with sendEmail. -o message-file=FILE This option is one of three methods that allow you to specify the message body for your email. To use this option simply specify a text file containing the body of your email message. Examples: -o message-file=/root/message.txt -o message-file="C:\\Program Files\\output.txt" -o message-content-type= This option allows you to specify the content-type of the email. If your email message is an html message but is being displayed as a text message just add "-o message-content-type=html" to the command line to force it to display as an html message. This actually just changes the Content-Type: header. Advanced users will be happy to know that if you specify anything other than the three options listed above it will use that as the vaule for the Content-Type header. -o message-header=EMAIL HEADER This option allows you to specify additional email headers to be included. To add more than one message header simply use this option on the command line more than once. If you specify a message header that sendEmail would normally generate the one you specified will be used in it's place. Do not use this unless you know what you are doing! Example: To scare a Microsoft Outlook user you may want to try this: -o message-header="X-Message-Flag: Message contains illegal content" Example: To request a read-receipt try this: -o message-header="Disposition-Notification-To: " Example: To set the message priority try this: -o message-header="X-Priority: 1" Priority reference: 1=highest, 2=high, 3=normal, 4=low, 5=lowest -o message-charset=CHARSET This option allows you to specify the character-set for the message body. The default is iso-8859-1. -o message-format=raw This option instructs sendEmail to assume the message (specified with -m, read from STDIN, or read from the file specified in -o message-file=FILE) is already a *complete* email message. SendEmail will not generate any headers and will transmit the message as-is to the remote SMTP server. Due to the nature of this option the following command line options will be ignored when this one is used: -u SUBJECT -o message-header=EMAIL HEADER -o message-charset=CHARSET -a ATTACHMENT ${colorGreen}The Message Body${colorNormal} The email message body may be specified in one of three ways: 1) Via the -m MESSAGE command line option. Example: -m "This is the message body" 2) By putting the message body in a file and using the -o message-file=FILE command line option. Example: -o message-file=/root/message.txt 3) By piping the message body to sendEmail when nither of the above command line options were specified. Example: grep "ERROR" /var/log/messages | sendEmail -t you\@domain.com ... If the message body begins with "" then the message will be treated as an HTML message and the MIME headers will be written so that a HTML capable email client will display the message in it's HTML form. Any of the above methods may be used with the -o message-format=raw option to deliver an already complete email message. EOM last CASE; }; ## MISC ($topic eq 'misc') && do { print < -o timeout=SECONDS -o fqdn=FQDN -a ATTACHMENT [ATTACHMENT ...] This option allows you to attach any number of files to your email message. To specify more than one attachment, simply separate each filename with a space. Example: -a file1.txt file2.txt file3.txt -xu USERNAME Alias for -o username=USERNAME -xp PASSWORD Alias for -o password=PASSWORD -o username=USERNAME (synonym for -xu) These options allow specification of a username to be used with SMTP servers that require authentication. If a username is specified but a password is not, you will be prompted to enter one at runtime. -o password=PASSWORD (synonym for -xp) These options allow specification of a password to be used with SMTP servers that require authentication. If a username is specified but a password is not, you will be prompted to enter one at runtime. -o tls= This option allows you to specify if TLS (SSL for SMTP) should be enabled or disabled. The default, auto, will use TLS automatically if your perl installation has the IO::Socket::SSL and Net::SSLeay modules available, and if the remote SMTP server supports TLS. To require TLS for message delivery set this to yes. To disable TLS support set this to no. A debug level of one or higher will reveal details about the status of TLS. -o timeout=SECONDS This option sets the timeout value in seconds used for all network reads, writes, and a few other things. -o fqdn=FQDN This option sets the Fully Qualified Domain Name used during the initial SMTP greeting. Normally this is automatically detected, but in case you need to manually set it for some reason or get a warning about detection failing, you can use this to override the default. EOM last CASE; }; ## NETWORKING ($topic eq 'networking') && do { print < -o timeout=SECONDS -s SERVER[:PORT] This option allows you to specify the SMTP server sendEmail should connect to to deliver your email message to. If this option is not specified sendEmail will try to connect to localhost:25 to deliver the message. THIS IS MOST LIKELY NOT WHAT YOU WANT, AND WILL LIKELY FAIL unless you have a email server (commonly known as an MTA) running on your computer! Typically you will need to specify your company or ISP's email server. For example, if you use CableOne you will need to specify: -s mail.cableone.net If you have your own email server running on port 300 you would probably use an option like this: -s myserver.mydomain.com:300 If you're a GMail user try: -s smtp.gmail.com:587 -xu me\@gmail.com -xp PASSWD -b BINDADDR[:PORT] This option allows you to specify the local IP address (and optional tcp port number) for sendEmail to bind to when connecting to the remote SMTP server. This useful for people who need to send an email from a specific network interface or source address and are running sendEmail on a firewall or other host with several network interfaces. -o tls= This option allows you to specify if TLS (SSL for SMTP) should be enabled or disabled. The default, auto, will use TLS automatically if your perl installation has the IO::Socket::SSL and Net::SSLeay modules available, and if the remote SMTP server supports TLS. To require TLS for message delivery set this to yes. To disable TLS support set this to no. A debug level of one or higher will reveal details about the status of TLS. -o timeout=SECONDS This option sets the timeout value in seconds used for all network reads, writes, and a few other things. EOM last CASE; }; ## OUTPUT ($topic eq 'output') && do { print < The help topic specified is not valid!", 1); }; exit(1); } ############################# ## ## ## MAIN PROGRAM ## ## ## ############################# ## Initialize initialize(); ## Process Command Line processCommandLine(); $conf{'alarm'} = $opt{'timeout'}; ## Abort program after $conf{'alarm'} seconds to avoid infinite hangs alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 ################################################### ## Read $message from STDIN if -m was not used ## ################################################### if (!($message)) { ## Read message body from a file specified with -o message-file= if ($opt{'message-file'}) { if (! -e $opt{'message-file'}) { printmsg("ERROR => Message body file specified [$opt{'message-file'}] does not exist!", 0); printmsg("HINT => 1) check spelling of your file; 2) fully qualify the path; 3) doubble quote it", 1); quit("", 1); } if (! -r $opt{'message-file'}) { printmsg("ERROR => Message body file specified can not be read due to restricted permissions!", 0); printmsg("HINT => Check permissions on file specified to ensure it can be read", 1); quit("", 1); } if (!open(MFILE, "< " . $opt{'message-file'})) { printmsg("ERROR => Error opening message body file [$opt{'message-file'}]: $!", 0); quit("", 1); } while () { $message .= $_; } close(MFILE); } ## Read message body from STDIN else { alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 if ($conf{'stdout'}) { print "Reading message body from STDIN because the '-m' option was not used.\n"; print "If you are manually typing in a message:\n"; print " - First line must be received within $conf{'alarm'} seconds.\n" if ($^O !~ /win/i); print " - End manual input with a CTRL-D on its own line.\n\n" if ($^O !~ /win/i); print " - End manual input with a CTRL-Z on its own line.\n\n" if ($^O =~ /win/i); } while () { ## Read STDIN into $message $message .= $_; alarm(0) if ($^O !~ /win/i); ## Disable the alarm since at least one line was received } printmsg("Message input complete.", 0); } } ## Replace bare LF's with CRLF's (\012 should always have \015 with it) $message =~ s/(\015)?(\012|$)/\015\012/g; ## Replace bare CR's with CRLF's (\015 should always have \012 with it) $message =~ s/(\015)(\012|$)?/\015\012/g; ## Check message for bare periods and encode them $message =~ s/(^|$CRLF)(\.{1})($CRLF|$)/$1.$2$3/g; ## Get the current date for the email header my ($sec,$min,$hour,$mday,$mon,$year,$day) = gmtime(); $year += 1900; $mon = return_month($mon); $day = return_day($day); my $date = sprintf("%s, %s %s %d %.2d:%.2d:%.2d %s",$day, $mday, $mon, $year, $hour, $min, $sec, $conf{'timezone'}); ################################## ## Connect to the SMTP server ## ################################## printmsg("DEBUG => Connecting to $conf{'server'}:$conf{'port'}", 1); $SIG{'ALRM'} = sub { printmsg("ERROR => Timeout while connecting to $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.", 0); printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); quit("", 1); }; alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; $SERVER = IO::Socket::INET->new( PeerAddr => $conf{'server'}, PeerPort => $conf{'port'}, LocalAddr => $conf{'bindaddr'}, Proto => 'tcp', Autoflush => 1, timeout => $conf{'alarm'}, ); alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; ## Make sure we got connected if ( (!$SERVER) or (!$SERVER->opened()) ) { printmsg("ERROR => Connection attempt to $conf{'server'}:$conf{'port'} failed: $@", 0); printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); quit("", 1); } ## Save our IP address for later $conf{'ip'} = $SERVER->sockhost(); printmsg("DEBUG => My IP address is: $conf{'ip'}", 1); ######################### ## Do the SMTP Dance ## ######################### ## If we're connecting to an SSL server, we need to start SSL on the socket before we do any SMTP ## This doesn't interfere with the socket creation or config for TLS if ($opt{'ssl'} =~ /^(yes)$/ and $conf{'ssl_available'} == 1) { if(! IO::Socket::SSL->start_SSL($SERVER)) { quit("ERROR => SSL requested and available but socket setup failed: " . IO::Socket::SSL::errstr(), 1); } } ## Read initial greeting to make sure we're talking to a live SMTP server if (SMTPchat()) { quit($conf{'error'}, 1); } ## We're about to use $opt{'fqdn'}, make sure it isn't empty if (!$opt{'fqdn'}) { ## Ok, that means we couldn't get a hostname, how about using the IP address for the HELO instead $opt{'fqdn'} = "[" . $conf{'ip'} . "]"; } ## EHLO if (SMTPchat('EHLO ' . $opt{'fqdn'})) { printmsg($conf{'error'}, 0); printmsg("NOTICE => EHLO command failed, attempting HELO instead"); if (SMTPchat('HELO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); } if ( $opt{'username'} and $opt{'password'} ) { printmsg("WARNING => The mail server does not support SMTP authentication!", 0); } } else { ## Determin if the server supports TLS if ($conf{'SMTPchat_response'} =~ /STARTTLS/) { $conf{'tls_server'} = 1; printmsg("DEBUG => The remote SMTP server supports TLS :)", 2); } else { $conf{'tls_server'} = 0; printmsg("DEBUG => The remote SMTP server does NOT support TLS :(", 2); } ## Start TLS if possible if ($conf{'tls_server'} == 1 and $conf{'tls_client'} == 1 and $opt{'tls'} =~ /^(yes|auto)$/) { printmsg("DEBUG => Starting TLS", 2); if (SMTPchat('STARTTLS')) { quit($conf{'error'}, 1); } if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) { quit("ERROR => TLS setup failed: " . IO::Socket::SSL::errstr(), 1); } printmsg("DEBUG => TLS: Using cipher: ". $SERVER->get_cipher(), 3); printmsg("DEBUG => TLS session initialized :)", 1); ## Restart our SMTP session if (SMTPchat('EHLO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); } } elsif ($opt{'tls'} eq 'yes' and $conf{'tls_server'} == 0) { quit("ERROR => TLS not possible! Remote SMTP server, $conf{'server'}, does not support it.", 1); } ## Do SMTP Auth if required if ( $opt{'username'} and $opt{'password'} ) { if ($conf{'SMTPchat_response'} !~ /AUTH\s/) { printmsg("NOTICE => Authentication not supported by the remote SMTP server!", 0); } else { my $auth_succeeded = 0; my $mutual_method = 0; # ## SASL CRAM-MD5 authentication method # if ($conf{'SMTPchat_response'} =~ /\bCRAM-MD5\b/i) { # printmsg("DEBUG => SMTP-AUTH: Using CRAM-MD5 authentication method", 1); # if (SMTPchat('AUTH CRAM-MD5')) { quit($conf{'error'}, 1); } # # ## FIXME!! # # printmsg("DEBUG => User authentication was successful", 1); # } ## SASL LOGIN authentication method if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bLOGIN\b/i) { $mutual_method = 1; printmsg("DEBUG => SMTP-AUTH: Using LOGIN authentication method", 1); if (!SMTPchat('AUTH LOGIN')) { if (!SMTPchat(base64_encode($opt{'username'}))) { if (!SMTPchat(base64_encode($opt{'password'}))) { $auth_succeeded = 1; printmsg("DEBUG => User authentication was successful (Method: LOGIN)", 1); } } } if ($auth_succeeded == 0) { printmsg("DEBUG => SMTP-AUTH: LOGIN authenticaion failed.", 1); } } ## SASL PLAIN authentication method if ($auth_succeeded == 0 and $conf{'SMTPchat_response'} =~ /\bPLAIN\b/i) { $mutual_method = 1; printmsg("DEBUG => SMTP-AUTH: Using PLAIN authentication method", 1); if (SMTPchat('AUTH PLAIN ' . base64_encode("$opt{'username'}\0$opt{'username'}\0$opt{'password'}"))) { printmsg("DEBUG => SMTP-AUTH: PLAIN authenticaion failed.", 1); } else { $auth_succeeded = 1; printmsg("DEBUG => User authentication was successful (Method: PLAIN)", 1); } } ## If none of the authentication methods supported by sendEmail were supported by the server, let the user know if ($mutual_method == 0) { printmsg("WARNING => SMTP-AUTH: No mutually supported authentication methods available", 0); } ## If we didn't get authenticated, log an error message and exit if ($auth_succeeded == 0) { quit("ERROR => ERROR => SMTP-AUTH: Authentication to $conf{'server'}:$conf{'port'} failed.", 1); } } } } ## MAIL FROM if (SMTPchat('MAIL FROM:<' .(returnAddressParts($from))[1]. '>')) { quit($conf{'error'}, 1); } ## RCPT TO my $oneRcptAccepted = 0; foreach my $rcpt (@to, @cc, @bcc) { my ($name, $address) = returnAddressParts($rcpt); if (SMTPchat('RCPT TO:<' . $address . '>')) { printmsg("WARNING => The recipient <$address> was rejected by the mail server, error follows:", 0); $conf{'error'} =~ s/^ERROR/WARNING/o; printmsg($conf{'error'}, 0); } elsif ($oneRcptAccepted == 0) { $oneRcptAccepted = 1; } } ## If no recipients were accepted we need to exit with an error. if ($oneRcptAccepted == 0) { quit("ERROR => Exiting. No recipients were accepted for delivery by the mail server.", 1); } ## DATA if (SMTPchat('DATA')) { quit($conf{'error'}, 1); } ############################### ## Build and send the body ## ############################### printmsg("INFO => Sending message body",1); ## If the message-format is raw just send the message as-is. if ($opt{'message-format'} =~ /^raw$/i) { print $SERVER $message; } ## If the message-format isn't raw, then build and send the message, else { ## Message-ID: if ($opt{'message-header'} !~ /^Message-ID:/iom) { $header .= 'Message-ID: <' . $conf{'Message-ID'} . '@' . $conf{'hostname'} . '>' . $CRLF; } ## From: "Name" (the pointless test below is just to keep scoping correct) if ($from and $opt{'message-header'} !~ /^From:/iom) { my ($name, $address) = returnAddressParts($from); $header .= 'From: "' . $name . '" <' . $address . '>' . $CRLF; } ## Reply-To: if ($opt{'reply-to'} and $opt{'message-header'} !~ /^Reply-To:/iom) { my ($name, $address) = returnAddressParts($opt{'reply-to'}); $header .= 'Reply-To: "' . $name . '" <' . $address . '>' . $CRLF; } ## To: "Name" if ($opt{'message-header'} =~ /^To:/iom) { ## The user put the To: header in via -o message-header - dont do anything } elsif (scalar(@to) > 0) { $header .= "To:"; for (my $a = 0; $a < scalar(@to); $a++) { my $msg = ""; my ($name, $address) = returnAddressParts($to[$a]); $msg = " \"$name\" <$address>"; ## If we're not on the last address add a comma to the end of the line. if (($a + 1) != scalar(@to)) { $msg .= ","; } $header .= $msg . $CRLF; } } ## We always want a To: line so if the only recipients were bcc'd they don't see who it was sent to else { $header .= "To: \"Undisclosed Recipients\" <>$CRLF"; } if (scalar(@cc) > 0 and $opt{'message-header'} !~ /^Cc:/iom) { $header .= "Cc:"; for (my $a = 0; $a < scalar(@cc); $a++) { my $msg = ""; my ($name, $address) = returnAddressParts($cc[$a]); $msg = " \"$name\" <$address>"; ## If we're not on the last address add a comma to the end of the line. if (($a + 1) != scalar(@cc)) { $msg .= ","; } $header .= $msg . $CRLF; } } if ($opt{'message-header'} !~ /^Subject:/iom) { $header .= 'Subject: ' . $subject . $CRLF; ## Subject } if ($opt{'message-header'} !~ /^Date:/iom) { $header .= 'Date: ' . $date . $CRLF; ## Date } if ($opt{'message-header'} !~ /^X-Mailer:/iom) { $header .= 'X-Mailer: sendEmail-'.$conf{'version'}.$CRLF; ## X-Mailer } ## I wonder if I should put this in by default? # if ($opt{'message-header'} !~ /^X-Originating-IP:/iom) { # $header .= 'X-Originating-IP: ['.$conf{'ip'}.']'.$CRLF; ## X-Originating-IP # } ## Encode all messages with MIME. if ($opt{'message-header'} !~ /^MIME-Version:/iom) { $header .= "MIME-Version: 1.0$CRLF"; } if ($opt{'message-header'} !~ /^Content-Type:/iom) { my $content_type = 'multipart/mixed'; if (scalar(@attachments) == 0) { $content_type = 'multipart/related'; } $header .= "Content-Type: $content_type; boundary=\"$conf{'delimiter'}\"$CRLF"; } ## Send additional message header line(s) if specified if ($opt{'message-header'}) { $header .= $opt{'message-header'}; } ## Send the message header to the server print $SERVER $header . $CRLF; ## Start sending the message body to the server print $SERVER "This is a multi-part message in MIME format. To properly display this message you need a MIME-Version 1.0 compliant Email program.$CRLF"; print $SERVER "$CRLF"; ## Send message body print $SERVER "--$conf{'delimiter'}$CRLF"; ## Send a message content-type header: ## If the message contains HTML... if ($opt{'message-content-type'} eq 'html' or ($opt{'message-content-type'} eq 'auto' and $message =~ /^\s*( 0) { ## Disable the alarm so people on modems can send big attachments alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32 ## Send the attachments foreach my $filename (@attachments) { ## This is check 2, we already checked this above, but just in case... if ( ! -f $filename ) { printmsg("ERROR => The file [$filename] doesn't exist! Email will be sent, but without that attachment.", 0); } elsif ( ! -r $filename ) { printmsg("ERROR => Couldn't open the file [$filename] for reading: $! Email will be sent, but without that attachment.", 0); } else { printmsg("DEBUG => Sending the attachment [$filename]", 1); send_attachment($filename); } } } ## End the mime encoded message print $SERVER "$CRLF--$conf{'delimiter'}--$CRLF"; } ## Tell the server we are done sending the email print $SERVER "$CRLF.$CRLF"; if (SMTPchat()) { quit($conf{'error'}, 1); } #################### # We are done!!! # #################### ## Disconnect from the server (don't SMTPchat(), it breaks when using TLS) print $SERVER "QUIT$CRLF"; close $SERVER; ####################################### ## Generate exit message/log entry ## ####################################### if ($conf{'debug'} or $conf{'logging'}) { printmsg("Generating a detailed exit message", 3); ## Put the message together my $output = "Email was sent successfully! From: <" . (returnAddressParts($from))[1] . "> "; if (scalar(@to) > 0) { $output .= "To: "; for ($a = 0; $a < scalar(@to); $a++) { $output .= "<" . (returnAddressParts($to[$a]))[1] . "> "; } } if (scalar(@cc) > 0) { $output .= "Cc: "; for ($a = 0; $a < scalar(@cc); $a++) { $output .= "<" . (returnAddressParts($cc[$a]))[1] . "> "; } } if (scalar(@bcc) > 0) { $output .= "Bcc: "; for ($a = 0; $a < scalar(@bcc); $a++) { $output .= "<" . (returnAddressParts($bcc[$a]))[1] . "> "; } } $output .= "Subject: [$subject] " if ($subject); if (scalar(@attachments_names) > 0) { $output .= "Attachment(s): "; foreach(@attachments_names) { $output .= "[$_] "; } } $output .= "Server: [$conf{'server'}:$conf{'port'}]"; ###################### # Exit the program # ###################### ## Print / Log the detailed message quit($output, 0); } else { ## Or the standard message quit("Email was sent successfully!", 0); } prey.orig/platform/linux/prey-config.py0000775000175100017510000005440112250331650020127 0ustar guerreguerre#!/usr/bin/env python ################################################ # Prey Configurator for Linux # By Tomas Pollak # (c) 2010 - Fork Ltd. (usefork.com) ################################################ # if having trouble with the GTK theme as root, do this: # sudo ln -s ~/.themes/ /root/.themes ################################################ # base includes ################################################ import pygtk pygtk.require("2.0") import gtk import os # from xml.dom.minidom import parseString import re import urllib import base64 app_name = 'prey-config' lang_path = 'lang' script_path = os.sys.path[0] ################################################ # gettext localization ################################################ import locale import gettext # locale.setlocale(locale.LC_ALL, '') # locale.bindtextdomain(app_name, lang_path) gettext.bindtextdomain(app_name, lang_path) gettext.textdomain(app_name) _ = gettext.gettext ################################################ # vars and such ################################################ PREY_PATH = '/usr/share/prey' PREY_CONFIG_FILE = PREY_PATH + '/config' PREY_COMMAND = PREY_PATH + '/prey.sh > /var/log/prey.log 2>&1' CONTROL_PANEL_URL = 'http://control.preyproject.com' CONTROL_PANEL_URL_SSL = 'https://control.preyproject.com' GUEST_ACCOUNT_NAME = 'guest_account' VERSION = os.popen("cat " + PREY_PATH + "/version 2> /dev/null").read().strip().replace('version=', '').replace("'",'') USER_AGENT = "Prey Configurator/" + VERSION + " (Linux)" PAGES = ['report_options', 'control_panel_options', 'new_user', 'existing_user', 'existing_device', 'standalone_options'] class PreyConfigurator(object): ################################################ # helper functions ################################################ def get(self, name): return self.root.get_object(name) def text(self, name): return self.get(name).get_text() def checkbox(self, name): if self.get(name).get_active() == True: return 'y' else: return 'n' ################################################ # validations ################################################ def validate_email(self, string): if len(string) > 7: # NOTE: domain suffix should be one of those in this list: http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,3}|travel|museum)(\\]?)$", string) != None: return True return False def validate_fields(self): if self.text('user_name') == '': self.show_alert(_("Empty name!"), _("Please type in your name.")) return False if self.validate_email(self.text('email')) == False: self.show_alert(_("Invalid email"), _("Please make sure the email address you typed is valid.")) return False if len(self.text('password')) < 6: self.show_alert(_("Bad password"), _("Password should contain at least 6 chars. Please try again.")) return False elif self.text('password') != self.text('password_confirm'): self.show_alert(_("Passwords don't match"), _("Please make sure both passwords match!")) return False return True ################################################ # dialogs ################################################ def show_alert(self, title, message, quit = False): dialog = gtk.MessageDialog( parent = None, flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK, message_format = message) dialog.set_title(title) if quit == True: dialog.connect('response', lambda dialog, response: gtk.main_quit()) else: dialog.connect('response', lambda dialog, response: dialog.destroy()) self.center_dialog(dialog) dialog.show() def show_question(self, title, message): dialog = gtk.MessageDialog( parent = None, flags = gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO, message_format = message) dialog.set_title(title) self.center_dialog(dialog) response = dialog.run() dialog.destroy() return response def show_about(self): dialog = self.get('about_prey_config') self.center_dialog(dialog) dialog.show() def close_about(self, dialog, response): dialog.hide() def center_dialog(self, dialog): if 'window' in self.__dict__: dialog.set_transient_for(self.window) dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT) ################################################ # window and widget management ################################################ def get_page_name(self): return PAGES[self.pages.get_current_page()] def toggle_pg3_next_apply(self, button): button_next = self.get('button_next') button_apply = self.get('button_apply') if self.get('use_existing_device').get_active() == False: button_next.hide() button_apply.show() button_apply.grab_default() else: button_apply.hide() button_next.show() button_next.grab_default() def next_page(self, button): page_name = self.get_page_name() increment = 1 if page_name == 'control_panel_options' and self.get('new_user_option').get_active() == False: increment = 2 if page_name == 'report_options': if self.get('reporting_mode_cp').get_active() == True: if self.current_api_key != '': response = self.show_question(_("Hold your horses!"), _("Your device seems to be already synchronized with the Control Panel! Do you want to re-setup your account? (Not recommended)")) if response == gtk.RESPONSE_NO: return else: increment = 5 if page_name == 'existing_user': # then we are going to select an exising device if not self.get_existing_user(True): # login didn't work, so don't go to next page return self.pages.set_current_page(self.pages.get_current_page() + increment) self.toggle_buttons(button, None, 1) def prev_page(self, button): page_name = self.get_page_name() decrement = 1 if page_name == 'existing_user': decrement = 2 elif page_name == 'standalone_options': decrement = 5 if self.pages.get_current_page() != 0: self.pages.set_current_page(self.pages.get_current_page() - decrement) self.toggle_buttons(button, None, 1) def toggle_buttons(self, button, tab, tab_number): button_prev = self.get('button_prev') button_next = self.get('button_next') button_apply = self.get('button_apply') if tab_number == 0: #main settings tab button_prev.hide() button_next.hide() button_apply.show() self.hide_ssl() else: page_name = self.get_page_name() if page_name == 'report_options': button_prev.hide() else: button_prev.show() if page_name == 'report_options' or page_name == 'control_panel_options' or (page_name == 'existing_user' and self.get('use_existing_device').get_active() == True): button_apply.hide() button_next.show() button_next.grab_default() else: button_next.hide() button_apply.show() button_apply.grab_default() if self.get_page_name() == 'new_user' or self.get_page_name() == 'existing_user': self.show_ssl() else: self.hide_ssl() def hide_ssl(self): self.get('icon_ssl').hide() self.get('lbl_ssl').hide() def show_ssl(self): self.get('icon_ssl').show() self.get('lbl_ssl').show() def set_default_action(self,button,ctrl): button_cancel = self.get('button_cancel') cancel_has_default = button_cancel.flags() & gtk.HAS_DEFAULT button_prev = self.get('button_prev') prev_has_default = button_prev.flags() & gtk.HAS_DEFAULT button_next = self.get('button_next') button_apply = self.get('button_apply') if not cancel_has_default and not prev_has_default: if button_next.flags() & gtk.VISIBLE: button_next.grab_default() else: button_apply.grab_default() def ensure_visible(self,widget,event): # ensure the widget focused is visible in the scroll window self.get('delay').set_name('delay') self.get('extended_headers').set_name('extended_headers') widget_name = widget.get_name() scrollwindow = self.get('main_settings_scrollwindow') internal_height = self.get('main_settings').get_size()[1] port_height = scrollwindow.allocation.height port_vadjust = scrollwindow.get_vadjustment() port_posn = port_vadjust.value widget_posn = widget.allocation.y widget_height = widget.allocation.height if (widget_posn - port_posn) >= 0 and (widget_posn + widget_height - port_posn) <= port_height: #widget is fully visible (even if its description or icon is not), so do nothing return False # for now we know there are only two possible hidden widgets so we scroll all the way up or all the way down # if we add options to this page we will have to scroll differently if widget_name == 'delay': #scroll to top port_vadjust.set_value(0) elif widget_name == 'extended_headers': #scroll to bottom port_vadjust.set_value(internal_height - port_height) return True def key_pressed(self, widget, event): # show about dialog on F1 keypress if (event.keyval == gtk.keysyms.F1) \ and (event.state & gtk.gdk.CONTROL_MASK) == 0 \ and (event.state & gtk.gdk.SHIFT_MASK) == 0: self.show_about() return True return False ################################################ # setting getting ################################################ def prey_exists(self): if not os.path.exists(PREY_PATH + '/core'): self.show_alert(_("Prey not installed"), _("Couldn't find a Prey installation on this system. Sorry."), True) else: return True def is_config_writable(self): if not os.access(PREY_CONFIG_FILE, os.W_OK): self.show_alert(_("Unauthorized"), _("You don't have access to manage Prey's configuration. Sorry."), True) else: return True def update_delay(self, new_delay): return os.system('(crontab -l | grep -v prey; echo "*/' + str(new_delay) + ' * * * * ' + PREY_COMMAND + '") | crontab -') def get_delay(self): delay = os.popen("crontab -l | grep prey | awk '{print $1}'").read() if not delay or delay == '' or delay.rfind('*') == -1: return 20 else: return delay.replace('*/', '') def get_setting(self, var): command = 'grep \''+var+'=\' '+PREY_CONFIG_FILE+' | sed "s/'+var+'=\'\(.*\)\'/\\1/"' return os.popen(command).read().strip() def get_current_settings(self): self.current_delay = self.get_delay() self.current_auto_connect = self.get_setting('auto_connect') self.current_extended_headers = self.get_setting('extended_headers') self.current_guest_account = self.guest_account_exists() self.current_lang = self.get_setting('lang') self.current_check_url = self.get_setting('check_url') self.current_post_method = self.get_setting('post_method') self.current_api_key = self.get_setting('api_key') self.current_device_key = self.get_setting('device_key') self.current_mail_to = self.get_setting('mail_to') self.current_smtp_server = self.get_setting('smtp_server') self.current_smtp_username = self.get_setting('smtp_username') def guest_account_exists(self): result = os.popen('id ' + GUEST_ACCOUNT_NAME + ' 2> /dev/null').read() if result.find("uid"): return False else: return True def toggle_guest_account(self, enabled): if enabled: # create user and leave password blank os.system("useradd -m " + GUEST_ACCOUNT_NAME + "; passwd -d " + GUEST_ACCOUNT_NAME) # Authorize login with no passwords in gdm os.system("sed -i 's/PasswordRequired=false/#PasswordRequired=false/' /etc/gdm/gdm.conf") # Authorize login with no passwords in pam os.system("sed -i 's/nullok_secure/nullok/' /etc/pam.d/common-auth") else: os.system("userdel -r " + GUEST_ACCOUNT_NAME) os.system("sed -i 's/#PasswordRequired=false/PasswordRequired=false/' /etc/gdm/gdm.conf") os.system("sed -i 's/nullok/nullok_secure/' /etc/pam.d/common-auth") def display_real_settings(self): self.get('delay').set_value(int(self.current_delay)) self.get('guest_account').set_active(self.current_guest_account) if self.current_auto_connect == 'y': self.get('auto_connect').set_active(True) if self.current_extended_headers == 'y': self.get('extended_headers').set_active(True) self.get('check_url').set_text(self.current_check_url) self.get('mail_to').set_text(self.current_mail_to) self.get('smtp_server').set_text(self.current_smtp_server) self.get('smtp_username').set_text(self.current_smtp_username) if self.current_post_method == 'email': self.get('reporting_mode_standalone').set_active(True) def check_if_configured(self): if self.current_post_method == 'http' and self.current_api_key == '': self.show_alert(_('Welcome!'), _("It seems this is the first time you run this setup. Please set up your reporting method now, otherwise Prey won't work!")) ################################################ # setting settings ################################################ def save_setting(self, param, value): if param == 'check_url': value = value.replace('/', '\/') command = 'sed -i -e "s/'+param+'=\'.*\'/'+param+'=\''+value+'\'/" '+ PREY_CONFIG_FILE os.system(command) def apply_settings(self, button): self.get('button_apply').set_label(_("Saving...")) if self.get("main_tabs").get_current_page() == 0: # main settings page self.apply_main_settings() else: page_name = self.get_page_name() if page_name == 'new_user': if self.validate_fields(): self.create_user() elif page_name == "existing_user": # this is an apply event, so we are creating a new device (no "advanced" device selection) self.get_existing_user(False) elif page_name == "existing_device": self.apply_device_settings() elif page_name == "standalone_options": self.apply_standalone_settings() self.get('button_apply').set_label('gtk-apply') def apply_main_settings(self): # save('lang', text('lang')) self.save_setting('auto_connect', self.checkbox('auto_connect')) self.save_setting('extended_headers', self.checkbox('extended_headers')) if((self.checkbox('guest_account') == 'y') != self.current_guest_account): self.toggle_guest_account(self.checkbox('guest_account') == 'y') # check and change the crontab interval new_delay = self.get('delay').get_value_as_int() if new_delay != int(self.current_delay): self.update_delay(new_delay) if self.check_if_configured == False: self.show_alert(_("All good."), _("Configuration saved. Remember you still need to set up your posting method, otherwise Prey won't work!")) else: self.show_alert(_("All good."), _("Configuration saved!"), True) def apply_control_panel_settings(self): if self.current_post_method != 'http': self.save_setting('post_method', 'http') if self.current_check_url != CONTROL_PANEL_URL: self.save_setting('check_url', CONTROL_PANEL_URL) # we could eventually use the email as a checking method to remove prey # i.e. "under which email was this account set up?" self.save_setting('mail_to', self.email) self.save_setting('api_key', self.api_key) if self.device_key != "": self.save_setting('device_key', self.device_key) def apply_standalone_settings(self): if self.current_post_method != 'email': self.save_setting('post_method', 'email') self.save_setting('check_url', self.text('check_url')) self.save_setting('mail_to', self.text('mail_to')) self.save_setting('smtp_server', self.text('smtp_server')) self.save_setting('smtp_username', self.text('smtp_username')) smtp_password = self.text('smtp_password') if smtp_password != '': encoded_pass = base64.b64encode(smtp_password) self.save_setting('smtp_password', encoded_pass) self.exit_configurator() def exit_configurator(self): self.run_prey() self.show_alert(_("Success"), _("Configuration saved! Your device is now setup and being tracked by Prey. Happy hunting!"), True) def run_prey(self): os.system(PREY_COMMAND + ' &') ################################################ # control panel api ################################################ def make_request(self, path, query, user, password): if query != None: data = ' -d \"'+query+'\"' else: data = '' if user and password: data += ' -u "' + user + ':' + password + '"' command = '/usr/bin/curl -A "' + USER_AGENT + '" -i -s --connect-timeout 5 ' + CONTROL_PANEL_URL_SSL + '/' + path + data # print(command) result = os.popen(command).read().strip() # print(result) return result def report_connection_issue(self, result): print("Connection error. Response from server: " + result) self.show_alert(_("Problem connecting"), _("We seem to be having a problem connecting to the Prey Control Panel. This is likely a temporary issue. Please try again in a few moments.")) def user_has_available_slots(self, string): matches = re.search(r"(\w*)", string) if matches and int(matches.groups()[0]) > 0: return True else: return False def get_api_key(self, string): matches = re.search(r"(\w*)", string) if matches: self.api_key = matches.groups()[0] def get_device_keys(self, string, has_available_slots): hostname = os.popen("hostname").read().strip() devices = self.get('device') index = -1 chosen = index liststore = gtk.ListStore(str,str) devices.clear() matches = re.findall(r"\s*(\w*).*?([\s\w]*)\s*", string, re.DOTALL) for match in matches: index += 1 key = match[0] title = match[1] liststore.append([title,key]) if key == self.current_device_key: #set the choice because we have a matching device key chosen = index elif title.lower() == hostname.lower and chosen < 0: #set the choice because we likely have a matching title (but device key takes precedence) chosen = index if index < 0: #self.get('create_new_device').set_active(True) self.show_alert(_("No devices exist"), _("There are no devices currently defined in your Control Panel.\n\nPlease select the option to create a new device.")) return False devices.set_model(liststore) cell = gtk.CellRendererText() devices.pack_start(cell, True) devices.add_attribute(cell, 'text', 0) devices.set_active(chosen) return True def create_user(self): self.email = self.text('email') params = urllib.urlencode({'user[name]': self.text('user_name'), 'user[email]': self.email, 'user[password]': self.text('password'), 'user[password_confirmation]' : self.text('password_confirm')}) # params = 'user[name]='+self.text('user_name')+'&user[email]='+self.email+'&user[password]='+self.text('password')+'&user[password_confirmation]='+self.text('password_confirm') result = self.make_request('users.xml', params, None, None) if result.find("") != -1: self.get_api_key(result) self.device_key = "" elif result.find("Email has already been taken") != -1: self.show_alert(_("Email has already been taken"), _("That email address already exists! If you signed up previously, please go back and select the Existing User option.")) return else: self.show_alert(_("Couldn't create user!"), _("There was a problem creating your account. Please make sure the email address you entered is valid, as well as your password.")) return self.apply_control_panel_settings() self.save_setting('device_key', '') # make sure no device key is set in the config file, so Prey calls self_setup self.run_prey() self.show_alert(_("Account created!"), _("Congratulations! Your account has been succesfully created and configured in Prey's Control Panel.\n\nPlease check your inbox now, you should have received a verification email (or will in a few minutes)."), True) def get_existing_user(self, show_devices): self.email = self.text('existing_email') password = self.text('existing_password') result = self.make_request('profile.xml', None, self.email, password) if result.find('401 Unauthorized') != -1: self.show_alert(_("User does not exist"), _("Couldn't log you in. Remember you need to activate your account opening the link we emailed you.\n\nIf you forgot your password please visit http://preyproject.com/forgot.")) return if result.find("") != -1: self.get_api_key(result) else: self.report_connection_issue(result) return False has_available_slots = self.user_has_available_slots(result) if not has_available_slots and not show_devices: self.show_alert(_("Not allowed"), _("It seems you've reached your limit for devices!\n\nIf you had previously added this PC, you should select the \"Device already exists\" option to select the device from a list of the ones you have already created.\n\nIf this is a new device, you can also upgrade to a Pro Account to increase your slot count and get access to additional features. For more information, please check\nhttp://preyproject.com/plans.")) return False if show_devices: result = self.make_request('devices.xml', None, self.email, password) if result.find("") != -1: return self.get_device_keys(result, has_available_slots) else: self.report_connection_issue(result) return False else: self.device_key = "" self.apply_control_panel_settings() self.exit_configurator() def apply_device_settings(self): devices = self.get('device') model = devices.get_model() self.device_key = model.get_value(devices.get_active_iter(),1) self.apply_control_panel_settings() self.exit_configurator() def __init__(self): if not self.prey_exists() or not self.is_config_writable(): gtk.main() exit(1) self.get_current_settings() builder = gtk.Builder() builder.set_translation_domain(app_name) builder.add_from_file(script_path + "/prey-config.glade") builder.connect_signals({ "on_window_destroy" : gtk.main_quit, "prev_page" : self.prev_page, "next_page" : self.next_page, "toggle_buttons" : self.toggle_buttons, "apply_settings" : self.apply_settings, "toggle_pg3_next_apply" : self.toggle_pg3_next_apply, "set_default_action" : self.set_default_action, "ensure_visible" : self.ensure_visible, "key_pressed" : self.key_pressed, "close_about" : self.close_about }) self.window = builder.get_object("window") self.window.set_title(self.window.get_title() + " (v" + VERSION + ")") # self.window.get_settings().set_string_property('gtk-font-name', 'sans normal 11',''); self.pages = builder.get_object("reporting_mode_tabs") self.root = builder self.get('delay').grab_focus() about = self.get('about_prey_config') about.set_version(VERSION) self.display_real_settings() self.check_if_configured() if __name__ == "__main__": app = PreyConfigurator() gtk.main() prey.orig/platform/linux/prey-trigger.py0000775000175100017510000000515412250331650020326 0ustar guerreguerre#!/usr/bin/env python ####################################################### # Prey Trigger - (c) 2011 Fork Ltd. # Written by Tomas Pollak # Licensed under the GPLv3 ####################################################### import os import sys import gobject import dbus from subprocess import Popen, call, PIPE, STDOUT from datetime import datetime, timedelta from dbus.mainloop.glib import DBusGMainLoop from getpass import getuser debug = False min_interval = 2 # minutes log_file = "/var/log/prey.log" prey_command = "/usr/share/prey/prey.sh" command_env = {'TERM':'xterm', 'TRIGGER': 'true', 'USER': getuser()} try: log_output = open(log_file, 'wb') except IOError: print "No write access to log file: " + log_file + ". Prey log will go to /dev/null!" log_output = open('/dev/null', 'w') ####################### # helpers ####################### def connected(): return nm_interface.state() == 3 def log(message): print(message) if debug: shout(message) # only for testing purposes def shout(message): os.system("echo '" + message + "' | espeak 2> /dev/null") def run_prey(): global run_at two_minutes = timedelta(minutes=min_interval) now = datetime.now() log("Should we run Prey?") if (run_at is None) or (now - run_at > two_minutes): log("Running Prey!") try: p = Popen(prey_command, stdout=log_output, stderr=STDOUT) run_at = datetime.now() p.wait() except OSError, e: print "\nWait a second! Seems we couldn't find Prey at " + prey_command print e sys.exit(1) ####################### # event handlers ####################### def network_state_changed(*args): # log("Network change detected") if connected(): run_prey() #def system_resumed(*args): # alert("System resumed") # run_prey() ####################### # main ####################### if __name__ == '__main__': # log("Initializing") run_at = None # Setup message bus. bus = dbus.SystemBus(mainloop=DBusGMainLoop()) # Connect to StateChanged signal from NetworkManager try: nm = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager') nm_interface = dbus.Interface(nm, 'org.freedesktop.NetworkManager') nm_interface.connect_to_signal('StateChanged', network_state_changed) except dbus.exceptions.DBusException: print "NetworkManager DBus interface not found! Please make sure NM is installed." sys.exit(1) if connected(): run_prey() # upower = bus.get_object('org.freedesktop.UPower', '/org/freedesktop/UPower') # if upower.CanSuspend: # upower.connect_to_signal('Resuming', system_resumed, dbus_interface='org.freedesktop.UPower') loop = gobject.MainLoop() loop.run() prey.orig/platform/linux/prey-config.glade0000664000175100017510000024215412250331650020554 0ustar guerreguerre True 5 Prey Configurator False ../../pixmaps/prey.ico True True 10 10 ../../pixmaps/prey-text.png False 0 600 328 True 590 328 True True 3 8 4 590 True 565 55 True 0 0 For advanced settings please check the config file. Modules are set up on the Control Panel. True 10 5 585 228 True True automatic automatic True 300 48 48 True ../../pixmaps/conf/delay.png 10 5 50 25 True True True True False False delay_adjustment True True True 70 1 250 30 True 0 Fre_quency of reports and actions True delay 130 490 55 True 0 0 Number of minutes to wait before waking up Prey. Control Panel users can change this setting later on the web. True 70 30 48 48 True ../../pixmaps/conf/user.png 10 85 Enable _guest account 200 30 True True False True True 70 75 490 55 True 0 Whether we should allow guest logins on the system. On password-protected computers, this greatly increases the chances of gathering information. True 70 100 48 48 True ../../pixmaps/conf/wifi.png 10 160 _Wifi autoconnect 200 30 True True False True True 70 150 490 55 True 0 Allow your computer to connect automatically to the nearest available wifi access point, if no connection is found. True 70 175 48 48 True ../../pixmaps/conf/system.png 10 230 E_xtended headers 200 30 True True False True True 70 220 490 55 True 0 Whether to query the server sending additional information regarding your network. Experimental feature. True 70 245 60 True _Main settings True False 590 True True False False 0 0 True 570 55 True 0 0 Please choose the reporting method for Prey. If you're not sure what you're doing, please visit preyproject.com. True 10 10 48 48 True ../../pixmaps/conf/controlpanel.png 10 65 Prey + Control _Panel (Recommended) 420 30 True True True False True True True 70 60 510 55 True 0 The easy & powerful way. You manage and monitor this PC on preyproject.com, where you can watch new reports arrive and trigger different actions. True 70 85 48 48 True ../../pixmaps/conf/email.png 10 140 Prey _Standalone (Advanced) 420 30 True True False True True reporting_mode_cp 70 135 510 55 True 0 Reports fly directly to your inbox, but you need to activate Prey by generating/deleting a URL and set up your mail server settings as well. True 70 160 True page 1 False True 570 55 True 0 0 Good choice! Have you already registered for a Control Panel account at preyproject.com? True 10 10 48 48 True ../../pixmaps/conf/newuser.png 10 65 _New user 420 30 True True True False True True True 70 60 510 55 True 0 Select this if this is the first time you installed Prey, or if you still haven't created an account in the Control Panel. True 70 85 48 48 True ../../pixmaps/conf/olduser.png 10 145 E_xisting user 420 30 True True False none True True new_user_option 70 135 510 55 True 0 You already signed up at preyproject.com and wish to associate this device to your Control Panel account. True 70 160 1 True page 2 1 False True 570 55 True 0 0 Please provide the following information so we can create your account. Once it's created we'll send you an email to confirm the address you entered is correct. True 10 10 135 30 True 1 Your _name True user_name 5 75 350 30 True True True 150 75 135 30 True 1 _Email True email 5 120 350 30 True True 150 120 135 30 True 1 _Password True password 5 165 350 30 True True False 150 165 135 30 True 1 Confirm pass_word True password_confirm 5 210 350 30 True True False 150 210 2 True page 3 2 False True 570 55 True 0 0 Please type in your login credentials. This information is never stored, and only used for adding your device to your Control Panel account. True 10 10 135 30 True 1 Your _email True existing_email 5 75 350 30 True True True 150 75 135 30 True 1 _Password True existing_password 5 120 350 30 True True False True 150 120 This device already e_xists in my Control Panel 400 30 True True False True True True 150 165 Create a _new device in my Control Panel 400 30 True True False True True use_existing_device 150 195 3 True page 4 3 False True 570 55 True 0 0 Please select the existing device configured in your Configuration Panel corresponding to this machine. True 10 10 135 30 True 1 _Device True device 5 75 350 30 True True True on 150 75 4 True page 5 4 False True 570 55 True 0 0 Please configure your SMTP settings. You also need to generate the URL that when deleted will trigger Prey, otherwise you'll start receiving reports immediately. True 10 10 85 30 True 1 C_heck URL True check_url 5 75 450 30 True True True 100 75 85 30 True 1 _Email True mail_to 5 120 180 30 True True 100 120 80 30 True 1 SMTP _User True smtp_username 280 120 180 30 True True 370 120 85 30 True 1 SMTP _Server True smtp_server 5 165 180 30 True True 100 165 80 30 True 1 SMTP _Pass True smtp_password 280 165 180 30 True True False 370 165 5 True page 6 5 False 1 True _Reporting mode True 1 False 4 0 2 1 True 28 28 ../../pixmaps/conf/secure.png False False 5 1 0 Connection secured with SSL. False False 2 True 4 end gtk-cancel True True True True False False False 0 gtk-go-back True True True False False False 1 gtk-go-forward True True True True False False False 2 gtk-apply True True True True True True False False False 3 False 3 end 0 False False 5 end 2 20 5 55 5 5 False center-on-parent True dialog True False Prey Configurator 0.0.0 (c) 2010 - Fork Ltd. GUI for setting up Prey, an open source anti theft solution. http://preyproject.com GPLv3 Tomás Pollak ../../pixmaps/prey-agent-48.png True 2 True end False end 0 prey.orig/platform/linux/prey-trigger0000775000175100017510000000273312250331650017677 0ustar guerreguerre#!/bin/sh # # prey-trigger init script # # chkconfig: 2345 20 80 # description: starts prey network detection trigger # ### BEGIN INIT INFO # Provides: prey-trigger # Required-Start: $local_fs $remote_fs $syslog # Required-Stop: $local_fs $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts prey network detection trigger # Description: starts prey network trigger using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PREY_PATH=/usr/share/prey DAEMON="$PREY_PATH/platform/linux/prey-trigger.py" NAME=prey-trigger DESC=prey-trigger # Include defaults if available if [ -f /etc/default/prey-trigger ]; then . /etc/default/prey-trigger fi test -x $DAEMON || exit 0 set -e . /lib/lsb/init-functions start(){ start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON --background --make-pidfile -- $DAEMON_OPTS || true } stop(){ start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid || true } case "$1" in start) echo -n "Starting $DESC: " start echo "$NAME." ;; stop) echo -n "Stopping $DESC: " stop echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " stop sleep 1 start echo "$NAME." ;; status) status_of_proc -p /var/run/$NAME.pid "$DAEMON" "$NAME" && exit 0 || exit $? ;; *) echo "Usage: $NAME {start|stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0 prey.orig/platform/linux/functions0000664000175100017510000001260212250331650017260 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Linux Specific Functions - by Tomas Pollak # (c) 2010 Fork Ltd. (usefork.com) - Licensed under the GPLv3. #################################################################### . "$platform_path/services" run_as_current_user(){ if [ "$(whoami)" != "$logged_user" ]; then DISPLAY=:0 sudo su $logged_user -c "$1" else eval $1 fi } #################################################################### # network stuff #################################################################### get_mac_address(){ ifconfig $1 2> /dev/null | grep 'HWaddr' | awk '{print $5}' } get_ip_address(){ ifconfig $1 2> /dev/null | grep "inet " | awk '{print $2}' | sed "s/addr://" } get_netmask(){ ifconfig $1 2> /dev/null | grep "Mask:" | awk '{print $4}' | sed "s/Mask://" } get_gateway_ip(){ ip r | grep "$1" | grep default | cut -d ' ' -f 3 } get_wifi_device(){ [ -z "$wifi_device" ] && wifi_device=$(iwconfig 2>&1 | grep -v "no wireless" | cut -f1 -d" " | grep -v "^$" | tail -1) } get_wifi_info(){ [ -z "$wifi_info" ] && wifi_info=$(iwconfig 2>&1 | grep -v "no wireless") } #################################################################### # get proxy functions #################################################################### get_system_proxy(){ [ -n "$http_proxy" ] && echo "$http_proxy" && return [ -n "$https_proxy" ] && echo "$https_proxy" && return [ -n "$(which gsettings)" ] && get_proxy_from_gsettings && return } get_proxy_from_gsettings(){ local proxy_host=$(gsettings get org.gnome.system.proxy.http host | sed "s/'//g") if [ -n "$proxy_host" ]; then local proxy_port=$(gsettings get org.gnome.system.proxy.http port | sed "s/'//g") echo "${proxy_host}:${proxy_port}" fi } #################################################################### # auto connect #################################################################### get_open_ssid(){ local iwlist=$(which iwlist) # access_points=`iwlist $wifi_device | awk -F '[ :=]+' '/(ESS|Freq|Qual)/{ printf $3" " } /Encr/{ print $4 }' | sort -k4 -k3nr` $iwlist $wifi_device scan | awk -F '[ :=]+' '/(ESS|Freq|Qual)/{ printf $3" " } /Encr/{ print $4 }' | sort -k4 -k3nr | grep "off" | head -1 | cut -d ' ' -f1 | sed 's/"//g' } # attempts to connect to the first open public wifi network # if we dont have NetworkManager available, we use plain iwconfig try_to_connect() { if [ -n "$(is_process_running $network_manager_process)" ]; then log " -- Restarting $network_manager_process and giving it some time to connect." service $network_manager_process restart &> /dev/null sleep 5 else get_wifi_device if [ -z "$wifi_device" ]; then log ' !! No wifi device found!' return 1 fi local open_ssid=$(get_open_ssid) if [ -z "$open_ssid" ]; then log ' -- No open SSIDs found.' return 1 fi log " -- SSID found! Attempting to connect to ${open_ssid}..." $(which iwconfig) $wifi_device essid $open_ssid $(which dhclient3) $wifi_device fi } reverse_tunnel_command(){ setsid "$base_path/lib/tunnel.sh" ${remote_tunnel_host} ${local_tunnel_port} ${remote_tunnel_port} ${remote_tunnel_user} ${remote_tunnel_pass} &> /dev/null } ############################################ # trigger enabling functions ############################################ # echoes 1 if prey trigger is set is_trigger_loaded(){ if [ -d "/etc/rc3.d" ]; then find /etc/rc3.d/ | grep 'prey-trigger' > /dev/null && echo 1 elif [ -d "/etc/init.d" ]; then find /etc/init.d/ | grep 'prey-trigger' > /dev/null && echo 1 elif [ -d "/etc/rc.d" ]; then find /etc/rc.d/ | grep 'prey-trigger' > /dev/null && echo 1 fi } reload_trigger(){ log " -- Setting up network detection trigger init script..." linux_load_service 'prey-trigger' } # unloads trigger from launchd and removes plist file unload_trigger(){ log " -- Removing network detection trigger init script..." linux_unload_service 'prey-trigger' } ############################################ # updater-specific functions ############################################ # here we'll eventually put whatever we need to do in linux before # performing a full update pre_update_hook(){ return 0 } # post update hooks go in here post_update_hook(){ log ' -- Reloading Prey...' "$base_path/prey.sh" & # lets restart prey now } ############################################ # device creation stuff ############################################ get_pc_info(){ pc_name=$(hostname) $(which laptop-detect) [ $? == 1 ] && pc_type="Desktop" || pc_type="Laptop" get_distro_name if [ "$distro_name" == "ubuntu" ]; then pc_os_version=$(lsb_release -r -s) elif [ "$distro_name" == "debian" ]; then pc_os_version=$(cat /etc/debian_version) fi } get_distro_name(){ [ -n "$distro_name" ] && return local proc_version=$(cat /proc/version 2>&1) # todo: make this in a more efficient way if [[ "$proc_version" == *Ubuntu* ]]; then distro_name=ubuntu elif [[ "$proc_version" == *Debian* ]]; then distro_name=debian elif [[ "$proc_version" == *Redhat* ]]; then distro_name=redhat elif [[ "$proc_version" == *Fedora* ]]; then distro_name=fedora elif [[ "$proc_version" == *CentOS* ]]; then distro_name=redhat elif [[ "$proc_version" == *SuSE* ]]; then distro_name=suse elif [[ "$proc_version" == *ArchLinux* ]]; then distro_name=arch elif [[ "$proc_version" == *Gentoo* ]]; then distro_name=gentoo else distro_name=linux fi } prey.orig/platform/linux/services0000664000175100017510000000477012250331650017102 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Linux Service Management Functions - (c) 2011, Fork Ltd. # Written by Tomas Pollak # Licensed under the GPLv3. #################################################################### linux_load_service(){ get_distro_name [ -z "$distro_name" ] && return 1 eval "${distro_name}_load_service $1" } linux_unload_service(){ get_distro_name [ -z "$distro_name" ] && return 1 eval "${distro_name}_unload_service $1" } linux_copy_init_script(){ local full_init_script_path="$1/$2" if [ ! -e "$full_init_script_path" ]; then ln -s "$(full_path $base_path)/${platform_path}/${2}" "$full_init_script_path" 2> /dev/null local retval=$? [ $retval -ne 0 ] && log " !! Couldn't copy init script into ${1}!" chmod +x "${platform_path}/${2}" return $retval fi return 0 } linux_remove_init_script(){ local script_path="${1}/${2}" [ ! -f "$script_path" ] && return 1 rm -f "$script_path" return $? } ####################################### # distro-specific functions ####################################### debian_load_service(){ linux_copy_init_script '/etc/init.d' $1 [ $? == 0 ] && update-rc.d $1 defaults > /dev/null } # we need to delete the init script first so that update-rc.d remove works # otherwise we'd need to use the -f argument debian_unload_service(){ linux_remove_init_script '/etc/init.d' $1 [ $? == 0 ] && update-rc.d $1 remove > /dev/null } alias ubuntu_load_service='debian_load_service' alias ubuntu_unload_service='debian_unload_service' redhat_load_service(){ linux_copy_init_script '/etc/rc.d/init.d' $1 [ $? == 0 ] && chkconfig $1 on } redhat_unload_service(){ linux_remove_init_script '/etc/rc.d/init.d' $1 [ $? == 0 ] && chkconfig $1 off } alias fedora_load_service='redhat_load_service' alias fedora_unload_service='redhat_unload_service' suse_load_service(){ linux_copy_init_script '/etc/init.d' $1 [ $? == 0 ] && chkconfig --add $1 } suse_unload_service(){ linux_remove_init_script '/etc/init.d' $1 [ $? == 0 ] && chkconfig --del $1 } arch_load_service(){ linux_copy_init_script '/etc/rc.d' $1 [ $? == 0 ] && log " -- Prey network trigger has been copied to /etc/rc.d/$1. Remember to add it to /etc/rc.conf!" } arch_unload_service(){ linux_remove_init_script '/etc/rc.d' $1 } gentoo_load_service(){ linux_copy_init_script '/etc/init.d' $1 rc-update add prey-trigger default } gentoo_unload_service(){ rc-update delete prey-trigger linux_remove_init_script '/etc/init.d' $1 } prey.orig/platform/linux/settings0000664000175100017510000000135712250331650017115 0ustar guerreguerre#!/bin/bash ################################################################### # Prey Linux Specific Settings - by Tomas Pollak (bootlog.org) # URL: http://preyproject.com # License: GPLv3 #################################################################### logged_user=$(who | cut -d' ' -f1 | tail -1) if [ -z "$logged_user" ]; then # i've seen this on laptops running Fedora logged_user=$(ps aux | grep ssh-agent | head -1 | awk '{print $1}') fi readonly logged_user readonly system_path="/etc" readonly users_path="/home" readonly programs_path="/usr" if [ -f "/etc/debian-version" ]; then network_manager_process="network-manager" else network_manager_process="NetworkManager" fi # readonly config_program="$platform_path/prey-config.py" prey.orig/pixmaps/0000775000175100017510000000000012250331650014022 5ustar guerreguerreprey.orig/pixmaps/conf/0000775000175100017510000000000012250331650014747 5ustar guerreguerreprey.orig/pixmaps/conf/email.bmp0000664000175100017510000002206612250331650016544 0ustar guerreguerreBM6$6(00 $  %Hq5y \g 1׊ \"و  \׆+ \ }*ߊ܇ \#Ԁ ܆݅܄ ߉ ߊ]#}-uۀ ۄ܄܅ ܅ ܅܆"{k(v 3ف֗vz(7ߒ)ߔ*ޏ#ޏ" ގ"ގ"ޏ$!ߐ$1ސ%Aޏ%Rޏ%cߏ$uޏ$ދ#| gވފފފފމߑ(xځ }ۀ܄}B><< <=+=>?5܅݆݆݆݆݆܅݉ۊ#u'؀فقڈڇڇۊ ۊۊ(ۊ:ۊQۉlۈۈۉۊۊۊۊۇڂڂڂڂڂڂڂڂۆۊ$n &Y ܂݃܃܃݃ف فـ(؀:؀Ql؀؀؀ف؅p}xL '8Pއk݆݅܅ۄڃڂقڂڂڂڂڂڂڂڂۃۃۃ܆ւv. #%%%%%%%%%%%$$$"!"*1 6\,B|DRZgk~v~ ԅډߍو'u ʽDzĦپܹ޴n[H9*!ێ5`$ܱәɂjTA.'ۍ.]%t Ӳɞ龉t_K9ޏ)ތ$3$܍0j r ěi%ܓgP1›"Fh5[\>\. í " 1xa0T*LNfhj:W\P(q΁vڣ.oL&8s+s80|SBJ*891A6ݗ@4@tA@xd"i,2=7mbS*ڇD®-3iKS0E1;3Ñ#GLOo9Kz(J,.. \BJDY^XV[gbbT: x7MtqP"`sF 3fffS!Gh4 *'N$HIF{W;;v@%F`l wc`%1^=^=q׮HE } U/MތvJQgumryk/'1؃ /^$ C=f~~0d```; ` )Ѯ fo2"VWWX6,dz0 `rre9t(O*L+כ,o|xV䷸VG}?yl6YT+b{,ZJQn6Ck]app|>իWiR, ud)9ƫlǛNa}mZF\ Pň`kpRr d$IkAD:N [?̿~yA v"ι'uARk{jmzK4:,5VU;2tz募UyW㚭_X_nnl >;uzky#RbrۘRddm2DQ=*V*hz0{wuQzʆ@oŨЭeC1ÅB"3XtaQqac "7x:jJAYOo?s;4FA=*iGk[9Pl6ħh鶨/6IS}'dQAl10 :P1:eeqqgNI$65;خs HU H쵥>33?|.vZ+!'fɢ`SN!I 4*pGp:x]\\{Cr%3w+T{-)g^W@+ҦBR0ȫ ÊxM5y&BT!ev wv8˷W%=qu'^a1v-rc?DNVNv~ŠdN}=_|}矜}E=uX7{|-%Ś'e $j엗}O}$E*GD[n3aDCYY=ms>sG7oT)L;F Ψ ,O~|oͻG{ʖ;+ր3XsVƾvw|ufNdwVD 2FV;cs/*?8 /#uCk>R3,|8wT<Lr :ts/ҴMJ~7|sM^8P Ar'HMx:۾yOe+˱ VcĹ2n=xr”`!d>u.UŨdD:kQڴ1mHϾ{p8[+j+JoB;.5/bKS;~q9VM:CDf ɤۣuV;.ZYCa٬ZzFUC\NiI "Le`fڠQNWIn,cYed0 򸅘R 룿L^ =C;I<9~Ј T, ,)!p&H&7߻Ew㏔LD B2cA1C!R2C#HM̚ZC0Q=e, 8RmKI}7K^`W{\TRB4H)2⾳?LE6k0FLgm]>(t[YO?__9H$T9i].-ggWLJo܋d9n΅*-y\󹝰"C#иܷXTyu @$mٴ7/ g%I -?}U~rX}W_f{Yz.]JK ~]:?ǨœtCF̌~`Ϙ9X{^uW/bHMDp]άbN6uFZ:u+WRs:a]'tdM C, th0x5^͝-Eq: BAN'\V.]6ȸ1 mBh|'%%`FkW?lT<`kiÖThh2mD㰕iIH)a,?-)5CXmF MXF%~sD@q~-aRIJAيTGY,?7sir =@ "hD'O>1mrl0t(ϘcJ8HYt630kKfUX Vo\sGYm[63uMpq~8dqeۏ<۶"[1Y Of쟮{۞}j8 @g3 ͅ@Ŋ?K´m0 &+/+w_sD/Mje_p;lEbH["–C#xu?_0oW̥.Rq I$~L-eNsJ'}=pm7c֟{u x'RCIO"x=l:|@ 9R-dӓ ³+ڸofNČ03itE޿uz~^NÊRPcp# q99:4ZS[گ}bUӛxa1sM_O!7 0OQgtM=(@  䣠HL&#:T 'pH,R2,XQOgMtu8 "=܎{LvFN,e핗k?|Ê3] :C\\w+ۡƪJff[*ML[B(hm!m%Gm5m4wrC>NXS5 .w{ָz쏑ŹtsFd-6ZRIf0HC*%eɬl,p<%O7JĐiIwB^Խw|ٱ0fޮZ^dᒆ^hy j4IHgmS$y(5zx)bd&[{Κkں#y@6kwo{>8kB"=5Ɍ92(2g`=O[^G^܇?.-zE"ea1=тxNCÂYS0 C!`6Z{ l` YpgB~/jδ/~pgip;u$3'2&B^7|nNYk?wC+98Zۂ.y!?rC{\(ɏKOe0O(X2ׅHA$P KJ$Ӳ?bLɴ$MR)B%mCi2'H0cAYyд&pd\41Z{ovC1&3:uPt<.'J'q1dfӒ"H(70c a~Φ)}^uêA!x$áޣ'+M_۞O"=2-oļ>?7u r78mÎ%E# 8 7O>tgnWƴ3'jδͶ']p)`5wFoǯzxlD׶^<5{ъSK Tw~'VQ?#;cUmV;+>^ݹg\K*AQ^UǞ]īRR`Aɒ -;wztCw}ݫNg'_<p͘ {֌ѷL)%Dzcđ]r ?P餢k CiIh X#6Drr@+ϣDkw?AY[3YDI7 @!O+ּKշm}üX=o8Ŧ-$us;y߉3i5WԴ7oWLoGm_yP'ꚺ-3&K 8Եi<3Ls21d-ȋ@BC2嶎ޓD?YJ>x﾿l̗SS"œWTœ XzkXG)4v"JO>ԖʣswǢ[-Һmq;OuKלoCq~ L)!0O;:σD"|M>96o q^;c5am>'OȣӲ-hǘy\hؗ1DDNЇU~z;Y`&EB~jմ) qeE3.`aLH6+<@?=@<:>:8;97;425,+- nXUM@0 0GYch;9=geh󊈋zx{ifjWUYNLPNLPNLPMKOMJNLIM?<@cbUB)5Rev-+.^\_~nlna_c_]`^[_WTXSQUSQUUSWXUYIFJ saK* (Pe'%'ecf孫WTXWTX\Y][X\JHJ_E5_FDGЏgfjB@GBAJEBK=&$-wv{}IGO31:" ) ljo !'%-21:ljqECL41:,*3@>E|z|trtusurorKIK}{|{y{$41;0-8$            wuzhfmJHQ}{52<,*3~{y{{y{}{|js" */-7{z]\a"HFK            KJN 87E*&%.ZX`ont $                    yw~DBL/.6͏+)286@$rqt                      yx{43:.,7;9A}OYW]SRY54:ccf                        cbe\Zb\Z_^\`20:                          !zx~)'1~|~a𣠠.-4" UTX                       ,+0 $&76<Wcae rrt        !                 $"(nnp }{})ONR       GFJ                   FFJPOS659 '%*        {z~                 CAF!  zxz#!&jjm           UTW              a`d 羽 CTSU%$)113       "#!)%#,%$,jjo%#(&/'%.'%.&$-$"+&      BAC  [A@B76;gfj  '$-.+4-+4,)2,)2+(6+(7(%685=,)0,)0,)0,)0,)0-*0-*2/,3,)0#   nmq ~~/b435HFLxw|onrqot!&"!(.,40.6.-4.,4.,4.,4,*= 1/0-7%#*FDKzy~nmq}{ ywy3b87: $#)EDK2081.71.71.71.71.71.71.7/-=32*)R+)U*)T*)T*)T*)T*)T*)T*)T*)T1.71.6:8@HFN308!% ~|~3YJII YW]+)142:42:42:42:42:42:42:42:42964264/64/0/2BAI/-542:42942942942942942942:42:42:42::8@@>E .?hehRQW42964<65<65<65<65<65<65<65<65<65<64<64<65<,+3)'/VT[21965<65<65<65<65<65<65<65<65<65<65<=;C_^d=;C# TRXcag31996?96>96>96>96>96>96>96>96>96>96>96>96>2/8/,485=96>96>96>96>96>96>96>96>96>96>96>96>HFLC@G86?xv|mlr75=<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B53;208<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B<:B86>^\cCAH86>-+./-5ljp`^dCBI<:A>GA>GA>GA>GA>GA>GA>GA>GA>GA>G;9A74>A>GA>GA>GA>GA>GA>GA>GA>GA>GA>GFCKA>GRPXPNU"<;CJIP<;CCBJCBJCBJCBJCBJCBJCBJCBJCBJCBI<;D98@CBJCBJCBJCBJCBJCBJCBJCBJCBJBAIdchiin=EIGNIGNIGNIGNIGNIGNIGNIGNIGNHGNKJQTRYECJEDH~KIPWU[ECJLJQLJQLJQLJQLJQLJQLJQLJQKIQFDKB@HLJQLJQLJQLJQLJQLJQLJQLJQJHPSQWIGMMIQmUUV$sqwb`gKIPLJRLJRMKSMKSMKSMKSMKSMKSJHPIGOMKSMKSMKSMKSNLSMKSNKSIGNmkrhgmZW_  Q;:<53:ZX`kip]\bhgmPOVPOVPOVPOVPOVPOVOMUPOVPOVPOVPOVPOVRQXXW]yx~xw|JHOpoq$$$&318XV^VU[[Y`TSYSQXTRYTRYTRYSRXYW^SQXTRYTRYSQXSQXTRY\Z`LJR(&,ZY[WNMO!CBIcbgmlrTSZTSZPOUQPVHHNSRXQPW`^ecbhzzwv{~<;Brqra`e[Y`ihovuzZY`nmrlkqsrxYX_utzecjFEK103"CAHVTZSQWdbh^\bwu{qou][bSQX;9@SST{ucbe0/3"&%+=C"0t:|?D#D"؎C׮Ō=Yg3= !g&NgT}`~𮻉44ЧWorR2yv>G絗_!7?vhx<Ι3g8rSF͊+eeiBHR0hp)"Fڧި@<ɟ=)\RƎ )cmS˥%]V$ NVUѷ_Lo.2rH:m:1mۅnAl?UJ=-$7!>}=>_~|ߥ TW.BEARBYEdil۲۶Qvyw/|Viڵ͜Ic$5cvԬ^JG4m7xΓ: u\܅X~?x[Tp߽/@;Zze8p 'Od֝sٴac (/J.ƲoVIѣ֑_O1¸1xٺeH}f6 nbİ=v ٹb%YY\fi6Y0g.~jvLd}boF(Y:@!~X0/* FWqXK u\{\-Vb /2i-̝7}{[oփ.BАӵ07n9v-_cXZ+VJɔmɫ#KѣKϏXtԙ=p ,WKfj+)W:&zyϲjJLÃtrRi-WGjNb%Kҭ{w +.>/)|q~lڌԩHp*]@_}{%IZ ٳlۼŔ3tK`Jl^Њ(i5[mǡ Q^OFFP&M'HJ*-kY8S]͡),(`]Ge;{k+6:yuܐRm+?SDq]㸟/jjk1s&@)%I&uܞ*Nx5bJi>ؽ ]H%Q*jjUZ-.tDZnTM47]M'cX^ж=:IKʓUDFz}L$k2 d޴m i ;aҳR2j*Wm۲qlnK0M0!v?={M?/VZ3[x{_3,*@e'D ~B/> 0RJb Wʴ$` 0=ntH)DCYd30 [ #EmTxχfZcӑ̲nБx3^7XSY,~8mY)g˲-Kff&[6o&api)Y"~00M̌ |F)M3xN-+_0?*/^3켋ap,F1lۦyyIm)m @2yyyBA8f{H7=m8#x~?>:yyT=4/RJ貥$ ~SRźc3|kk/_?O7 iӦ k֯ie%/ЅPJزe '!RJ2a<0׌y,_.Po'͋'duבcNڶ-n݆SNNʲlbr2#K٫`01/I2~}ad<t҅>}V `ͷŰ, ۶Wvۭm,;,J^GΝ Xydּ&qh0 jkkI&\) rң'6nu]% rڽ;@ss\Xɜ9?GNRRPRmX8K{E|T<{}Qcֱ|i9;zӧ CJʇ֮]!察}vUƛ>ul*8ZXA9W6 Λuk4f$pS9Oa[VL Ǡ!>xa}K)J)~~pG;vkK6ei۲V|ųOTx,m۱ewE8f %OۊyɴUJ_Pߗ!7+m6g.h۶mr;\6mȓ?{?pر㚀>/st53>N;S_W ÆFI$@oᏟ4U'(RJʕx}^f_@lLRJV}tIٓ[m8[[^5e ^]RR"ĖMPcۋx475!Ϛ xLOTo߾Hl\cŋö-Bi,{8ױsۧWNN.PD<$~2" a1t_:i]D'Xp…~KF0t`̌ FÇy_𭻿e%wd2BHW:|o] 0?i$V)*]9>77SPX n2ѳ~n6CL1BzEӼ<ȏ9UyEedB̝7%;']On6[Ne-:H""[w{.***0M8rU]]W+u}QQQaaab)څ}{e&+ӫOoj8Z=ʘS2qDzٿwէ9z(F;fP^~R8z_WъuBy)V GF3xSs'-[F0CQG.ǰQé8~zN)ΡeH)>z/XI<'k:K¶~pZ a_t2J)N*[}u]hl?@PзwƎ8yN''+'[7ǚ#]8r0OƱl&i4 4@ @ 贴4&)++/ZYUO4p8_/ yyT+pXD,uP R57%.Gtm쀁KJJ|~zZ"1H$! H$ګGkbURS[S rc@P"qpcV +u*<^s~n^P(K DRȖnv椕b5'O:nmjv)@$.SW AL0% 7>iAjVR):S{y%>f;2v[KSZIX)".!оhL];NT)"`YqOX-RIENDB`prey.orig/pixmaps/conf/controlpanel.bmp0000664000175100017510000002206612250331650020155 0ustar guerreguerreBM6$6(00 $  ###/00000000000000000000000000000000000000000$ '''NNNEUUUOTTTNKKK|||sssTTTNTTTNUUUN|||VVVN{{{UUUN|||VVVNyyyVVVNonnwwwWWWNdbasstWWWNca`oooXXXN^]]kkkXXXNZYXggg~~~XXXNUTUccc}}}ZZZNRQQ___|||YYYNONN[[[|||YYYN~}BBAVVV|||YYYN???SSSZZZNyyy>=>QQQ[[[Nqqq=<=RRR[[[Niih<;=UUU\\\N```=<>]]]\\\NYYY>=?aba]]]NQPQ=ddd\ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[ccc[bbb[bbb[bbb[bbb[aaa[aaa[aaa[```[```[```[___[___[___[___[___[^^^[^^^[^^^[]]][\\\[\\\[\\\[[[[[[[[[[[[[ZZZ[^^^S///'''prey.orig/pixmaps/conf/controlpanel.png0000664000175100017510000000424612250331650020163 0ustar guerreguerrePNG  IHDR00WsRGBbKGD pHYs  tIME,.i&IDAThZ=~곫{>A FXH l`d6A|+$NB#l@sFKC{в|G.~~oloo؋c~Wy~׻?޻/^Ck1ZkwEQ;}4MmvА{{{|2zIVJwn޼ m[zQ<(V!zI%$j 1 AJ2՚ՕKM8r7qB 3Yh%_m2Me"THIBE .hm|_1 T)8B"UR-* H)_oEᅦRjYW(-]1oVK~?|A4F\@)AW[1Zs{c,l%w3@Zb#"}7y۠PfEo%řU.ԤhL5R 0rsPB!t&sK.d 4 $ cP*F$%ꉸB ]u>ȶ\^1Ci+Hs)ܽ繣oҚv x.mō3(E趀g9& 4:٢~sQ`DPq )#!;?pzz>V\g2K-e1B :)@qrrB8vi˝֠[K "gggx8 {,!@7zԼ(]PHa2訓QK!@(iBT)b I}\`qn?9Q$1qȥ\VV+RJB -N*8|Ӵ1!/w^FdNι%z!\Y*KͷiRj$8}+B6X 6 K2I /ݳ4Zr`í۬Jm1q `K@12LS! YK5-ޑ(cWfb!R =5 Ͳ ٬x&+<´X1\i.jBs'ߧuƠ(b]E)EbJY ĹB ire'c%b(ϏоT=tcH/ZwϚ)t4@K R !vS)NW!T1R: p||rGjٷ@I$I^)ckuPd2|>oY y-^~R]t1.s'''+6x*> 0$.]x;w`2l.k\kfBﻀFF Kԡ( css_ƍ7|-$x vwwk׮ի-߻;'''8??RʥRkϟc:/4i2?`)޽۷ocsstX"1 pj񲻻#ǏᎌRJc5W\AQ Re3䜣6Bs Clll`61f!ՋVիWg֚䫶B\o]Oz>Oܮ;<<+>O_❾IENDB`prey.orig/pixmaps/conf/secure.bmp0000664000175100017510000000616612250331650016746 0ustar guerreguerreBMv 6( @  +PPP{da]WOG=5-$ ,BL!2JTC/CMN->G[*9@h^hmABC#$*)/+1{+1m+2_'FiyOs\isc|BfzW{a]OtAaqJqT{ev^t6YnPuX~OvAbqLuXm_t/ShCf|Dk~=^nLuYoXmz%G[-Pd0O`LuXnJ`n?R%DV+++LuXn=Ud#>====!!! LuYovQONJJJ555 .GGG.LuXnqTRRPPP=== LuYov][Z:::iii***MvYn?>> yyyqEEE,ZisznhvҀԀԁԁԁ}g"%'JjzqqqqOOO<]ѿºA]]]U YYYCCC8 ԵN666)))* ԱN^^^ ԮNiiiJүS)(#d.⬬ϴٲ <[B󱱱æ盛ϟKۻš"vнH  prey.orig/pixmaps/conf/secure.png0000664000175100017510000000342412250331650016746 0ustar guerreguerrePNG  IHDRr ߔsRGBbKGD pHYs B(xtIME 4HlIDATHǕ]lUY|s-ۡ@u(0RQi!C|@$' !CD0I *D ~H&01Gtjoۖrۇ{Ba'+g-#===\tI7 Èb븮j``d2ɞ={XiF###ڵ !KRʗu]&asJ4=?x`%311; 5|ʕ+/j6IbQS*3~]koosllt:N]/JdTRa0U۶+>F.;[,ܹstww?NljY,X,{{{NuOJy8[TX^^yr躮&t{`߾}w/ R eEVlHRJSJafe%Jv`p*º#X 0H`YΝٳck@@Ӵ'4 d2,sss QVuI)IRyraĊ^$W4cM7( ۷ _m76ak/кbjKy7Rɸ JBR.;vkb4~{}痟;v+G.^x( ,mgTgnM:TfuH$]AI0pQJ&°PRjiY{Sgmz0O]zJrzttt_PiTJ!%(%BkOsW# C2R{GwXMϝ;wvUԛnKOi 4B 0@Ф*V(Pu|j\.? !]zL:E H% "%H)RRhRI 7E5QauF!guإh\.8*|xgxx$/ P WP6v>`f&۷I&H))b1<ۢZ:5bTc]4M`!0 ]ԑ *2:tttp!uzaX5FB4RÆHUG),:qTT0;;C{g"&Q#zr.0afX.yn޵< 5P)CR(pAO^Z&LLa.Ϲ3?^ɨL~j`͚5iTJU_@IR -ByD$0 \~ř V(VO LJ (RTe=+ޛgAgL><TvB!3-oN<T !4Taz! ۹IfI&bq~+hh'RVKlʿF]7LxL~~{;_u0 reY1i52 &U(˶cK;ki<.\;U>ͭ{_Hs)!&IENDB`prey.orig/pixmaps/conf/wifi.bmp0000664000175100017510000002206612250331650016413 0ustar guerreguerreBM6$6(00 $   !%&&!  $0=NNNpFFF}...^:2' .9tttwwwCCCv=0" vKȄN'1nnn5*͕T͋Sv6vd  ϏZŀN++VfAɋ]ˌWИi ⺜777 ܲŀEˍ\ȌYV.yCЌV Γa#޴=ԿBԠtʌXBϸաu!͏[ՉUS9HˉVԜn1ǭSĨ@ƁIɌYƀCÁH_ʉPՠuʱ9޴3ȀGʍZz0f&33$Å>ʐ^јh:ηf٩;ɋUʍ[ ɃK信ԟqˆPʌUʋZ ΓaɰCŪFłJȐV++Ċ;kBȊWΑ^:̲rܯDˌWʉYԝq$ӽ7ธw7ÁFɑ]ڬ ܰ͒`ˌZ ƁHƪLตG̎[Pd@ʏTˊU6̴ẙX~EɇPܯ6ȭAԞqŃK~A߷VƁI Ĩ/Ӝmɋ[Дc%̳_֡uC̏[ɎE@vHˍV)ç}޴jɍT&ɇVצ}>ϷS͑_ːX ͐]Ƭ ⼜ U ֤yȈN̎V ٪&å=Αbʍ[њi4~ȂI7ȎZPq̏\ԝpUƪҚi>ʊXԟs>ԾiD%ȌXҜp"ɰ8ܯǃKˉSs3Ǭߴ̏_ ʋR¤9߶CʊWȅM߷ZǫvɅM(LJHTq"MˋT2⻚⽝wʇT$ϖd4ŪqԞr;ʊT٩-ũGաvm+ڪƫڗaԢsl-͓_ 侠)ถ-ǁEƀFɰSݳGȄNāF/ζئ}VǍTH+TkˏYˈRRŹɆP>͋V'֣xaǬn̋Xҙi)¥Yաv(Gݱ%ħ2єc ʰ⼜ȀF ̊Qɮ?ݯ4ʈMˋU+rʈR1̍X!ا^ĩ̏Z.ǂCo:ƁG&Ĩ߶ȆN,ȇQCҽϓa<DžPܱ]㽞JʅL աv'信Eϕe|||~~~}}}D#Ṙ1ˈQ ~DйWДe(͋UڬVg΋V"ϙjAçӞpN̉T̅O ~D8ƺȅLNˈQ*ۭxɯ|?#ЖfGйF}@Ǭ^ا}'ғ` x9 ⻛?޴0ʂO ٧~?㾠XɊYԠr:їd7ˋW.Ƭՠvf͎^[#͇Xץ{\˲ʈO=~E5ԾΑ][ĀE'ʱӝmUt7ṘXຘWd=Хv֣w!⻜VИkљj"㼜nԝr1͏[%¥ՠvYʉT(㼜w෕ˊV-ҁTF#ˌUūפzx̌Z1̍UJӽƄLAʈR=ϷǃJ4}D͵ǂI+ 4ѸvǃL ⽞]բw5ĆNp֡uUɆVƪצzyΎW+ˊVLԿDŽN=ωS }6ˍW&Ĩաuj̍X+ܬgɆN4ܮg⼜ƅJ֢xA¤|@; ȁCTץ|_|A ⽝aܯ~ɅP$޴j⻛̈R2ƂI=ɇPHȍVx-}L͍X,¦֢xčV(⺚zݲʆR.ا̓Q⺙aܰ~E $}Ҡ{޶K޵}C٪S信ɅL-աvYǭʅN9ƁG6ɇQPΎYyHC̍Y0¥֢y_ɉR)ũ֡wˉS,çԞrʂLåvפ{Ǎ\ /ư٨~K㾟z?ЕcH˱ƃK3ʈRHһŃK>~E3²ɇRTˎX>ćDˌY0¦֢y_ʋS)Ĩ֢xɇS,ħԠrʅLṘqܰƄF /װඓa޴yAϔbL˲ȂI4ɊTIкƅJ>F3²ȈRSʌX…?|HˍW,ç֣wcʋV)ẚzݲɆQ/㿡٨̉PԞrTĨ~C(iȊ\֢x~@ ٫b信ƂJ/բxZǬɅN8ŁF6´ʈRPnjVwDg0̋U&ĩ֢vk̍[+ڬgƆM5ܯlṙLJO$v9'̵ˊVRj'ˎZἜפy^}C ⺙ݰƃQ(ߵpẙȊQ2ȄL>ȇPG͇R\$e$ˉTĩ٨z͌Y1͏[KѻȄLDDžNDϹȃJEk ݲ信m- 1ʜJқmX㾟Ϙh(ȅN֠sqdžV%¦٧̌W,ΐ^NӾDžM<ΆQ UJˊY՟tXͶɅO<~D4ΐ]c}A.ɲՠqǀDDžK0çةm֡|5uƛC~E+㿠ݰyj8ћlA⼜ӜqJ̏[2¤ףxbʉU)㾠{޳ˌX-|N2ҁG E8ĸʉSQɅO+ۭ~ɮ~F-ˋV`ҼɆO7zGӛo^՞qQݬ #6FH:&ϑ_(ߴm,ȉNئ}ȊS'ԞrV£ЕdBˋX2ƪ֡vgˎX`/Lj@ǃJ%ĨตɈO-ƃIHйӜnUˇO-߶ทŇN|B ܯt㿠޵u6 ͼ  {CіfN㾠㼝u4%΄UʈOO͵қlS̊R+ݱ⿠ˋS,ҚjJçԝpN͒]JȅM̌\̌VRǽŀE@ʊW,ר~}ħΈW-ΔfJĨҚliΖ[s/ԟqQ߶̳՟rȇPCƄI(ƀF#ńL6͐^dʲئ|ˍZƈQ}A9ѻפyʈR#ȃJRɉTI͑Z-Ԡunɮ͍[/ƈXcHʀMˋX1߶侠ʊU,ЕgFç֣yk̉Y%֤zhʯӚkfƆMDǂFҚkmȮʰɯɰɰ̱ګD7rB~Gϒ^;ۮƉR+ʊT9ʰۭȆQ+ɆPFϹաu\ωW]S͍ZԛlUǬіgMɈU'קiͳ̎[V~E$٧kħ޳āG-LJ@L z>$ȂJ5ƄL8ƀD+l)r6Қm]Ĩถ̎Z0ʌX/ộ⾞ŁJ7ǂJ.ṙǫǀE-~GɁM̎Y+¥߸ʉS:LJS*՟stֿʋUSɋV!њiM⼜ηΐ]nƁG0ǃU͈WyEԏQԆLɉQ ƁI!ˊTP⼝ɰՠtv͏W&ʌT0ק|Ȭ͐_DȋW'Ԡs`ԿʊUL͎Xq6UUDΎZ}?:´۬|ʈS1̌X.֡xyʲԡteʊS%DŽI+ЗfoϹȬ٧~՟r|֢vlբwiաuvՠt㾠϶ූɈM?ҎU͓`>ݲҽɆPJʋY%ѕeO̴Ӝne̒]"˂Kgn%q8ɐYȆMIζݰyˉQ/ɈT)ڪmħ͐[EȄJ!z>)ҘhO¤㽞㽞㿡Ĩکe~B5ɁC}?+ب~kŪ~D=̍Y%ǁEEɯตˍX,Fp@BʌXӚkVϸبy̋V7NjW#ҜnJګһܭɅMPˆL/ɈV!̋TύU͎W΋R̊TɊQ&ɅL=ГbiηǬԞriʍ]/ʐ[%ˋVPļ޲ˌW4ϏV EQo@~FА]ȈPMùݳΓaFˍX"̌Y(ʊTSǬҾæ֢vՠsz֢vn֢vkաusԞpܰйѼաvvɅM:͏] ʋV0բueθץzuʋX2ӏ[ 5/UU22ÀBˍYD>Ĩƫ޳vC8ˊW"ƀE#ƃJ8۫bΤ信侠ĩ侟z̏ZI~A+ˈV ȆM*ҚkSĨĨڭkɉT(ˊM J!3322wÈKʐ]͐Z-Ӝn_¥ӛmlǃLEʊU.ΎX ЌUΌTЏX!яX#ώWόTώW̍X&ȅO8DŽKSḗҽ٨|ҚiFʌUǍWΉĊNHфKΔ]ʇQ6ЗgdѼූԠsqףy`ՠtQԞpIӝnHՠrL֢xX֢whץ{ɯǂIH͏X$ϓ[ k(ĊOn%{d&ŽNɊU~B)ʉQEธxĨ信㾠侠㾟侠㾠Ũ֣y]ǁG6ƁEɏYAr/vNBʇW ΋V̌W!͏Z-іh:ӛn@ӜpBҙk=ϓa4΍Y'ˋUΉXHxFVŎT*}I„UGJHV91Xf3prey.orig/pixmaps/conf/wifi.png0000664000175100017510000001256012250331650016417 0ustar guerreguerrePNG  IHDR00WsRGBbKGD pHYs B(xtIME-1IDAThwtՕ{_>F#ɒm ql @.8kR؍ɲ'> ,B $,b06U%KFަ˔ ِ={Ιyߝ;|7~/ї&B[ϣt.2 &2b( +`QX2bĉ l;-w0kPҴ&ur6!bad0`EJZ2L* aQ-!xB9t1%yz6jjUj^9+fK%(, !@RA2X[LKf[7ڟ:kS \(y g% 8MJ&?su,͝>_3LDHL%T$R,XVg9̼}4n.0,6w[›|9s<--w<pMd f l?ʱСq|oG/0>e*Y3SJT`@jUJ _Zo; sf޽럁:N.;JW mȚQ+ݸv#_卉ցXFh( ThR`,0I{Z}u& 츤jqު9 OcX+MSSظ׿V`r1a/Z7/'zB'F(AWeխ_m_t7zxw(ExI000"hbJ@M(ʱ7..jJRЛH8a (;*ktGN6C;)vm?9 ˿>.d{سiZϚ;;M{2ȳʳVW֨*c$xiMW[lZRd3Dc=cɎCVİ>UU겗O/\))4VL*)m<lkqϞͫ?7 lne<,<ȩS{8Ϩ",B~Yp"5H;}1)6 UU_)ʗ3}4>1ulEuz:? UYQIb(,ZxG,&ixZFdfͽ=V`[`-ZkzmCu aM/T`rxeLݧ/ ebeEe-KjN{K˳o$PO޴$]6O_x+'V}7i 8ᣯWX-,X?(ښ|;//}8QΎG&wyW}\J&I&6$A޽c$#Qo ȒZy 5-WQbܐ%6_|dQdB `!~}yJ*G| ;Eɞ U PձPa,I^gqˬhj W]/ xJ* $MƱw{_S(E߸]-S25וdYGoeNUUjl6QYYm4gi+~|7(yUqOc~6ۍAjE(%iQͳJ)[I᰷ @GB0MM6:.GgHxo s7[XYKZ[[+j744AuuRI3fOW3K2JFI`b`f@RkmJRY6&,cҲÈ5EBoT"LbKk5ҁ|*߼bש[!2n//i"fl:Κ3ƅadI7?%LzrmBQ&B|8)G1Ȉsqj\gcLyB !ebslBDDCK,Hj,L7c033fwR,H2`Y zd۩dܽ{JVql;%tXeFrBDA3o˚&b)FXr2SZ@5ZS`)SP5X/*1XK\TJsH0\x217HdT @1(@8C:NNjҝgّq?ę)`MF,zά a00XdM @U B@'nP@@cJP M*9z$(31FN)cMj(i,GOqo1pAE@PBE N&c`.-RFXah,F]Yjbf=k$3$`3q/&1@*#cD zT%$YYh&(riDFgV-uѤ20#W)5`N b(! ٦@dQ*`L0.-]ʏ2ENM’~̳8zP K^HbK!@:ILC:HBPx?4Pٍ %JCoF~ greFemN j&BA(1؂)g#]!,p@to/((zNV]YgoCg}cC(T,X¡ A t*TUMhl,`k0.w|5H p<:J) {ܩQFhjJLј@IYf]~BB+Me /ț^rB(S\\7kFFFzzzP_ۋnڸqcpJ9L+sRYAQNɠsr:G:"Q2f{žl i$dR=_[?OVkskF޼ȑl ܺ')M̜9uӦM _ظqotjl=5$=]?JM'T g~#f`|)36s[ 7 ÁLU5&wEY]<$un(eE3L:>7V暊99TjiӦA*UU!J a0Dtk5eyBf-=jU _H)ǓZaaFoZWS5n?:vpvmdXnto5ssxNxӧ[k m@\\9U.3bxR(PQQV+  T|d+$Ɖ򊶁X7){c?o˜PE_Jc`DRĩ ȏ\hk<&d301h_אLHЕbo"y^2zaxrp͜tc <σba!r;U i%7eeIp(=u)I &eu쾕^3`+hp"fijMUGg~jqVoRĘed}{M2"| zi5!`[{#,B><{>K'ݥ:`:Ɖ+rM9ȝɨ}(sv06rmC~eE'S2&^_ QtPG*reE">7|dO_NWɫ{1 \Ca8o= pr{I Zc{/uM8 pюyy8ӒBn=ЧnYx# ռ/"J[&CQ1Jk+縪ix(ݓʤ{yW\ۼ&z==9Z^WdT1Ѵѝ>*L8 _nzE2233332259%ߝ8Y9=3333332C2 vi6B>?????>D5gk8OONNNNNNNRS1D 2RRNNNNNNNNOUT/%$EZOROOOOPPPOOOOXS+#+[\soonaSPPPVconov[)">SJXZZX\dRQTlTZZZVE."4SUVQ[P*#$$$%$4=%g?^Sa:#% $ .ZZW.! O2#EtC"Y-0&J"^"SX'뺶h>ŸD5괹)yꜗ#6q܀'ɞֺvҗ}6vݏzw6u։zy3vw}y ykjc|nyyw0xgxrg}~ x xxuy|awMw|x~(7lwlyyw~ɏx:xwzɥxxw{녞铩Cx~4-}prey.orig/pixmaps/conf/olduser.png0000664000175100017510000000602112250331650017131 0ustar guerreguerrePNG  IHDR00WsRGBbKGD pHYs B(xtIME-R$@ IDAThY{\Uq;3nNHv8> m$Uj 6A!P@*F UH@TUHI֎ڸDЖ mcŮ8޵wݙ}|9qg7 K5wttw~??S`[`qi7IfZ< EژjX!ks"u?ѷJO>r| Q5RYRLATDZ.|jJW]?J(XK6F%*+T2TC)k<>>OaH@DUDPJ0ba(w)ٳmm'~ !(eTF6a +ؽ{1PS{ކ`)QqQ0]G^VD@n5H)0 {D y? ^N(` " 0)BD AQC2ڍDP|yCWHZ SfĞjڏE//(G0vІ@ {Z-!"E5xp̓gE۾cڭF!A`P_P܊0 CD2e 0O<@сEHQxA"L#6,Y-l/  EBk BC؁/W M:_=A $!>a |݆+?}Ꝣچ1P:^ۘ`-əspևw$>\9$SK] a٫f!?cv > r@ĥ`]F.On@m{e{_Q(-> R$K>;eՕZ\c׃\>+,Upn sg{͕ZhG"bVEhv|ˎmTi`Kea khlqjn͓ccE7-@T%*Ů_>rY L^J#"BS_o菜 VJim2X (+!TAD56Ig'}33][ 5a" ak-.t&&̶)m-Yߒ8v*~U afLc"f3)hl?S=cB<'3|/; 3Ków7ux(ji(o|{&XlV:KP>ѓ̽2K"؛P@kH3{EZK(4.l`DP<'4ʵ]貆?߄+%[9W|?_yႜ GNWJeDV0FC)ט)xyJ2BA#5Q3hmڔuT y;Ƀ?yI>"W)H(`tk/Y T^kot;h1L@B15^](E"P"Vh0ï nYSxh<!y]w.S3/YF}"u"ET҃3OZwG4a 9 XR3| _V#ӂ5Ѓ".(AXp,@@< /(o!s(iYKtgjX/ʹej6niqaGڥnzOq뺉3'[Ts333rst/ܺ;,w[FmTR#-"E,A+X  smt_B'SH%Ma.o{̙ٹ#NHoͶҰ-$Μ82vnw:.++SO~j6zP%x͊&cT9 4F[bYQ sY?<pJ\i53g̶.@wZ$>O>|-.._irˤ*Ą嚉62J1@UY(eHdu8M<ijϹc40>jq266&A4{9kXQYe2IENDB`prey.orig/pixmaps/conf/settings.bmp0000664000175100017510000002206612250331650017315 0ustar guerreguerreBM6$6(00 $       "&)+-../0//0/ 6;;; ;;;;:: :9865 2/ + #)-/01111111110C<;:JHGRQP "! MKJJHGJHGIIH&%$MKJJGGJGFNLK LKI432  %-0111111111111/'&%:98EDBRQP IGEEDBEDBIHG$#"HGEEDBEDBLKI HFE765@(  '+,---.///.---+! !210<;:LKK?==;:9;::DBB>=<;::;:9DBC >=<0.. H!+*)311GGF634311311>>=533311311=<;543('' 7 x#"!*((CBA ,+**()*((:99,+**())((655,+*"! .u 665 !! ..-!!  *)) !!!- u !("*$ ,&#/(%/*'/*'1+(/)%-'#+%!' #!  -PuzHp LtU~U}\(b1g8l>p@q?q;o5k,f"`Y}V{ V|LpKq-Uu}}-|7d4bZ-FكmYD _ Qf *(D/n ;]5. ^t ҅ {z1qvR PRr w0\i q Qa q X>l})111Tk=kI!!!#! -4O2lckmnqsu|uAG{T3V*FAmMMPQTVY[P.%o &o $o %o $q yI [\Fwd9\^\\\\\\\\\\\\\\\\]^aii+   422422433pkkkkmmkkllkllllllllkkkkkjw{ u  N#"#,,+ yca`_]\b_^{|||||~||{|}zCtr /    %#"r=<;GFF=<;POO:88++*liihednhfx|~^$)))))(/F~fp @ca`NLKVSRa^_PNM&$$FEEOMNGDEVVWBAB,++?=?CACLFE&avu`-w6Rj4L}{ @ustzxxonmZYZQRT\[^UUYedfOORSRT869,+.802-Rpmhj/DB`6LRuQsEbMoD`p&>d/Gc1C@`_`^]_g`a)EWjgt     (6q%<c0GRyj@:;76ۜ琏|}}rΝjsp%('**-+..1 01LYt-H_9Tp #572 hhgb򡠠멪뭬룢񂁁ѷ  "! ssstssvuuUNKEn}K>&!"!"!!!!!!!!"!!!#5KC~@>>?1@=?H@>@K##%/Yddeddddddddddddddd_=HHI:8886I ^prey.orig/pixmaps/conf/connect.bmp0000664000175100017510000002206612250331650017106 0ustar guerreguerreBM6$6(00 $  M'zSÉ`ʒi٧~㴊Ù˟ʞ淍ץ{Θp‡^zSM'. N(^:jByQÈ_͗nئ}㴊—˟˞㳊צ|͖n‡^xQkDY4N&. w#/ =L&\4jC xQ È_Ηnئ}㴊—!̠"˟#—!㴊צ|̕m‡^xQiB [3J&=0 x$w"v!w"z%/ = L&[4iC&yQ/Ç_8͖n@ئ}E㵊IØL̠P̠P—M㴊Jإ|F̕mB‡^:xQ2iB)Z3K&< . z&v"v!w!w!v!v!w"z&/ <(K&7Z4CiBOxPY‡_a͖mgإ|lⴊprʞs˞sr᳉pפ{l̕mh†^axPZhAQZ3FK%:<-. z&w"v!w"w"w"w"v! w"z&+. =<NK%[Z3ehAmwOt†]{̔k֣zే齒ŚĚ鼑ెգy˔k\zvOsgAmX2eJ$[;P. Ay%0w"v!w"v!w!w"*qw"w!w!"w"9y%L. [;fI$pX2xg@uN[ɐgҞuݬ帎꾓꾓帎ݭҟuȏgZtLf?~W1vI#o:f- \y%Ow"=w!(w!w"v"q w"v"&v"?v"Sy%a, k9uG"}U/`9iB†^٧|湏Ěˡϥϥ͢ƛ鼑ެ̒hmE[5U/G!|8s~,jx$`v"Tv!Du!-v"w$G#Gx# u#u#>u#Uv"ax$l}+v6DI#~V縋ɚ˞ϢԨٯ޵߷ڰԨөФ˟ėԞrǚQ+>7~}*tx$kv"av"Vu"Cu"(x#h!jv#v"0v#Nv#`u"kx#u{(6hA淍ɗÔƗʚУתܱ޳جӧѧͣʟƚ̠Ĕʌ`ÏAz'}x#sv"iv"_u#Rv#9u#x$r"v#u"͌\єeܡq鱁t`\ ܫuߘZ΁Cvy@}C̄M̈́KԔ_ު~ޥwٓWѝpͪδɷʸʶϱͧ٤w縐ʰѻ㻛ްסyӘmq7ǀKБbޠpx{1{DɁH̅OЋT֔_͜sәjҎW̅MɀJzDk1xDՠ}ΔhҒ`kw\i~L[t5i,j/l2q7v>~E͆NӐZϦГaωPFw>s:m3`%{Jїmݣvivҁ@f(f*i-l3r8y?˂HЊRҗeʼӊN̅L|Br8k1e+a&u@͊VzF"fm,a$d(g-m2t9|BͅLыQ˼ǣφKɀEu;m2d+_$f-vC֐XkmX۔Ze'_"b'g,n3u;ʀEφL˙oˉT̂Gx=o4f+_$[o9ˀI_p dt2zG] b'h,o4x>ˁF΂E¶yxy00/͠{˂E{?r6h,`%Y^#u?ߖYerĊZh&]yGd)k2v<}DˁGʆPZYZ :::;::9:9qpqӳʀDz?s7j-`%YSe+َQ`| ޑO^Wj3ʇZzCɂM̉T͇PɏcKKK'$#$"#! #! '&$!!!bbc°Ew;s6k-a%YTRрBc7v ڊHµYX]!q9ڬګک՚mΙoABB664&TT_#v@٨qpp%%&'$Wo`Nq X*344ۻw9o1|D֡zˌ]WQK c aJv ~;SS]p6ΏbܮܭئɲxxxUWVaUU,)5cPLWYYӨr4n/j*n1ȃRYOK d a2ȋՂ?RRYf*w?ɃPʄQ~Fs4ӫƇUo1l.g(c#\ZPH h&ߓSۊH{SPU_ i,q6t9u;v;x>ђcp3m/g)b"[UQHk)\^PUM SZc$l.q7v=zAɀIѡ{H٥ɃOp5k.c%ZRL J p-ڬcJ QWb"k/s9zB~IˈWʅRíОyȂMy@߷JxAq:c&TII ~=zՂ>EN S`!l1v?~JɅSˋ[͋[͐bɴ׬͍^̌\ɆTǂNܱա|њqŁP`&IRk7׽1UJQ_m3zCǃP̍^͏aϒeДhїl۲нګϓhˋ\ʊ\͐c٪ɳդq=YρCvt2FM Zk3{GɆV͑fДjљoӛs՞w՟vաzƱ۵ӘoӚqګ⼢߹޸ìݷʎfZkD֊M,TJTi/{Hɉ[ϕkҚrԡy֣~צبץĬ߸ڲ޻޻ݸ٭פ}ااצ֣}ӞvЙoΓhИp٬ĮԤh2{=\cGM b&xDɈZЗpԟyצةڬۮǰѿۯܱܱܱܱܰܰܯڮڬ٪ץբ}њs͓iΕkИqɌawFp7ד_"ٲP ٨FWq:ȆXИoԡ|٬ὤݵ⾥⼡๜ຜຝຝ๜ຜෛ޷޶޴۰٬֥њtˍcŀOn9YR{AmħבX*JIc(~N͒iӡ|گŰȳͻ㿤㾤ἡ๞޵ۯ֦ϙrȇYp;TD]מsf).GO o:ȇ[ћuתDZªƮDZȲȳȳɳȲưĮªᾤ޸گԢ̐hzI]!EWӿL:CSr>ɌaԣϾᾥƱɴ̸κκλκ̸˷ȲíὤݵשΗpĀQb)GG(`<E'DW|MКtզگ໢íɴ͹Ͻоѿнλ˷ƱݶتϘqÀP`&HCoNDG K fM f/ńWКvج޷⿨űɵ˷̷ʷȳĭ༢ܲԤˑhxFWEB#JABSn9ƄXϘr֦ڰݶ߹߹޷ܳجӡ}ʐh{Jb)Iڢ?WCD7 CkR_%޹j3uCÀRƄXƆZŃV|LpD494= $O2xxX'뺶h>ŸD5괹)yꜗ#6q܀'ɞֺvҗ}6vݏzw6u։zy3vw}y ykjc|nyyw0xgxrg}~ x xxuy|awMw|x~(7lwlyyw~ɏwx:xwzɥxxxw{녞铩Cxx~4-}{prey.orig/pixmaps/conf/user.png0000664000175100017510000000545412250331650016443 0ustar guerreguerrePNG  IHDR00WsRGBbKGD pHYs B(xtIME-& L  IDAThYk]U~}L{JKCPA11 0&T*j|X h? h0<Z-T#Հ[ vS:gP;csrξַ㾛ű;زyU"bJ$ RqZ" Vfvk]؄ >~ܴHaD@DQDPJ8)!NKbXoU*Ugf,\4~ =62$i(!Z-i7&]ٸ˯m&).iT(h\fsFQM`s_Og|>66>UW˩N#mc81880GHKeTAk`ϻ4sR+{e--л }Qa^m$.O mm@2gdZ Z e@ vX"@ @@Xvj QH)4@"W(=cғ@X ~f:$N@Ez+֝D)Xk#sjLq>R ]]8ߜh6]32D$LM5B;i2L$x qY Ja)€0 )RRkN` t1 PXLAɳwxx>(Z OIOMcc y;9؁A؁}Z® a-=? f2pfg 6e/zxн}s@x=g}p{eA\vm$k5MP{dsBJh@\.V:NH)F8P #pxH"CZ"p"sWgAHW0!?DZEBBGGGGGGEBBC=>B;=cYSپTٿYXk#s]\[`a@??AAAAAAAAAAAAAAAAAA@??a`[\]^ cƨ`habbcR7EC7ECRcbbah`}45œebccgiigccbe.w+4G˪hddddddddhE˪xX ҽ:Ƣzlgffglz:ƢvgO2|L#ZԶyyZԶ#|Lu//uX'뺶h>ŸD5괹)yꜗ#6q܀'ɞֺvҗ}6vݏzw6u։zy3vw}y ykjc|nyyw0xgxrg}~ x xxuy|awMw|x~(7lwlyyw~ɏx:xwzɥxxw{녞铩Cx~4-}prey.orig/pixmaps/conf/newuser.png0000664000175100017510000000621112250331650017145 0ustar guerreguerrePNG  IHDR00WsRGBbKGD pHYs B(xtIME-+ IDAThYk]ug=\؃ql\R \4D$@%Q*mm*N*ihHS?*&%:NR{3~ϝ;s=sgL䘇0\-ǖ]^z^/=񃴙$'_O_v>KJ1{D3i'p% _~=G)FQ0Zm w}~1W])E@CEq*]UD'<;\?"W4L hθJix ,!Jb@GD,O a " vZ9 ~)j5amfIfc IsY&Z{cW;{G' lJYa#iѱ1Ϟ'16:#*Ũt- 6KyZko.^ֺKqk<(c֮߈1E`/z_6 \0 VHk@ Xy ;D j@;`hAb?AJ"1CSn.cU 26 *U:Q@ T0_,4wW*v(2xA8y^R ]]_ Vk6\cHr/d~o5\sgwV_F=^(A7R(U/(nE!"{v˽?KS @E HQXN"L%# ,m{/  E;B2BA؂oL_0i25p#\Dv`v``v39e"&U="&(y>S9spY'nn>#lgI\ řs-H,-إ/l!B\vM6یlV7ݾP?̳)8qs em dIO=xFYu^tvkՂ\.+v%s MX]MݏsH\PV<]߸,r*ۀa~P1>֘jH%/^_rQNCWШ#KZ`Z[}(+".9Z)-] qc''(+ *s1#>kHq=&mGz'wؚ8G(r4iar4g!uPAc7_ӻ{/e]tfi4:N7~828Z%7$i5ii4A݃(.6ݝ>n[ú9b2t`{h |\ɉnϨuimQ 9tW~_|xęD~ ]Bg^T"RmjFk =6!c`5B)£; |p"0w\J,R;&zW:uv`޷\^xĦ#/<R)|\+a`iEҊ `|04JJWR"8Q߃%]58N,`f0[LNXLNX$u֙SZUJX z>my͕8xHTAjUzy[# %IENDB`prey.orig/pixmaps/agent.bmp0000664000175100017510000004006612250331650015626 0ustar guerreguerreBM6@6(@@ @xx  !"""""!  !$(+.135789:::986531.+($   !&+049=@DMGGGnsssǣșsssOOOqO@<84/*&! %+16<B---Y|||ά游ⓓzzz@@@_<61*%  %+29Buuuϭ򼼼sssA2+$  '.5SSSdŬ\\\f.& &-hhhm宮llln% !RRRHҧZZZE  Ɲ{zll^]NNBA881055;;NNcbyyƭ}  XW-,y EDRRRReeSRTSTS#"       >>333kk11| z } ~ 0&iHwOK;%%/.1021ON545554-,"!  <;#A#'/(3F_F{{H*l* i nop r ty**////eRfgjPCC\[FF-,#",+5555<;ccJaJ/J/5)#####>Nꘘ}}-q- p nnmm w .-,+'&sx}%$.-;:VV==21&&+*EeE&B&&B&6P6?X?u>x>RR6s6,p,(m'$m# k 6|6==4}3qruvwxz{99ZZBA{@n@#@#::4P4G_GG_G,H,!>!6<<&D&9##$ , )#MtMXXT}TP|PMzLIxHaaAuA=s=8q85o4@y?OO3q3%k%"i!iggo!t r!t +|+..II-,.-"}!-|,3V35!?!=(E(+G++G+,H,F^FB[B'C'(D(#@#<'D'%A%4!>!#?#&#&PrPeeaa]]ZYeeZZtkaV2m2/k.+k*:w:C~C@|@BA<};7}7'u'&v&CB$v#uHHVoVIaI;U;0L00L09(E(,H,,H,,H,:T:@Y@*F**F*)E)(D(D\D&B&%A%#?#0 - #ee|{{{qqrr`^_\igHtHCrC@p? \ټżnnxxqq}}rrvvqpss||nnrrbbuuiiZZWWф|iUUK~KkkYoYD^DUlUZpZIbIE^EHaHh}hG`GHaH]r]RhRnnKcKIaIQhQ4O4PgP(D(&B&-H-">" < )ĻqqoouuttzzqqXxXYzY``ffbb]][[R|R@p@QnQoyo@[@KbKE_E ,I,VmVз:Ļ~~{{nndzdWnWYpYWmWSjSNfNC\C8S8 > E/)%# UTZ ###  "&'- . 9 x9 D" -@& ? ? 1- ( LJN 410aaa %/ . 9 7 @! lF @? 3 1 )    30.   "(. 3 7 D"3 I$ 338 3 B2 . #   * 3=G"*0/     !#, - 5 2 : @>%6 : O/ -'" !"BO\3 |? Y9 11 - $'"  "  IHHrbsVevJWf sI$@ 9 Y3 ;5 1 *'% !  uhz\l~LVe  -   %'(- 3 4 0?5 f;=@+ = \7 1 *$($   ./1t,,,  +  "(&$+0 6 ; >!U? U7 y2 p. )$    400JFF    )  %+/0 p3 o; d> >= O7 / *#         %        $)/ 4 : = G(?#        T       $(f ,@4 }3 .+)#     %     C      #   "w$M&c*x-0 3 6 : i= =@  + 20 P3 z1 . , ) $      A!.     $'*. 2 5 9 < u= LA 3F   'S   M#h!     V 5 #& ++-r1 .($ #  'P&#""!  !$'*, r1 b- N *:'j!} g Q,  o ~   $)+{* Q"*prey.orig/pixmaps/prey.ico0000664000175100017510000002267612250331650015512 0ustar guerreguerre00 %(0` ;:H 30k*D6 F5bs> wG1_-|-(/f[r5"v:_ DY/)?S|O*;6Pbw"i%>z.?Gu 6@C!Efe y  iet1qk !*HjN! m_ G-fU zlv0xDZ~i\ S.L[ "yscB#? prey.orig/pixmaps/prey.png0000664000175100017510000004121712250331650015514 0ustar guerreguerrePNG  IHDRPsBIT|d pHYs˫iFtEXtSoftwarewww.inkscape.org< IDATxwT}>s˔tEt hVՍdٲ%8$NN;)~b#@l!h]vS;3,}is!0и'v3geN[r1 $D/A/Š,h;ۓj+*r/H7$W(h~cUGIRX0d,pŇ>\QtI&D%Ah Ua~ۚnڦK5$ *Ee秤 7 0#㟽3/=߉OI$ f-XޜfbdQ( @֏3E&jNI$qH 2n?7~nsAa5+7ﺡç(*;T 4mڗ9%E a;ȇ.Y5|Z`a{9Gk`]W2fⷩ3B5!'YQY&jnI$qH^PZTCp ]'ѣ[׿>yk>~}ٯrF(#[<ͧIܒHBPg]K`uئ5y#ε#*AKTQAAGOH/q7}qǥQTpƑ3Pұk_zhkn?> n @MðisZj dI)T6$|BHAPiGޣ{{][q:uCU91$8E@֬\l_7<`$WTҾ8پy]WPV2Ɨ7 93<6'=ZI\Z@f/Xy?U׬\|zS&YBLDQ`Ʊ>;8ׄZAP,4Y=Vv$Hz- a=yhGo[+*F^YcȤ)C(X ?]婷>yk֭ZA9/ PpˀNlx{>GK"Ghh>9_0=#J%[uݬOZmp1h:\in=]P[fP5'=vl[LPUL ‡z3-I$g)<(sN!8BgjP[e>xĹ4̽o==]Ͼ?dҌ[<ك4A ?Y}.lĨAz NImi>lI}vVTVjkN^k۠:@h%11;+^Y5޵s[t/67ZN(CASxȑ3>|uɧ.wx{p>WDŐ~;E>{Iyˏ`as^(9`VVmkV.>y?u[B UYNxtV8tc?;魿!b ֭Zƅ>xI(偧n;~rݙ,sP _p~}z5+Kk=~|.,T@n2Q>qƿlxtΟx}{w}x7pΐ>x:nlΚ[/HHH$ۿƉvpKYՑ>d(<|:zԙCf'z20h?n~﹇s[}B w`6D= a&s[tw/NB # Xhh -K]Snۼuf@EeU77M@`M_I$ g ȼ3"@7} E!Y:**k7P& A0@k%5Xn^Ƭ5+r鮯O; %≷۶0ESnxw+7:!+=o/cb&$zA&}x_F[z 3 Dѡx2g²?ڿYt+*Ԗֵ7vpӀ⑅Q2!c؍`P?~}xjiڿP !;fQ:l/=S=m^_y[8P0Ύ=[HJZymw=UwHF7 zf)Ҋ2sIk:>=яZ|n(ҭAZs o%;fڅ`a V8a7n_j 7ް{B)?lgZ%q F ?ne6BJ!# ĵG20[gXŚ`çO\rt{*x|B2B= %C"O,YCH)-1pĘU'8Z-[&r{lmm9g`RJMaFH/`7{__swm5ҬfEC0 NjL+ifybg**͍m-n@oFhmݪe/Nyϖ=o !'E91́f0A#3m\$=\td}i8^, fh^PD[A33v˞6ֿxA B"`C2J7jJ]n^ּP0H~̍v! ,  r =kۆ@~`C;woz-#!5b=̦*@*F*쒲UiE'Oi:ܰ(l` F\ijjl0pP%[i"}tQ4l?C 8iw?O&qM" U#h?"t!‚ TB02BZ |Ñ]:TFV k;;5#2! RKF02B =\#Q8r3O 4PeA|ڭo~w&!foU@Ycͱ';@ Q Y%H+Ų V{tSvOg?!|PoOy|<0C]P}953l f'o<I\UgxdלP)" nJ@= EfȎ}M4Q}/f5%ⱰB0P +!xV(_xOW?gI\U sxP k;=VÅBJJqnBMCUTU9^]S6ݛ|9.Zco?q0j! @YZ+8Lhi GJA9'ub;"dYT+ 3À7rw2J=lRGaq_^rVJIGMV[CSm[0#Bۮ^Pś͗&2@UD&-wQ bKL@(CZn7}k `3Mw5 wP+p hJݗ*T}8BCKɄ|9^GW^ 9-up$eE8R cRPT]zȄpB2p갂] BU%:e֣V-}7+eWTV`g`~gKP[sypX *fJ.LpS:+@T/?zZ|y/-Qnf]g% !Ơx|%!/H#`V03 Ő)3֯Z/BW5#ra|0>328ޜhX ڂ#DEu]1J!B]U:/? FU-rf]c' B@e`[dcga@ιUX‚m g+8w3}{Bg]cfŞ'kL D9A6m׿_ᓸ"1`RQYP*JP]'vo-tVy <.@YqA ,B3K:78LoֿI\苑^f[iVn8ؙeteX3K̀JFPBP aIC[a˄`e@T4O!w ;)Ύ%>(s Ǣ|Y*qN偧]gNƣf/J !`Bc*g\zT/bC0˥ !1ނ28($2CQBP5Jpf YH4ח-$pdd#phD}0hSDpEF83)0킥 jRD|6DPE܅dξlXNT/?~{9$R$yuU.̠VT<@Dq_ ǹ d=O)@=2Ap.+UG4b|ҕ `W(. gj ۋ$nU@!쏉ig8h!لǎSUCOg1Y6L1|xW;ɵ~xWWo|,ԣu- V0UUXk &yNm#Y 83hPd- +s+ϮN䓸ѯ2dqj|*ԝ81 n9e8cXT?rr73 .nv !2GeCKe&dI\6] dTn(0gOUUR3nv{iӈ+fDqBf$(]CHC̻Q5~#3K&߾9cTCM͗)"RE$D|A[EC0fH$mQ$6)LX  zJmDETMmK; +IzTz-U^>RVv\n,HZ:cM7uȵE}++%U*{\f݈{mĊv),/k- *`7W$]$ #)ԄI,$DV)Q),Q|n!7/;=9T f~d 9~誊uKbD<&3` 9u_z#9SQI=_<1/6L5BFX7 X)G^KI}Rᄈjޥ;]ǚ%q1`R>~ܔ1\dXj9{|!e!3-8=,p[6pr ͗"# veavEs;#JBuDmsFS1`K7X B: G88A. c &{n&e v \ \'"I2vB\BA5ٴo _Lb0`b bzdm*()ٵ{Dpn R{سpw+!8fa{yS-l }ۮ^#ᄏr؁\$Zr /F}ݣck{Kg!RpͅIHrQCmk1sv;9byDQzS ,Sde^p3²킽31;6C[&|EcPv6MI$lqIZF.@ B_hx:9wCX(|s7S8KsE TJ7"w.")L/S8wU9IN|n/NpLtzN֯et}ӦAUvrԮ[1;qw!~|o&\67dԿ]Ei +.예)^&ӽ&~vlI#98ɋY+$=jPxvepiiخh#o{4*_tgJV7ƹ6 Qv !Ӏ;(@lh9Ot>\QYUr˖EATTV{׽fvxsYq ίT"8/9?H͗j2,$87#`t$*!>LA#kL^Z^T݊%q1"n Ɔw[^/&͙rFz$ k;UQi}l@,b+EV%j+k;) !Jc^!c w_,d+ 2pW!]pK_wˡ 7 !yp{=f90Mw I7arJϘ&$Sg—7%ŊB}^$zU! ,lp=:iP>[sΡvOѥGl(Op'lzu;ohiCKw{qhwOm.TŐMaұKYe]ѽP})6,*0؜h{T%>]"Tۮ{w:dP;S7(,Xt'[ a?|oF8ʰf#*7u6JQFp F* [QGJEӹ1xljqD`SvS]9k >Er_x^ҼD8k_mQ!zv_^ոTPQY߿fg!# 10ː-ᢓJ\_ "`,$G%W)3@Ph۷/*dԸ1cO [}W1izfloo]H Hͫ|BQԼK* !S{(\ nn{h[7^|o?.|9EX0| UẠޑGC|Q:ի2$n៟غ@ROU=-u4/Å# Zx }mwcp#ld} lO~Ù`bTaFFG{\-0X{{R)[ϓB8ᶇg~GpJx&m;tE8B->QqfFc,:չ ׿^רּ{^ښ0llٻ{bWߥ:d _Z:t6H5,Ks5ML HTTV޵Ճe3Sipæv""w'"8,Fqh V2|+k"G hbӌw]M AK+φ7w(4 RRt7yueWQ}WSokʋˤCY&4o %vN NP4ptEVB5cJ$Iq;[ff5)}'- f̋{NXi=/D0#7%2}BfrGaf0loP3JH/=Ojw=¦iGujep^fH =(+G]2an+YܥmB5MQa=BpHN^(RvjrgaVTQҽ =fY߇~|Є6*RZ-Eqb(ozfgك OVAP| ԉk/H60A>|XzrA- vNfPEcEG v_ V<^pȵM`I[wDDճ-`N5 ''~Z)*fJ,AP7Ȁ'zVKCf}5m9s@մvtmE/;ܫDH Ht[!HC)/ĒL͘-D+)0 (_T{kS<cK-",7"|~7nEsԭô8JrZBq_:҉H !N>B= jC fG=mׁ ZX]NL6'4物_Hj~I H7TTVy|~uӗ%!Ӗ]h'0wHdOCH"*\Ȝ/bv2Qx%͞-뜵':ܳ_u`@6ǣ ;ˏQf8В h Am@%N%^|@lBX5!ӋAu?]i'>on}\>kSgҽxfegz5P?"iDaν Oq.T_Z/%砪L*E;%/EB-dFB^xi *5E@FMdXڣu-VC8l1 7yUǁ& Mz-h*EC'3 %lͣA虥AZ)+Mmde3t)1kYm}K+"sSGPE<]0 *[FT jN/'re)%r`gw{x8/~^q9MFs] (NuP(0”By^a0D/ nt!t'@WS-jݿv[fĞ6xwʪ3͝_䎜`J;:sVPi;w7}RFcߌsQ O YsҵH+kWTVMuGT0hPJxAפ̼75A[6lRTաF1ؽY(;&ش\$ŽPtvP/2.AYFI71_#cHg-5(R^ }aVtC!RBOaF-N &a^d,'l<>Ӕ=> W,_yM  jjhc۽FK|u*)Rz1kuI)3-_;[/Lt;0i=yi&7نu٣^BIyk9+xm|c8AnMgo:==\-J|!FYt ,{ ƻL,Sozi>=Ah#Þ?vCjFQ4xM&3y< [UPEW5jBD-™I#X²TfxqMm+ 56|\oHЋyEiGƖY!{P+.3X_UEπ mg9ijHjg2>C<’ozgSh=M7%Z3^K?|K|,Է?=,_f^SFA[iX3z3* @(6-VfoYL!tS<է+|f_ZQ,Uy)N't6YK-BKB-t/'V=EcQKT<W%ThroX}pO uPd!txkzF)_ rO{[ڍN.jv6=OK˃T ݗN-ؗvV0l cOzuM= !׬\ܯFGEeUk_ZqkJ }ľ?GY=ԐP5۷6oru9M;|Sң!m>,>c joY\ۓoܘdJoo XsdnW>Ti̛lڻ.C"k~}zމ#-{n>>V_NQP7-я_{:B.l4t觻?Y}{s!(gY?|b绝~R2'L-*ZG8cBav7o8FLn/OݕKw]c]2K;C5?9\M,U6'=7]SɿnxpOl7=|ԝ}K=e׬\n)]!8Ů:n-ڛNfkؙC[sP0MYUdMGI3GxA3;5,u=՛[NC4{Ӽ9'UR=~ ҡC7Ӄt+I@ܻhNGgw5H!V sSvA_3q+*֬\|-4-x~MʼnƖYD,܅pGܾVU0֯pr[kI$No0 6u/{yo)/[ʯm,u7ۑH±ӫKs=#V,~x%ȜU2^"ů{saւ'oǍuľ[;Tķ/@Hdv򶊦SnS䎯0SKy><;. =Tua[<5+_kݿI?}?=zx1{swkXx_9s`YԴ| q?|?s_卛ybmlsc=?K;?|c(11[ZJ[6nSJaԴ׭yimʨoxb;>_R@h̺)֖%-o& ? 򇈓Gujh:i~w;Ceb~Ӽ}(aAO^ HL%q_w}ዏᠽ?畳- fP2|#?>,Ԇ//n9e8_p-4Y4oE$c_w:j_—Yk_yô*!@C_Zo_d9-|f ~} #m8qj!D|Bxc9_z,17՛;b `1V g4zsZ\BsCoj^}sd g\'AmKOϪ?`:zn"{ /&Y" (}^lK55E3{Bg^0 ݎAI(K?ʇ.yuԸ}gnC/?C9%'L;?Im̄eq%p{/h=_i8mˀSd5w/uo5jhDD7uW_\CD޷wou"sݨR@H71EUgK1,9VKG7=7g)74ǝk:zL[⁅^ߧ@$pRTV؛cbcx\/Ev;&Y]ʯSӗ7d{t^vfWWmmPV{yeY" ?Du'j~2$f?t#PΛt߬  @U:D#ܼ]z=c bߖXd`#Z?jDKIMN A~eۿ{ tt4#B@$;*VdV̱R{ vy _#ƨ3U_n~H%zOcJإU"hR_ܼb""anDuSBl;SJa /ޮ@yI/W&\TQ3cuu6tB!p%@(td t e4d|}/!hD ~V X, 'Is'9^;@7Q/ T^W{׏=*F8Pb]lgyA~NbmMO(?p3,. Z~o ù- B ,r|%ih0p4A JwT(0Oto<q ?B|†n8 vt;/dq |LJ 7}XuRŢ;PEtaO q;:9'ө8m/s0vÌyř#FF\;TOt5RHwp Tj҄D]"}PjdXIoqW<8|*PEv;V؇!走_4". s~8߇l8>ץN>;T8 `L1R _Tcq =o=nhT#ϋfsoKɫ~,^sq0EscI$rXIENDB`prey.orig/pixmaps/prey-text.png0000664000175100017510000000464312250331650016500 0ustar guerreguerrePNG  IHDR^IuNsBIT|d pHYs o@tEXtSoftwarewww.inkscape.org< IDATxm\UmK0%}Ft5%WM$!hh h1$ƘF#bIA 1)>Xnw2{9s̽$dssI&&&v#6m6멫;m6JfFcpEӷ7͙u>3\Z24:vBjnҡF`̢`h^ߢ.mZ bTRcI +"03 ""i 8+"^4R8pm e@ևἃn>)A~ g;Jd4M{=5Ôs? [΍F%ZjlC&3^r.\s1\4(#r.7*q~ƫPzr.ff4.\L38@kեiCoxK9N8xs ʹXsQls1-TF&9ۜܲ%Rkz>EK []9:NbZ 5Rq(b/Z5^rC9^_y4.r.sMvrarA9ǡZxK9ǡZP]9\L(rC9ǡo_y4.r.ksr~OuTԌmC=Zx6?sOɥԚŴ@kեPŴ@UrC9dP]9\LZu)8s1kZ7B.r.5Z.r.5Z.r.7fեP.YIoX3Ylm!&m?[r)U4Oi|w|aGY pEP9CN38r>:*jҶCΛJ7-5Qq(0x#Qq(8s a409Rq(8sxh;`s9 0rC9ь7fF9ǡMr"Qq(8s۷<\]r-Utʶi+ݚ#eMML`Kk܋/Yr͋}#F+"2^jKxEDzDv)"]D$2}暈HdWHl~Ef>r^+Rl8߅HhWD$|Z^ydyd5#d?}"3/&dI#d%0 3EdL&5S2.<ސz i#MF <{"3#Mk=/98iޱI2s`w|ϺH3qϐ*U}]үk<ہ 3+d͎-5)kmѩWo0w a!>za uX\x`\Km{-y4nuF7LYxe}3o?pO⿃}GqAk:7 vtU8|PI`籽|r ٯ }_C}c7h_U}_k_"q4mp&ؕ0y^nѮu|jᮭNk㭓45ky49 &'2snKzFvb }&ow5.,S7!}J"g6BG-L$FIENDB`prey.orig/pixmaps/prey-agent-48.png0000664000175100017510000001001212250331650017026 0ustar guerreguerrePNG  IHDR00WsBIT|d pHYs_tEXtSoftwarewww.inkscape.org<IDAThŚ{l}ǿ\ޫ}'!q;Ve#emC U"Ud UԖmNJ S-U[G'T:J P)$v8^s&OJ?=9y~s^FDXL1 hчX1&Z8%,(o0X}SF;ӫl8q~$y瞩3CX1>\7 QQ L^a\~_~\y43cL2."'D&GB\Έș3&B1[P?VgBJMs:;Dq0;m'0+D iJPHv:q0m:|d!66SIA/$,Kv$]qKD/Jە_&"f`HCyp1Knq% ip2e&g3.)p;׭IIUJ40nͨD hJ@F1v!I0M/B[Z{Gh"R)1q+.l:\d<#:[7X 7^U=}=T뤮I%,H*@4@@@)K{<{w]wָh"3\ 1.0:ĸu Τs5c٧ :sV2I1&̈́" .R17BQhm֬Y'C/D_閱7[y& 2[Q>1a\̘"sq`UH y;R*xωL&nL 3%P#j J!OM Rncygm-ƹ  L lp.p΀tKA2z\HCUnw\|!ɽ3GS :2@8`gwatd'G142/\s R0g 8t 1;ix2Sb H2c>8/ D{7{KY^+;e6>AZK(pbx Fݻ晃q<pZ.!F 8ƅ1q e0bnu/wC;>p~6gT亇EjI]e&e}SI#JI'GwOژZG5(Ä01Y>a7N5bʯ:"4 c'Ӻ-bŘ#}+tbل1VwEnXmjmp&"0 Ƙ,{,>Q͜ we]Av6\GVF#Q @,WN@sy Gf~0=DOs F~:V_a0W3A\ X9tq錒G?So_0R+%}@w](tM !~q  pnӱzz(G\!iD1Ź5fsTՉdf'os8%ndnaF~X:vm]3UTq L: pxy)\R G37 ;a{ti[Qla|~IFfĤѷ KDio̒U6'"Z5QX 6doK70z8ڈZjިg +d akKkZBԈh& ),/[ U*B^eY7M8]Z4MFDHe!d`Y*T RJXXw:깤ǿtťCZfw p=4[ہJF!(@R"dPW>C "XB  սؼn3v)J/ gϞ/ (_y_=/"2n'5\EDq (8PnTF!5BiTU$iTFL֨!hMF(p+qnŪҪcǎصky ߿Ȉo韠BGf0d0Y @h 2"e4J67adr$ЇHablr f:K( 6< Jщ~(lݺ Nq3/+Z\éh @.E˲VvL`59tY]8>e-`[6,iabj^1iZsjBBpnt۷o_@k}wѝx{ l TC 7"(a`` Rby' :6ٌg1YDhɷ`yi9$雛m?i| $ybN wmo( Xݻ?͏ bW"m;(Rbʍ(KP^442vY' 9Vz+rPR`hda-Qj+s>n N?j /_^X,XR"bڵx+r0N @ Rʹ2h-CUG% ZV=ӆ_DzelezVlt֮\oys+I˲ݳgϫf1dw޽1q:B,!ڊ6xóCcp:9 UbsepD,lyr*|g(ܽGD&/0Df̆=/,48[޲eUVB'O=ztѣGt6b4وD^;8Ϛgr̝7EUг10չm|I- fso-".Wi0IENDB`prey.orig/prey.sh0000775000175100017510000001175712250331650013672 0ustar guerreguerre#!/bin/bash #################################################################### # Prey Bash Client - (c) Fork Ltd. # http://preyproject.com # License: GPLv3 #################################################################### PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH readonly base_path=$(dirname "$0") #################################################################### # base files inclusion #################################################################### . "$base_path/version" . "$base_path/config" [ ! -f "lang/$lang" ] && lang='en' # fallback to english in case the lang is missing . "$base_path/lang/$lang" . "$base_path/core/base" . "$base_path/platform/$os/functions" # if [ `number_of_instances_of prey.sh` -gt 1 ]; then # log ' -- Prey is already running!' # exit 1 # fi log "\n${cyan} ## $STRING_START\n ## $(uname -a)\n ## $(date)${color_end}\n" #################################################################### # lets check if we're actually connected # if we're not, lets try to connect to a wifi access point #################################################################### check_net_status if [ $connected == 0 ]; then if [ "$auto_connect" == "y" ]; then log "$STRING_TRY_TO_CONNECT" try_to_connect fi # ok, lets check again, after waiting a bit sleep 5 check_net_status if [ $connected == 0 ]; then log "$STRING_NO_CONNECT_TO_WIFI" if [ -f "$last_response" ]; then # offline actions were enabled log ' -- Offline actions enabled!' offline_mode=1 get_last_response process_module_config else exit 1 fi fi fi #################################################################### # check API key and perform stuff accordingly #################################################################### if [ $connected == 1 ]; then log ' -- Got network connection!' # we do have an API key but no device key, so let's try to add this device under the account if [[ -n "$api_key" && -z "$device_key" ]]; then log "\n${bold} >> Registering device under account!${bold_end}\n" self_setup fi fi #################################################################### # verify if installation and keys are correct, if requested #################################################################### if [ -n "$check_mode" ]; then log "\n${bold} == Verifying Prey installation...${bold_end}\n" verify_installation if [ "$post_method" == "http" ]; then log "\n${bold} == Verifying API and Device keys...${bold_end}\n" verify_keys elif [ "$post_method" == "email" ]; then log "\n${bold} == Verifying SMTP settings...${bold_end}\n" verify_smtp_settings fi exit $? fi #################################################################### # wait a few seconds to make sure our request doesn't get dropped # due to clashes with the other zillion requests to the CP #################################################################### # only do this if Prey is being run from cron in Mac and Linux if [[ "$os" != "windows" && -n "$(running_from_cron)" && "$post_method" == "http" ]]; then seconds_to_wait=$(get_random_number 59) log " -- Pausing for ${seconds_to_wait} seconds..." sleep $seconds_to_wait fi #################################################################### # if there's a URL in the config, lets see if it actually exists # if it doesn't, the program will shut down gracefully #################################################################### # create tmpdir for downloading stuff, storing files, etc create_tmpdir if [[ $connected == 1 && -n "$check_url" ]]; then log "$STRING_CHECK_URL" log "\n${bold} == Verifying status...${bold_end}\n" check_device_status if [ -z "$response_status" ]; then log_response_error "$check_url" else log " -- Got status code $response_status!" [ "$response_status" == "$missing_status_code" ] && device_missing=1 process_config process_module_config if [ -n "$device_missing" ]; then log "$STRING_PROBLEM" #################################################################### # initialize and fire off active modules #################################################################### set +e # error mode off, just continue if a module fails log " -- Running active report modules..." run_active_modules #################################################################### # lets send whatever we've gathered #################################################################### log "\n${bold} == Sending report!${bold_end}\n" send_report log "\n$STRING_DONE" else log "$STRING_NO_PROBLEM" fi fi fi #################################################################### # if we have any pending actions, run them #################################################################### check_running_actions if [ "${#actions[*]}" -gt 0 ]; then run_pending_actions & disown -h else cleanup fi # if on demand mode was activated, and we're not being by on demand mode itself if [[ -z "$on_demand_call" && "$on_demand_mode" == "true" ]]; then enable_on_demand_mode fi # exit 0