1*49cdfc7eSAndroid Build Coastguard Worker#!/usr/bin/perl 2*49cdfc7eSAndroid Build Coastguard Worker#****************************************************************************# 3*49cdfc7eSAndroid Build Coastguard Worker# Copyright (c) International Business Machines Corp., 2001 # 4*49cdfc7eSAndroid Build Coastguard Worker# # 5*49cdfc7eSAndroid Build Coastguard Worker# This program is free software; you can redistribute it an#or modify # 6*49cdfc7eSAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by # 7*49cdfc7eSAndroid Build Coastguard Worker# the Free Software Foundation; either version 2 of the License, or # 8*49cdfc7eSAndroid Build Coastguard Worker# (at your option) any later version. # 9*49cdfc7eSAndroid Build Coastguard Worker# # 10*49cdfc7eSAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful, # 11*49cdfc7eSAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of # 12*49cdfc7eSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See # 13*49cdfc7eSAndroid Build Coastguard Worker# the GNU General Public License for more details. # 14*49cdfc7eSAndroid Build Coastguard Worker# # 15*49cdfc7eSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License # 16*49cdfc7eSAndroid Build Coastguard Worker# along with this program; if not, write to the Free Software # 17*49cdfc7eSAndroid Build Coastguard Worker# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # 18*49cdfc7eSAndroid Build Coastguard Worker# # 19*49cdfc7eSAndroid Build Coastguard Worker#****************************************************************************# 20*49cdfc7eSAndroid Build Coastguard Worker 21*49cdfc7eSAndroid Build Coastguard Worker#****************************************************************************# 22*49cdfc7eSAndroid Build Coastguard Worker# # 23*49cdfc7eSAndroid Build Coastguard Worker# File: genhtml.pl # 24*49cdfc7eSAndroid Build Coastguard Worker# # 25*49cdfc7eSAndroid Build Coastguard Worker# Description: This is a Parser which can parse the text output generated by # 26*49cdfc7eSAndroid Build Coastguard Worker# pan and convert the same to am HTML format, with proper high- # 27*49cdfc7eSAndroid Build Coastguard Worker# lighting of test result backgorund for easy identification of # 28*49cdfc7eSAndroid Build Coastguard Worker# pass/fail of testcases # 29*49cdfc7eSAndroid Build Coastguard Worker# # 30*49cdfc7eSAndroid Build Coastguard Worker# Author: Subrata Modak: [email protected] # 31*49cdfc7eSAndroid Build Coastguard Worker# # 32*49cdfc7eSAndroid Build Coastguard Worker# # 33*49cdfc7eSAndroid Build Coastguard Worker#****************************************************************************# 34*49cdfc7eSAndroid Build Coastguard Worker 35*49cdfc7eSAndroid Build Coastguard Worker 36*49cdfc7eSAndroid Build Coastguard Workermy $process_line = 0; 37*49cdfc7eSAndroid Build Coastguard Workermy $row_line = ""; 38*49cdfc7eSAndroid Build Coastguard Workermy $flag = 0; 39*49cdfc7eSAndroid Build Coastguard Workermy $flag2 = 0; 40*49cdfc7eSAndroid Build Coastguard Workermy $flag3 = 0; 41*49cdfc7eSAndroid Build Coastguard Workermy $flag4 = 0; 42*49cdfc7eSAndroid Build Coastguard Workermy $test_counter = 1; 43*49cdfc7eSAndroid Build Coastguard Workermy $failed_test_counter = 0; 44*49cdfc7eSAndroid Build Coastguard Workermy $failed_test_counter_flag = 0; 45*49cdfc7eSAndroid Build Coastguard Workermy $brok_test_counter = 0; 46*49cdfc7eSAndroid Build Coastguard Workermy $brok_test_counter_flag = 0; 47*49cdfc7eSAndroid Build Coastguard Workermy $warn_test_counter = 0; 48*49cdfc7eSAndroid Build Coastguard Workermy $warn_test_counter_flag = 0; 49*49cdfc7eSAndroid Build Coastguard Workermy $retr_test_counter = 0; 50*49cdfc7eSAndroid Build Coastguard Workermy $retr_test_counter_flag = 0; 51*49cdfc7eSAndroid Build Coastguard Workermy $conf_test_counter = 0; 52*49cdfc7eSAndroid Build Coastguard Workermy $conf_test_counter_flag = 0; 53*49cdfc7eSAndroid Build Coastguard Workermy $test_passed = 0; 54*49cdfc7eSAndroid Build Coastguard Worker 55*49cdfc7eSAndroid Build Coastguard Workermy $detected_fail = 0; 56*49cdfc7eSAndroid Build Coastguard Workermy $detected_pass = 0; 57*49cdfc7eSAndroid Build Coastguard Workermy $detected_warn = 0; 58*49cdfc7eSAndroid Build Coastguard Workermy $detected_brok = 0; 59*49cdfc7eSAndroid Build Coastguard Workermy $detected_retr = 0; 60*49cdfc7eSAndroid Build Coastguard Workermy $detected_conf = 0; 61*49cdfc7eSAndroid Build Coastguard Workermy $background_colour =0; 62*49cdfc7eSAndroid Build Coastguard Worker 63*49cdfc7eSAndroid Build Coastguard Workermy $header_file = shift (@ARGV) || syntax(); 64*49cdfc7eSAndroid Build Coastguard Workermy $start_tag = shift (@ARGV) || syntax(); 65*49cdfc7eSAndroid Build Coastguard Workermy $end_tag = shift (@ARGV) || syntax(); 66*49cdfc7eSAndroid Build Coastguard Workermy $output_tag = shift (@ARGV) || syntax(); 67*49cdfc7eSAndroid Build Coastguard Workermy $execution_tag = shift (@ARGV) || syntax(); 68*49cdfc7eSAndroid Build Coastguard Worker 69*49cdfc7eSAndroid Build Coastguard Workersub syntax() { 70*49cdfc7eSAndroid Build Coastguard Worker print "syntax: prtag2tag start_tag end_tag output_tag execution_tag file(s)\n"; 71*49cdfc7eSAndroid Build Coastguard Worker exit (1); 72*49cdfc7eSAndroid Build Coastguard Worker} 73*49cdfc7eSAndroid Build Coastguard Worker 74*49cdfc7eSAndroid Build Coastguard Workersub get_background_colour_column() { 75*49cdfc7eSAndroid Build Coastguard Worker if ( $detected_fail == 1 ) { 76*49cdfc7eSAndroid Build Coastguard Worker return "#ff0000"; 77*49cdfc7eSAndroid Build Coastguard Worker } elsif ( $detected_brok == 1 ) { 78*49cdfc7eSAndroid Build Coastguard Worker return Yellow; 79*49cdfc7eSAndroid Build Coastguard Worker } elsif ( $detected_warn == 1 ) { 80*49cdfc7eSAndroid Build Coastguard Worker return Fuchsia; 81*49cdfc7eSAndroid Build Coastguard Worker } elsif ( $detected_retr == 1 ) { 82*49cdfc7eSAndroid Build Coastguard Worker return "#8dc997"; 83*49cdfc7eSAndroid Build Coastguard Worker } elsif ( $detected_conf == 1 ) { 84*49cdfc7eSAndroid Build Coastguard Worker return Aqua; 85*49cdfc7eSAndroid Build Coastguard Worker } else { 86*49cdfc7eSAndroid Build Coastguard Worker return "#66ff66"; 87*49cdfc7eSAndroid Build Coastguard Worker } 88*49cdfc7eSAndroid Build Coastguard Worker} 89*49cdfc7eSAndroid Build Coastguard Worker 90*49cdfc7eSAndroid Build Coastguard Worker 91*49cdfc7eSAndroid Build Coastguard Workerif ($start_tag eq "" || $end_tag eq "" || $output_tag eq "" || $execution_tag eq "") { 92*49cdfc7eSAndroid Build Coastguard Worker syntax(); 93*49cdfc7eSAndroid Build Coastguard Worker} 94*49cdfc7eSAndroid Build Coastguard Worker 95*49cdfc7eSAndroid Build Coastguard Workeropen (FILE, "$header_file") || "Cannot open file: $header_file"; 96*49cdfc7eSAndroid Build Coastguard Workerwhile ($line_2 = <FILE>) { 97*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . $line_2; 98*49cdfc7eSAndroid Build Coastguard Worker} 99*49cdfc7eSAndroid Build Coastguard Worker$row_line =~ s/LTP\ Output\/Log/LTP\ Output\/Log\ (Report\ Generated\ on\ $ENV{TEST_START_TIME})/; 100*49cdfc7eSAndroid Build Coastguard Workerprint $row_line; 101*49cdfc7eSAndroid Build Coastguard Workerclose (FILE); 102*49cdfc7eSAndroid Build Coastguard Worker$row_line = ""; 103*49cdfc7eSAndroid Build Coastguard Worker 104*49cdfc7eSAndroid Build Coastguard Worker 105*49cdfc7eSAndroid Build Coastguard Workerforeach my $file (@ARGV) { 106*49cdfc7eSAndroid Build Coastguard Worker 107*49cdfc7eSAndroid Build Coastguard Worker open (FILE, $file) || die "Cannot open file: $file\n"; 108*49cdfc7eSAndroid Build Coastguard Worker 109*49cdfc7eSAndroid Build Coastguard Worker LINE: while ($line = <FILE>) { 110*49cdfc7eSAndroid Build Coastguard Worker chomp $line; 111*49cdfc7eSAndroid Build Coastguard Worker 112*49cdfc7eSAndroid Build Coastguard Worker if ($line =~ /$start_tag/) { 113*49cdfc7eSAndroid Build Coastguard Worker $process_line = 1; 114*49cdfc7eSAndroid Build Coastguard Worker $flag = 1; 115*49cdfc7eSAndroid Build Coastguard Worker } 116*49cdfc7eSAndroid Build Coastguard Worker if ($line =~ /$end_tag/) { 117*49cdfc7eSAndroid Build Coastguard Worker print "$row_line"; 118*49cdfc7eSAndroid Build Coastguard Worker $process_line = 0; 119*49cdfc7eSAndroid Build Coastguard Worker $flag = 0; $flag2 = 0; $flag3 = 0; $flag4 = 0; $flag5 = 0; 120*49cdfc7eSAndroid Build Coastguard Worker $detected_fail = 0; $detected_pass = 0; $detected_warn = 0; $detected_brok = 0; $detected_retr = 0; $detected_conf = 0; 121*49cdfc7eSAndroid Build Coastguard Worker $background_colour = 0; $failed_test_counter_flag = 0; $brok_test_counter_flag = 0; $warn_test_counter_flag = 0; $retr_test_counter_flag = 0; $conf_test_counter_flag = 0; $row_line= ""; 122*49cdfc7eSAndroid Build Coastguard Worker } 123*49cdfc7eSAndroid Build Coastguard Worker 124*49cdfc7eSAndroid Build Coastguard Worker if ($process_line) { 125*49cdfc7eSAndroid Build Coastguard Worker if ( $flag == 2) { #Assuming we will find "tag" and "stime" values here 126*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/\ /, $line); 127*49cdfc7eSAndroid Build Coastguard Worker @tag_value = split(/=/,$variable_value_pair[0]); 128*49cdfc7eSAndroid Build Coastguard Worker @stime_value = split(/=/,$variable_value_pair[1]); 129*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<tr><td><p><strong>$test_counter</strong></p></td>\n" . 130*49cdfc7eSAndroid Build Coastguard Worker "<td><p><strong>$tag_value[1]</strong></p></td>\n" . 131*49cdfc7eSAndroid Build Coastguard Worker "<td><p><pre><strong>"; 132*49cdfc7eSAndroid Build Coastguard Worker $get_proper_time = localtime ($stime_value[1]); 133*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "$get_proper_time" . "</strong></pre></p></td>\n"; 134*49cdfc7eSAndroid Build Coastguard Worker $test_counter++; 135*49cdfc7eSAndroid Build Coastguard Worker } 136*49cdfc7eSAndroid Build Coastguard Worker if ( $flag == 3) { #Assuming we will find "cmdling" value here 137*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/=/, $line); 138*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong> $variable_value_pair[1] </strong></p></td>\n"; 139*49cdfc7eSAndroid Build Coastguard Worker } 140*49cdfc7eSAndroid Build Coastguard Worker if ( $flag == 4) { #Assuming we will find "contact" value here 141*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/=/, $line); 142*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong>$variable_value_pair[1]</strong></p></td>\n"; 143*49cdfc7eSAndroid Build Coastguard Worker } 144*49cdfc7eSAndroid Build Coastguard Worker if ( $flag == 5) { #Assuming we will find "analysis" value here 145*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/=/, $line); 146*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong>$variable_value_pair[1]</strong></p></td>\n"; 147*49cdfc7eSAndroid Build Coastguard Worker } 148*49cdfc7eSAndroid Build Coastguard Worker if ( $flag3 == 1 ) { 149*49cdfc7eSAndroid Build Coastguard Worker if ( $flag4 == 1 ) { 150*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/=/, $line); 151*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong>$variable_value_pair[1]</strong></p></td>\n"; 152*49cdfc7eSAndroid Build Coastguard Worker } 153*49cdfc7eSAndroid Build Coastguard Worker if ( $flag4 == 2 ) { 154*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/\ /, $line); 155*49cdfc7eSAndroid Build Coastguard Worker @duration_value = split(/=/, $variable_value_pair[0]); 156*49cdfc7eSAndroid Build Coastguard Worker @termination_type_value = split(/=/, $variable_value_pair[1]); 157*49cdfc7eSAndroid Build Coastguard Worker @termination_id_value = split(/=/, $variable_value_pair[2]); 158*49cdfc7eSAndroid Build Coastguard Worker @corefile_value = split(/=/, $variable_value_pair[3]); 159*49cdfc7eSAndroid Build Coastguard Worker $background_colour = get_background_colour_column(); 160*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong>$duration_value[1]</strong></p></td>\n" . 161*49cdfc7eSAndroid Build Coastguard Worker "<td><p><strong>$termination_type_value[1]<strong></p></td>\n" . 162*49cdfc7eSAndroid Build Coastguard Worker "<td><p><strong>$termination_id_value[1]</strong></p></td>\n" . 163*49cdfc7eSAndroid Build Coastguard Worker "<td><p><strong>$corefile_value[1]</strong></p></td>\n"; 164*49cdfc7eSAndroid Build Coastguard Worker $row_line =~ s/<tr>/<tr\ bgcolor=$background_colour>/; 165*49cdfc7eSAndroid Build Coastguard Worker } 166*49cdfc7eSAndroid Build Coastguard Worker if ( $flag4 == 3 ) { 167*49cdfc7eSAndroid Build Coastguard Worker @variable_value_pair = split(/\ /, $line); 168*49cdfc7eSAndroid Build Coastguard Worker @cutime_value = split(/=/, $variable_value_pair[0]); 169*49cdfc7eSAndroid Build Coastguard Worker @cstime_value = split(/=/, $variable_value_pair[1]); 170*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><p><strong>$cutime_value[1]</strong></p></td>\n" . 171*49cdfc7eSAndroid Build Coastguard Worker "<td><p><strong>$cstime_value[1]</strong></p></td></tr>\n"; 172*49cdfc7eSAndroid Build Coastguard Worker } 173*49cdfc7eSAndroid Build Coastguard Worker $flag4++; 174*49cdfc7eSAndroid Build Coastguard Worker } 175*49cdfc7eSAndroid Build Coastguard Worker if ( $line =~ /$execution_tag/ ) { 176*49cdfc7eSAndroid Build Coastguard Worker $flag2 = 0; 177*49cdfc7eSAndroid Build Coastguard Worker $flag3 = 1; 178*49cdfc7eSAndroid Build Coastguard Worker $flag4 = 1; 179*49cdfc7eSAndroid Build Coastguard Worker $flag5 = 1; 180*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "</strong></pre></td>"; 181*49cdfc7eSAndroid Build Coastguard Worker } 182*49cdfc7eSAndroid Build Coastguard Worker if ( $flag2 == 1 ) { 183*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "$line \n"; 184*49cdfc7eSAndroid Build Coastguard Worker } 185*49cdfc7eSAndroid Build Coastguard Worker if ( $flag5 == 1 ) { 186*49cdfc7eSAndroid Build Coastguard Worker if ($line =~ "termination_id=1" ) { 187*49cdfc7eSAndroid Build Coastguard Worker $detected_fail = 1; 188*49cdfc7eSAndroid Build Coastguard Worker $failed_test_counter++; 189*49cdfc7eSAndroid Build Coastguard Worker } elsif ($line =~ "termination_id=2" ) { 190*49cdfc7eSAndroid Build Coastguard Worker $detected_brok = 1; 191*49cdfc7eSAndroid Build Coastguard Worker $brok_test_counter++; 192*49cdfc7eSAndroid Build Coastguard Worker } elsif ($line =~ "termination_id=4" ) { 193*49cdfc7eSAndroid Build Coastguard Worker $detected_warn = 1; 194*49cdfc7eSAndroid Build Coastguard Worker $warn_test_counter++; 195*49cdfc7eSAndroid Build Coastguard Worker } elsif ($line =~ "termination_id=32" ) { 196*49cdfc7eSAndroid Build Coastguard Worker $detected_conf = 1; 197*49cdfc7eSAndroid Build Coastguard Worker $conf_test_counter++; 198*49cdfc7eSAndroid Build Coastguard Worker } elsif ($line =~ "termination_id=0" ) { 199*49cdfc7eSAndroid Build Coastguard Worker $detected_pass = 1; 200*49cdfc7eSAndroid Build Coastguard Worker $test_passed++; 201*49cdfc7eSAndroid Build Coastguard Worker } 202*49cdfc7eSAndroid Build Coastguard Worker } 203*49cdfc7eSAndroid Build Coastguard Worker if ( $line =~ /$output_tag/ ) { 204*49cdfc7eSAndroid Build Coastguard Worker $flag2 = 1; 205*49cdfc7eSAndroid Build Coastguard Worker $row_line = $row_line . "<td><pre><strong>"; 206*49cdfc7eSAndroid Build Coastguard Worker } 207*49cdfc7eSAndroid Build Coastguard Worker $flag++; 208*49cdfc7eSAndroid Build Coastguard Worker } 209*49cdfc7eSAndroid Build Coastguard Worker } 210*49cdfc7eSAndroid Build Coastguard Worker close (FILE); 211*49cdfc7eSAndroid Build Coastguard Worker} 212*49cdfc7eSAndroid Build Coastguard Worker 213*49cdfc7eSAndroid Build Coastguard Workerprint "</tbody></table></div> \n\n<h2 id=\"_2\">Summary Report</h2>\n\n<div>\n\n<table border=\"1\" cellspacing=\"3\"><tbody>\n<tr>\n<td "; 214*49cdfc7eSAndroid Build Coastguard Workerif ($ENV{LTP_EXIT_VALUE} == 1 ) { 215*49cdfc7eSAndroid Build Coastguard Worker print "bgcolor=\"#ff0000\"> <strong>Test Summary</strong></p></td><td bgcolor=\"#ff0000\"><strong>Pan reported some Tests FAIL</strong></p></td></tr>\n"; 216*49cdfc7eSAndroid Build Coastguard Worker} 217*49cdfc7eSAndroid Build Coastguard Workerelse { 218*49cdfc7eSAndroid Build Coastguard Worker print "bgcolor=\"#66ff66\"> <strong>Test Summary</strong></p></td><td bgcolor=\"#66ff66\"><strong>Pan reported all Test Pass</strong></p></td></tr>\n"; 219*49cdfc7eSAndroid Build Coastguard Worker} 220*49cdfc7eSAndroid Build Coastguard Worker 221*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>LTP Version</strong> </td><td><strong> $ENV{LTP_VERSION} </strong></td></tr>\n"; 222*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Start Time</strong> </td><td><strong> $ENV{TEST_START_TIME} </strong></td></tr>\n"; 223*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>End Time</strong> </td><td><strong> $ENV{TEST_END_TIME} </strong></td></tr>\n"; 224*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Log Result</strong> </td><td><a href=\"file://$ENV{TEST_LOGS_DIRECTORY}/\"> <strong>$ENV{TEST_LOGS_DIRECTORY}</strong></a></td></tr>\n"; 225*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Output/Failed Result</strong></td><td><a href=\"file://$ENV{TEST_OUTPUT_DIRECTORY}/\"> <strong>$ENV{TEST_OUTPUT_DIRECTORY}</strong></a></td></tr>\n"; 226*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Tests</strong></td><td><strong>"; 227*49cdfc7eSAndroid Build Coastguard Worker$test_counter--; 228*49cdfc7eSAndroid Build Coastguard Workerprint "$test_counter </strong></td></tr>\n"; 229*49cdfc7eSAndroid Build Coastguard Worker$test_passed=$test_counter-$failed_test_counter-$brok_test_counter-$warn_test_counter-$retr_test_counter-$conf_test_counter; 230*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Test TPASS:</strong></td><td><strong> $test_passed </strong></td></tr>\n"; 231*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Test TFAIL:</strong></td><td><strong> $failed_test_counter </strong></td></tr>\n"; 232*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Test TBROK</strong></td><td><strong> $brok_test_counter </strong></td></tr>\n"; 233*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Test TWARN</strong></td><td><strong> $warn_test_counter </strong></td></tr>\n"; 234*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Total Test TCONF</strong></td><td><strong> $conf_test_counter </strong></td></tr>\n"; 235*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Kernel Version</strong></td><td><strong> $ENV{KERNEL_VERSION} </strong></td></tr>\n"; 236*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Machine Architecture</strong></td><td><strong> $ENV{MACHINE_ARCH} </strong></td></tr>\n"; 237*49cdfc7eSAndroid Build Coastguard Workerprint "<tr><td><strong>Hostname</strong> </td> <td><strong>"; 238*49cdfc7eSAndroid Build Coastguard Worker$hostname=system("uname -n"); chop($hostname); 239*49cdfc7eSAndroid Build Coastguard Workerprint " $hostname </strong></td></tr></tbody></table></div></body></html>\n"; 240