wok-current diff tazpkg-web/stuff/search.cgi @ rev 3521

Add Tazpkg-web - SliTaz Packages Web interface
author Christophe Lincoln <pankso@slitaz.org>
date Sun Jun 21 03:26:15 2009 +0200 (2009-06-21)
parents
children bcae4cfaa7e5
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tazpkg-web/stuff/search.cgi	Sun Jun 21 03:26:15 2009 +0200
     1.3 @@ -0,0 +1,527 @@
     1.4 +#!/bin/sh
     1.5 +# Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/
     1.6 +# Christophe Lincoln <pankso@slitaz.org>
     1.7 +#
     1.8 +
     1.9 +read QUERY_STRING
    1.10 +for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do
    1.11 +	eval $i
    1.12 +done
    1.13 +LANG=$lang
    1.14 +SEARCH=$query
    1.15 +SLITAZ_VERSION=$version
    1.16 +OBJECT=$object
    1.17 +DATE=`date +%Y-%m-%d\ \%H:%M:%S`
    1.18 +VERSION=cooking
    1.19 +if [ "$REQUEST_METHOD" = "GET" ]; then
    1.20 +	SEARCH=""
    1.21 +	for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
    1.22 +		SLITAZ_VERSION=cooking
    1.23 +		case "$i" in
    1.24 +		lang=*)
    1.25 +			LANG=${i#*=};;
    1.26 +		file=*)
    1.27 +			SEARCH=${i#*=}
    1.28 +			OBJECT=File;;
    1.29 +		desc=*)
    1.30 +			SEARCH=${i#*=}
    1.31 +			OBJECT=Desc;;
    1.32 +		tags=*)
    1.33 +			SEARCH=${i#*=}
    1.34 +			OBJECT=Tags;;
    1.35 +		receipt=*)
    1.36 +			SEARCH=${i#*=}
    1.37 +			OBJECT=Receipt;;
    1.38 +		filelist=*)
    1.39 +			SEARCH=${i#*=}
    1.40 +			OBJECT=File_list;;
    1.41 +		package=*)
    1.42 +			SEARCH=${i#*=}
    1.43 +			OBJECT=Package;;
    1.44 +		depends=*)
    1.45 +			SEARCH=${i#*=}
    1.46 +			OBJECT=Depends;;
    1.47 +		version=s*|version=2*)
    1.48 +			SLITAZ_VERSION=stable;;
    1.49 +		version=1*)
    1.50 +			SLITAZ_VERSION=1.0;;
    1.51 +		esac
    1.52 +	done
    1.53 +	[ -n "$SEARCH" ] && REQUEST_METHOD="POST"
    1.54 +fi
    1.55 +
    1.56 +case "$OBJECT" in
    1.57 +File)	 	selected_file="selected";;
    1.58 +Desc)	 	selected_desc="selected";;
    1.59 +Tags)	 	selected_tags="selected";;
    1.60 +Receipt) 	selected_receipt="selected";;
    1.61 +File_list) 	selected_file_list="selected";;
    1.62 +Depends)	selected_depends="selected";;
    1.63 +esac
    1.64 +
    1.65 +case "$SLITAZ_VERSION" in
    1.66 +1.0)	 	selected_1="selected";;
    1.67 +stable)		selected_stable="selected";;
    1.68 +esac
    1.69 +
    1.70 +# unescape query
    1.71 +SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
    1.72 +
    1.73 +if [ -z "$LANG" ]; then
    1.74 +	for i in $(echo $HTTP_ACCEPT_LANGUAGE | sed 's/[,;]/ /g'); do
    1.75 +		case "$i" in
    1.76 +		fr|de|pt|cn)
    1.77 +			LANG=$i
    1.78 +			break;;
    1.79 +		esac
    1.80 +	done
    1.81 +fi
    1.82 +
    1.83 +package="Package"
    1.84 +file="File"
    1.85 +desc="Description"
    1.86 +tags="Tags"
    1.87 +receipt="Receipt"
    1.88 +file_list="File list"
    1.89 +depends="Depends"
    1.90 +search="Search"
    1.91 +cooking="cooking"
    1.92 +stable="stable"
    1.93 +result="Result for : $SEARCH"
    1.94 +noresult="No package $SEARCH"
    1.95 +deptree="Dependency tree for : $SEARCH"
    1.96 +rdeptree="Reverse dependency tree for : $SEARCH"
    1.97 +charset="ISO-8859-1"
    1.98 +
    1.99 +case "$LANG" in
   1.100 +
   1.101 +fr)	package="Paquet"
   1.102 +	receipt="Recette"
   1.103 +	depends="Dépendances"
   1.104 +	search="Recherche"
   1.105 +	result="Recherche de : $SEARCH"
   1.106 +	noresult="Paquet $SEARCH introuvable"
   1.107 +	deptree="Arbre des dépendances de $SEARCH"
   1.108 +	rdeptree="Arbre inversé des dépendances de $SEARCH"
   1.109 +	file_list="Liste des fichiers"
   1.110 +	file="Fichier";;
   1.111 +
   1.112 +de)	package="Paket"
   1.113 +	depends="Abhängigkeiten"
   1.114 +	desc="Beschreibung"
   1.115 +	search="Suche"
   1.116 +	cooking="Cooking"
   1.117 +	stable="Stable"
   1.118 +	result="Resultate für : $SEARCH"
   1.119 +	noresult="Kein Paket für $SEARCH"
   1.120 +	deptree="Abhängigkeiten von: $SEARCH"
   1.121 +	rdeptree="Abhängigkeit für: $SEARCH"
   1.122 +	file_list="Datei liste"
   1.123 +	file="Datei";;
   1.124 +
   1.125 +pt)	package="Pacote"
   1.126 +	search="Buscar"
   1.127 +	cooking="cooking"
   1.128 +	stable="stable"
   1.129 +	result="Resultado para : $SEARCH"
   1.130 +	noresult="Sem resultado: $SEARCH"
   1.131 +	deptree="Árvore de dependências para: $SEARCH"
   1.132 +	rdeptree="Árvore de dependências reversa para: $SEARCH"
   1.133 +	depends="Dependências"
   1.134 +	desc="Descrição"
   1.135 +	file_list="Arquivo lista"
   1.136 +	file="Arquivo";;
   1.137 +
   1.138 +cn)	package="软件包:"
   1.139 +	cooking="å¼€å‘版"
   1.140 +	stable="稳定版"
   1.141 +	desc="æè¿°"
   1.142 +	tags="标签"
   1.143 +	depends="ä¾èµ–"
   1.144 +	file="文件"
   1.145 +	file_list="文件列表"
   1.146 +	search="Search"
   1.147 +	result="Result for : $SEARCH"
   1.148 +	noresult="No package $SEARCH"
   1.149 +	deptree="Dependency tree for : $SEARCH"
   1.150 +	rdeptree="Reverse dependency tree for : $SEARCH"
   1.151 +	charset="UTF-8";;
   1.152 +
   1.153 +*)	LANG="en";;
   1.154 +
   1.155 +esac
   1.156 +
   1.157 +WOK=/home/slitaz/$SLITAZ_VERSION/wok
   1.158 +
   1.159 +echo Content-type: text/html
   1.160 +echo
   1.161 +
   1.162 +# Search form
   1.163 +search_form()
   1.164 +{
   1.165 +	cat << _EOT_
   1.166 +
   1.167 +<div style="text-align: center; padding: 20px;">
   1.168 +<form method="post" action="search.cgi">
   1.169 +	<input type="hidden" name="lang" value="$LANG" />
   1.170 +	<select name="object">
   1.171 +		<option value="Package">$package</option>
   1.172 +		<option $selected_desc value="Desc">$desc</option>
   1.173 +		<option $selected_tags value="Tags">$tags</option>
   1.174 +		<option $selected_receipt value="Receipt">$receipt</option>
   1.175 +		<option $selected_depends value="Depends">$depends</option>
   1.176 +		<option $selected_file value="File">$file</option>
   1.177 +		<option $selected_file_list value="File_list">$file_list</option>
   1.178 +	</select>
   1.179 +	<strong>:</strong>
   1.180 +	<input type="text" name="query" size="32" value="$SEARCH" />
   1.181 +	<select name="version">
   1.182 +		<option value="cooking">$cooking</option>
   1.183 +		<option $selected_stable value="stable">$stable</option>
   1.184 +		<option $selected_1 value="1.0">1.0</option>
   1.185 +	</select>
   1.186 +	<input type="submit" name="search" value="$search" />
   1.187 +</form>
   1.188 +</div>
   1.189 +_EOT_
   1.190 +}
   1.191 +
   1.192 +# xHTML Header.
   1.193 +xhtml_header()
   1.194 +{
   1.195 +	cat << _EOF_
   1.196 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   1.197 +	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   1.198 +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$LANG" lang="$LANG">
   1.199 +<head>
   1.200 +	<title>SliTaz Packages - Search $SEARCH</title>
   1.201 +	<meta http-equiv="content-type" content="text/html; charset=$charset" />
   1.202 +	<meta name="description" content="Au sujet de SliTaz GNU/Linux mini système d'exploitation" />
   1.203 +	<meta name="keywords" lang="fr" content="Système, libre, gnu, linux, opensource, livecd" />
   1.204 +	<meta name="robots" content="index, follow, all" />
   1.205 +	<meta name="revisit-after" content="7 days" />
   1.206 +	<meta name="expires" content="never" />
   1.207 +	<meta name="modified" content="$DATE" />
   1.208 +	<meta name="author" content="ash, awk, grep, sed and cat"/>
   1.209 +	<meta name="publisher" content="www.slitaz.org" />
   1.210 +	<link rel="shortcut icon" href="http://pkgs.slitaz.org/favicon.ico" />
   1.211 +	<link rel="stylesheet"  type="text/css" href="http://pkgs.slitaz.org/slitaz.css" />
   1.212 +</head>
   1.213 +<body bgcolor="#ffffff">
   1.214 +
   1.215 +<!-- Header -->
   1.216 +<div id="header">
   1.217 +	<a name="top"></a>
   1.218 +<!-- Access -->
   1.219 +<div id="access">
   1.220 +	<a href="http://www.slitaz.org/" title="SliTaz Web site">Website</a> |
   1.221 +	<a href="http://wiki.slitaz.org/" title="SliTaz Community Wiki">Wiki</a> |
   1.222 +	<a href="http://labs.slitaz.org/" title="SliTaz laboratories">Labs</a>
   1.223 +</div>
   1.224 +	<a href="http://pkgs.slitaz.org/"><img id="logo"
   1.225 +	src="http://pkgs.slitaz.org/pics/website/logo.png" title="pkgs.slitaz.org" alt="pkgs.slitaz.org"
   1.226 +	style="border: 0px solid ; width: 200px; height: 74px;" /></a>
   1.227 +	<p id="titre">#!/tazpkg/packages</p>
   1.228 +</div>
   1.229 +_EOF_
   1.230 +}
   1.231 +
   1.232 +# xHTML Footer.
   1.233 +xhtml_footer()
   1.234 +{
   1.235 +	cat << _EOT_
   1.236 +<center>
   1.237 +<i>$(ls /home/slitaz/$SLITAZ_VERSION/wok | wc -l) packages and $(unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma | wc -l) files in $SLITAZ_VERSION database</i>
   1.238 +</center>
   1.239 +
   1.240 +<!-- End of content with round corner -->
   1.241 +</div>
   1.242 +<div id="content_bottom">
   1.243 +<div class="bottom_left"></div>
   1.244 +<div class="bottom_right"></div>
   1.245 +</div>
   1.246 +
   1.247 +<!-- Start of footer and copy notice -->
   1.248 +<div id="copy">
   1.249 +<p>
   1.250 +Dernière modification : $DATE -
   1.251 +<a href="#top">Top of the page</a>
   1.252 +</p>
   1.253 +<p>
   1.254 +Copyright &copy; 2009 <a href="http://www.slitaz.org/">SliTaz</a> -
   1.255 +<a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License</a>
   1.256 +</p>
   1.257 +<!-- End of copy -->
   1.258 +</div>
   1.259 +
   1.260 +<!-- Bottom and logo's -->
   1.261 +<div id="bottom">
   1.262 +<p>
   1.263 +<a href="http://validator.w3.org/check?uri=referer"><img
   1.264 +	src="http://pkgs.slitaz.org/pics/website/xhtml10.png" alt="Valid XHTML 1.0"
   1.265 +	title="Code validé XHTML 1.0"
   1.266 +	style="width: 80px; height: 15px;" /></a>
   1.267 +</p>
   1.268 +</div>
   1.269 +
   1.270 +</body>
   1.271 +</html>
   1.272 +_EOT_
   1.273 +}
   1.274 +
   1.275 +# recursive dependencies scan                                       
   1.276 +dep_scan()                                                       
   1.277 +{                                                                    
   1.278 +for i in $1; do
   1.279 +	case " $ALL_DEPS " in
   1.280 +	*\ $i\ *) continue;;
   1.281 +	esac
   1.282 +	ALL_DEPS="$ALL_DEPS $i"
   1.283 +	if [ -n "$2" ]; then
   1.284 +		echo -n "$2"
   1.285 +		(
   1.286 +		. $WOK/$i/receipt
   1.287 +		cat << _EOT_
   1.288 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.289 +_EOT_
   1.290 +		)
   1.291 +	fi
   1.292 +	[ -f $WOK/$i/receipt ] || continue
   1.293 +	DEPENDS=""
   1.294 +	. $WOK/$i/receipt
   1.295 +	[ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2    "
   1.296 +done
   1.297 +}
   1.298 +
   1.299 +# recursive reverse dependencies scan                       
   1.300 +rdep_scan()                                                           
   1.301 +{                                                                            
   1.302 +SEARCH=$1
   1.303 +case "$SEARCH" in
   1.304 +glibc-base|gcc-lib-base) cat <<EOT
   1.305 +	glibc-base and gcc-lib-base are implicit dependencies
   1.306 +	<b>every</b> packages are supposed to depend on them.
   1.307 +EOT
   1.308 +	return;;
   1.309 +esac
   1.310 +for i in $WOK/* ; do
   1.311 +	DEPENDS=""
   1.312 +	. $i/receipt
   1.313 +	echo "$(basename $i) $(echo $DEPENDS)"
   1.314 +done | awk -v search=$SEARCH '
   1.315 +function show_deps(deps, all_deps, pkg, space)
   1.316 +{
   1.317 +	if (all_deps[pkg] == 1) return
   1.318 +	all_deps[pkg] = 1
   1.319 +	if (space != "") printf "%s%s\n",space,pkg
   1.320 +	for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
   1.321 +		show_deps(deps, all_deps, mydeps[i],"////" space)
   1.322 +	}
   1.323 +}
   1.324 +
   1.325 +{
   1.326 +	all_deps[$1] = 0
   1.327 +	for (i = 2; i <= NF; i++)
   1.328 +		deps[$i] = deps[$i] " " $1
   1.329 +}
   1.330 +
   1.331 +END {
   1.332 +	show_deps(deps, all_deps, search, "")
   1.333 +}
   1.334 +' | while read pkg; do
   1.335 +		. $WOK/${pkg##*/}/receipt
   1.336 +		cat << _EOT_
   1.337 +$(echo ${pkg%/*} | sed 's|/| |g') <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.338 +_EOT_
   1.339 +done
   1.340 +}
   1.341 +
   1.342 +# Check package exists
   1.343 +package_exist()
   1.344 +{
   1.345 +	[ -f $WOK/$1/receipt ] && return 0
   1.346 +	cat << _EOT_
   1.347 +
   1.348 +<h3>$noresult</h3>
   1.349 +<pre class="package">
   1.350 +_EOT_
   1.351 +	return 1
   1.352 +}
   1.353 +
   1.354 +# Display search form and result if requested.
   1.355 +if [ "$REQUEST_METHOD" != "POST" ]; then
   1.356 +	xhtml_header
   1.357 +	cat << _EOT_
   1.358 +
   1.359 +<!-- Content top. -->
   1.360 +<div id="content_top">
   1.361 +<div class="top_left"></div>
   1.362 +<div class="top_right"></div>
   1.363 +</div>
   1.364 +
   1.365 +<!-- Content -->
   1.366 +<div id="content">
   1.367 +<a name="content"></a>
   1.368 +
   1.369 +<h1><font color="#3E1220">$package</font></h1>
   1.370 +<h2><font color="#DF8F06">$search</font></h2>
   1.371 +_EOT_
   1.372 +	search_form
   1.373 +	xhtml_footer
   1.374 +else
   1.375 +	xhtml_header
   1.376 +	cat << _EOT_
   1.377 +
   1.378 +<!-- Content top. -->
   1.379 +<div id="content_top">
   1.380 +<div class="top_left"></div>
   1.381 +<div class="top_right"></div>
   1.382 +</div>
   1.383 +
   1.384 +<!-- Content -->
   1.385 +<div id="content">
   1.386 +<a name="content"></a>
   1.387 +
   1.388 +<h1><font color="#3E1220">$package</font></h1>
   1.389 +<h2><font color="#DF8F06">$search</font></h2>
   1.390 +_EOT_
   1.391 +	search_form
   1.392 +	if [ "$OBJECT" = "Depends" ]; then
   1.393 +		if package_exist $SEARCH ; then
   1.394 +			cat << _EOT_
   1.395 +
   1.396 +<h3>$deptree</h3>
   1.397 +<pre class="package">
   1.398 +_EOT_
   1.399 +			ALL_DEPS=""
   1.400 +			dep_scan $SEARCH ""
   1.401 +			SUGGESTED=""
   1.402 +			. $WOK/$SEARCH/receipt
   1.403 +			if [ -n "$SUGGESTED" ]; then
   1.404 +				cat << _EOT_
   1.405 +</pre>
   1.406 +
   1.407 +<h3>$deptree (SUGGESTED)</h3>
   1.408 +<pre class="package">
   1.409 +_EOT_
   1.410 +				ALL_DEPS=""
   1.411 +				dep_scan "$SUGGESTED" "    "
   1.412 +			fi
   1.413 +			cat << _EOT_
   1.414 +</pre>
   1.415 +
   1.416 +<h3>$rdeptree</h3>
   1.417 +<pre class="package">
   1.418 +_EOT_
   1.419 +			ALL_DEPS=""
   1.420 +			rdep_scan $SEARCH
   1.421 +		fi
   1.422 +	elif [ "$OBJECT" = "File" ]; then
   1.423 +		cat << _EOT_
   1.424 +
   1.425 +<h3>$result</h3>
   1.426 +<pre class="package">
   1.427 +_EOT_
   1.428 +		last=""
   1.429 +		unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
   1.430 +		| grep $SEARCH | while read pkg file; do
   1.431 +			echo "$file" | grep -q $SEARCH || continue
   1.432 +			if [ "$last" != "${pkg%:}" ]; then
   1.433 +				last=${pkg%:}
   1.434 +				(
   1.435 +				. $WOK/$last/receipt
   1.436 +				cat << _EOT_
   1.437 +
   1.438 +<i><b><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></b> $SHORT_DESC</i>
   1.439 +_EOT_
   1.440 +				)
   1.441 +			fi
   1.442 +			echo "    $file"
   1.443 +		done
   1.444 +	elif [ "$OBJECT" = "File_list" ]; then
   1.445 +		package_exist $SEARCH && cat << _EOT_
   1.446 +
   1.447 +<h3>$result</h3>
   1.448 +<pre class="package">
   1.449 +_EOT_
   1.450 +		last=""
   1.451 +		unlzma -c /home/slitaz/$SLITAZ_VERSION/packages/files.list.lzma \
   1.452 +		| grep ^$SEARCH: |  sed 's/.*: /    /' | sort
   1.453 +	elif [ "$OBJECT" = "Desc" ]; then
   1.454 +		cat << _EOT_
   1.455 +
   1.456 +<h3>$result</h3>
   1.457 +<pre class="package">
   1.458 +_EOT_
   1.459 +		last=""
   1.460 +		grep -i $SEARCH /home/slitaz/$SLITAZ_VERSION/packages/packages.desc | \
   1.461 +		sort | while read pkg extras ; do
   1.462 +				. $WOK/$pkg/receipt
   1.463 +				cat << _EOT_
   1.464 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.465 +_EOT_
   1.466 +			done
   1.467 +	elif [ "$OBJECT" = "Tags" ]; then
   1.468 +		cat << _EOT_
   1.469 +
   1.470 +<h3>$result</h3>
   1.471 +<pre class="package">
   1.472 +_EOT_
   1.473 +		last=""
   1.474 +		grep ^TAGS= $WOK/*/receipt |  grep -i $SEARCH | \
   1.475 +		sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
   1.476 +				. $WOK/$pkg/receipt
   1.477 +				cat << _EOT_
   1.478 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.479 +_EOT_
   1.480 +			done
   1.481 +	elif [ "$OBJECT" = "Receipt" ]; then
   1.482 +		package_exist $SEARCH && cat << _EOT_
   1.483 +
   1.484 +<h3>$result</h3>
   1.485 +<pre class="package">
   1.486 +<pre>
   1.487 +$(if [ -f  $WOK/$SEARCH/taz/*/receipt ]; then
   1.488 +	cat $WOK/$SEARCH/taz/*/receipt
   1.489 +  else
   1.490 +    cat $WOK/$SEARCH//receipt
   1.491 +  fi | sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g')
   1.492 +</pre>
   1.493 +_EOT_
   1.494 +	else
   1.495 +		cat << _EOT_
   1.496 +
   1.497 +<h3>$result</h3>
   1.498 +<pre class="package">
   1.499 +_EOT_
   1.500 +		for pkg in `ls $WOK | grep $SEARCH`
   1.501 +		do
   1.502 +			. $WOK/$pkg/receipt
   1.503 +			cat << _EOT_
   1.504 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.505 +_EOT_
   1.506 +		done
   1.507 +		equiv=/home/slitaz/$SLITAZ_VERSION/packages/packages.equiv
   1.508 +		vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
   1.509 +		for vpkg in $vpkgs ; do
   1.510 +	cat << _EOT_
   1.511 +</pre>
   1.512 +
   1.513 +<h3>$result (package providing $vpkg)</h3>
   1.514 +<pre class="package">
   1.515 +_EOT_
   1.516 +			for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
   1.517 +				. $WOK/${pkg#*:}/receipt
   1.518 +				cat << _EOT_
   1.519 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> : $SHORT_DESC
   1.520 +_EOT_
   1.521 +			done
   1.522 +		done
   1.523 +	fi
   1.524 +	cat << _EOT_
   1.525 +</pre>
   1.526 +_EOT_
   1.527 +	xhtml_footer
   1.528 +fi
   1.529 +
   1.530 +exit 0