Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
36 kaklik 1
<?php
2
 
3
/*************************************************************
4
*  TorrentFlux PHP Torrent Manager
5
*  www.torrentflux.com
6
**************************************************************/
7
/*
8
    This file is part of TorrentFlux.
9
 
10
    TorrentFlux is free software; you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation; either version 2 of the License, or
13
    (at your option) any later version.
14
 
15
    TorrentFlux is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
19
 
20
    You should have received a copy of the GNU General Public License
21
    along with TorrentFlux; if not, write to the Free Software
22
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23
*/
24
 
25
   /*****
26
    Usage: btmakemetafile.py <trackerurl> <file> [file...] [params...]
27
 
28
    --announce_list <arg>
29
              a list of announce URLs - explained below (defaults to '')
30
 
31
    --httpseeds <arg>
32
              a list of http seed URLs - explained below (defaults to '')
33
 
34
    --piece_size_pow2 <arg>
35
              which power of 2 to set the piece size to (0 = automatic) (defaults
36
              to 0)
37
 
38
    --comment <arg>
39
              optional human-readable comment to put in .torrent (defaults to '')
40
 
41
    --filesystem_encoding <arg>
42
              optional specification for filesystem encoding (set automatically in
43
              recent Python versions) (defaults to '')
44
 
45
    --target <arg>
46
              optional target file for the torrent (defaults to '')
47
 
48
 
49
        announce_list = optional list of redundant/backup tracker URLs, in the format:
50
               url[,url...][|url[,url...]...]
51
                    where URLs separated by commas are all tried first
52
                    before the next group of URLs separated by the pipe is checked.
53
                    If none is given, it is assumed you don't want one in the metafile.
54
                    If announce_list is given, clients which support it
55
                    will ignore the <announce> value.
56
               Examples:
57
                    http://tracker1.com|http://tracker2.com|http://tracker3.com
58
                         (tries trackers 1-3 in order)
59
                    http://tracker1.com,http://tracker2.com,http://tracker3.com
60
                         (tries trackers 1-3 in a randomly selected order)
61
                    http://tracker1.com|http://backup1.com,http://backup2.com
62
                         (tries tracker 1 first, then tries between the 2 backups randomly)
63
 
64
        httpseeds = optional list of http-seed URLs, in the format:
65
                url[|url...]
66
    *****/
67
 
68
    include_once("config.php");
69
    include_once("functions.php");
70
 
71
    // Variable information
72
    $tpath    = $cfg["torrent_file_path"];
73
    $tfile    = $_POST['torrent'];
74
    $file     = $_GET['path'];
75
    $torrent  = cleanFileName(StripFolders( trim($file) )) . ".torrent";
76
    $announce = ( $_POST['announce'] ) ? $_POST['announce'] : "http://";
77
    $ancelist = $_POST['announcelist'];
78
    $comment  = $_POST['comments'];
79
    $peice    = $_POST['piecesize'];
80
    $alert    = ( $_POST['alert'] ) ? 1 : "''";
81
    $private  = ( $_POST['Private'] == "Private" ) ? true : false;
82
    $dht      = ( $_POST['DHT'] == "DHT" ) ? true : false;
83
 
84
    // Let's create the torrent
85
    if( !empty( $announce ) && $announce != "http://" )
86
    {
87
        // Create maketorrent directory if it doesn't exist
88
        if( !is_dir( $tpath ) )
89
        {
90
            @mkdir( $tpath );
91
        }
92
 
93
        // Clean up old files
94
        if( @file_exists( $tpath . $tfile ) )
95
        {
96
            @unlink( $tpath . $tfile );
97
        }
98
 
99
        // This is the command to execute
100
        $app = "nohup " . $cfg["pythonCmd"] . " -OO " . $cfg["btmakemetafile"] . " " . $announce . " " . escapeshellarg( $cfg['path'] . $file ) . " ";
101
 
102
        // Is there comments to add?
103
        if( !empty( $comment ) )
104
        {
105
            $app .= "--comment " . escapeshellarg( $comment ) . " ";
106
        }
107
 
108
        // Set the piece size
109
        if( !empty( $peice ) )
110
        {
111
            $app .= "--piece_size_pow2 " . $peice . " ";
112
        }
113
 
114
        if( !empty( $ancelist ) )
115
        {
116
            $check = "/" . str_replace( "/", "\/", quotemeta( $announce ) ) . "/i";
117
            // if they didn't add the primary tracker in, we will add it for them
118
            if( preg_match( $check, $ancelist, $result ) )
119
                $app .= "--announce_list " . escapeshellarg( $ancelist ) . " ";
120
            else
121
                $app .= "--announce_list " . escapeshellarg ( $announce . "," . $ancelist ) . " ";
122
        }
123
 
124
        // Set the target torrent fiel
125
        $app .= "--target " . escapeshellarg( $tpath . $tfile );
126
 
127
        // Set to never timeout for large torrents
128
        set_time_limit( 0 );
129
 
130
        // Let's see how long this takes...
131
        $time_start = microtime( true );
132
 
133
        // Execute the command -- w00t!
134
        exec( $app );
135
 
136
        // We want to check to make sure the file was successful
137
        $success = false;
138
        $raw = @file_get_contents( $tpath . $tfile );
139
        if( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) )
140
        {
141
            // This means it is a valid torrent
142
            $success = true;
143
 
144
            // Make an entry for the owner
145
            AuditAction($cfg["constants"]["file_upload"], $tfile);
146
 
147
            // Check to see if one of the flags were set
148
            if( $private || $dht )
149
            {
150
                // Add private/dht Flags
151
                // e7:privatei1e
152
                // e17:dht_backup_enablei1e
153
                // e20:dht_backup_requestedi1e
154
                if( preg_match( "/6:pieces([^:]+):/i", $raw, $results ) )
155
                {
156
                    $pos = strpos( $raw, "6:pieces" ) + 9 + strlen( $results[1] ) + $results[1];
157
                    $fp = @fopen( $tpath . $tfile, "r+" );
158
                    @fseek( $fp, $pos, SEEK_SET );
159
                    if( $private )
160
                    {
161
                        @fwrite( $fp, "7:privatei1e17:dht_backup_enablei0e20:dht_backup_requestedi0eee" );
162
                    }
163
                    else
164
                    {
165
                        @fwrite( $fp, "e7:privatei0e17:dht_backup_enablei1e20:dht_backup_requestedi1eee" );
166
                    }
167
                    @fclose( $fp );
168
                }
169
            }
170
        }
171
        else
172
        {
173
            // Something went wrong, clean up
174
            if( @file_exists( $tpath . $tfile ) )
175
            {
176
                @unlink( $tpath . $tfile );
177
            }
178
        }
179
 
180
        // We are done! how long did we take?
181
        $time_end = microtime( true );
182
        $diff = duration($time_end - $time_start);
183
 
184
        // make path URL friendly to support non-standard characters
185
        $downpath = urlencode( $tfile );
186
 
187
        // Depending if we were successful, display the required information
188
        if( $success )
189
        {
190
            $onLoad = "completed( '" . $downpath . "', " . $alert. ", '" . $diff . "' );";
191
        }
192
        else
193
        {
194
            $onLoad = "failed( '" . $downpath . "', " . $alert . " );";
195
        }
196
    }
197
 
198
    // This is the torrent download prompt
199
    if( !empty( $_GET["download"] ) )
200
    {
201
        $tfile = $_GET["download"];
202
 
203
        // ../ is not allowed in the file name
204
        if (!ereg("(\.\.\/)", $tfile))
205
        {
206
            // Does the file exist?
207
            if (file_exists($tpath . $tfile))
208
            {
209
                // Prompt the user to download the new torrent file.
210
                header( "Content-type: application/octet-stream\n" );
211
                header( "Content-disposition: attachment; filename=\"" . $tfile . "\"\n" );
212
                header( "Content-transfer-encoding: binary\n");
213
                header( "Content-length: " . @filesize( $tpath . $tfile ) . "\n" );
214
 
215
                // Send the torrent file
216
                $fp = @fopen( $tpath . $tfile, "r" );
217
                @fpassthru( $fp );
218
                @fclose( $fp );
219
 
220
                AuditAction($cfg["constants"]["fm_download"], $tfile);
221
            }
222
            else
223
            {
224
                AuditAction($cfg["constants"]["error"], "File Not found for download: ".$cfg['user']." tried to download ".$tfile);
225
            }
226
        }
227
        else
228
        {
229
            AuditAction($cfg["constants"]["error"], "ILLEGAL DOWNLOAD: ".$cfg['user']." tried to download ".$tfile);
230
        }
231
        exit();
232
    }
233
 
234
    // Strip the folders from the path
235
    function StripFolders( $path )
236
    {
237
        $pos = strrpos( $path, "/" ) + 1;
238
        $path = substr( $path, $pos );
239
        return $path;
240
    }
241
 
242
    // Convert a timestamp to a duration string
243
    function duration( $timestamp )
244
    {
245
 
246
        $years = floor( $timestamp / ( 60 * 60 * 24 * 365 ) );
247
        $timestamp %= 60 * 60 * 24 * 365;
248
 
249
        $weeks = floor( $timestamp / ( 60 * 60 * 24 * 7 ) );
250
        $timestamp %= 60 * 60 * 24 * 7;
251
 
252
        $days = floor( $timestamp / ( 60 * 60 * 24 ) );
253
        $timestamp %= 60 * 60 * 24;
254
 
255
        $hrs = floor( $timestamp / ( 60 * 60 ) );
256
        $timestamp %= 60 * 60;
257
 
258
        $mins = floor( $timestamp / 60 );
259
        $secs = $timestamp % 60;
260
 
261
        $str = "";
262
 
263
        if( $years >= 1 )
264
            $str .= "{$years} years ";
265
        if( $weeks >= 1 )
266
            $str .= "{$weeks} weeks ";
267
        if( $days >= 1 )
268
            $str .= "{$days} days ";
269
        if( $hrs >= 1 )
270
            $str .= "{$hrs} hours ";
271
        if( $mins >= 1 )
272
            $str .= "{$mins} minutes ";
273
        if( $secs >= 1 )
274
            $str.="{$secs} seconds ";
275
 
276
        return $str;
277
    }
278
?>
279
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
280
<html>
281
<HEAD>
282
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1" />
283
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache; charset=<?php echo _CHARSET ?>" />
284
    <TITLE><?php echo $cfg["pagetitle"]; ?> - Torrent Maker</TITLE>
285
    <LINK REL="icon" HREF="images/favicon.ico" TYPE="image/x-icon" />
286
    <LINK REL="shortcut icon" HREF="images/favicon.ico" TYPE="image/x-icon" />
287
    <LINK REL="StyleSheet" HREF="themes/<?php echo $cfg["theme"]; ?>/style.css" TYPE="text/css" />
288
</HEAD>
289
<SCRIPT SRC="tooltip.js" TYPE="text/javascript"></SCRIPT>
290
<SCRIPT LANGUAGE="JavaScript">
291
    function doSubmit( obj )
292
    {
293
        // Basic check to see if maketorrent is already running
294
        if( obj.value === "Creating..." )
295
            return false;
296
 
297
        // Run some basic validation
298
        var valid = true;
299
        var tlength = document.maketorrent.torrent.value.length - 8;
300
        var torrent = document.maketorrent.torrent.value.substr( tlength );
301
        document.getElementById('output').innerHTML = "";
302
        document.getElementById('ttag').innerHTML   = "";
303
        document.getElementById('atag').innerHTML   = "";
304
 
305
        if( torrent !== ".torrent" )
306
        {
307
            document.getElementById('ttag').innerHTML    = "<b style=\"color: #990000;\">*</b>";
308
            document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Torrent file must end in .torrent</b><BR />";
309
            valid = false;
310
        }
311
 
312
        if( document.maketorrent.announce.value === "http://" )
313
        {
314
            document.getElementById('atag').innerHTML    = "<b style=\"color: #990000;\">*</b>";
315
            document.getElementById('output').innerHTML += "<b style=\"color: #990000;\">* Please enter a valid announce URL.</b><BR />";
316
            valid = false;
317
        }
318
 
319
        // For saftely reason, let's force the property to false if it's disabled (private tracker)
320
        if( document.maketorrent.DHT.disabled )
321
        {
322
            document.maketorrent.DHT.checked = false;
323
        }
324
 
325
        // If validation passed, submit form
326
        if( valid === true )
327
        {
328
            disableForm();
329
            toggleLayer('progress');
330
 
331
            document.getElementById('output').innerHTML += "<b>Creating torrent...</b><BR /><BR />";
332
            document.getElementById('output').innerHTML += "<i>* Note that larger folder/files will take some time to process,</i><BR />";
333
            document.getElementById('output').innerHTML += "<i>&nbsp;&nbsp;&nbsp;do not close the window until it has been completed.</i><BR /><BR />";
334
            document.getElementById('output').innerHTML += "&nbsp;&nbsp;&nbsp;When completed, the torrent will show in your list<BR />";
335
            document.getElementById('output').innerHTML += "&nbsp;&nbsp;&nbsp;and a download link will be provided.<BR />";
336
 
337
            return true;
338
        }
339
        return false;
340
    }
341
 
342
    function disableForm()
343
    {
344
        // Because of IE issue of disabling the submit button,
345
        // we change the text and don't allow resubmitting
346
        document.maketorrent.tsubmit.value = "Creating...";
347
        document.maketorrent.torrent.readOnly = true;
348
        document.maketorrent.announce.readOnly = true;
349
    }
350
 
351
    function ToggleDHT( dhtstatus )
352
    {
353
        document.maketorrent.DHT.disabled = dhtstatus;
354
    }
355
 
356
    function toggleLayer( whichLayer )
357
    {
358
        if( document.getElementById )
359
        {
360
            // This is the way the standards work
361
            var style2 = document.getElementById(whichLayer).style;
362
            style2.display = style2.display ? "" : "block";
363
        }
364
        else if( document.all )
365
        {
366
            // This is the way old msie versions work
367
            var style2 = document.all[whichLayer].style;
368
            style2.display = style2.display ? "" : "block";
369
        }
370
        else if( document.layers )
371
        {
372
            // This is the way nn4 works
373
            var style2 = document.layers[whichLayer].style;
374
            style2.display = style2.display ? "" : "block";
375
        }
376
    }
377
 
378
    function completed( downpath, alertme, timetaken )
379
    {
380
        document.getElementById('output').innerHTML  = "<b style='color: #005500;'>Creation completed!</b><BR />";
381
        document.getElementById('output').innerHTML += "Time taken: <i>" + timetaken + "</i><BR />";
382
        document.getElementById('output').innerHTML += "The new torrent has been added to your list.<BR /><BR />"
383
        document.getElementById('output').innerHTML += "<img src='images/green.gif' border='0' title='Torrent Created' align='absmiddle'> You can download the <a style='font-weight: bold;' href='?download=" + downpath + "'>torrent here</a><BR />";
384
        if( alertme === 1 )
385
            alert( 'Creation of torrent completed!' );
386
    }
387
 
388
    function failed( downpath, alertme )
389
    {
390
        document.getElementById('output').innerHTML  = "<b style='color: #AA0000;'>Creation failed!</b><BR /><BR />";
391
        document.getElementById('output').innerHTML += "An error occured while trying to create the torrent.<BR />";
392
        if( alertme === 1 )
393
            alert( 'Creation of torrent failed!' );
394
    }
395
 
396
    var anlst  = "(optional) announce_list = list of tracker URLs<BR />\n";
397
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>url[,url...][|url[,url...]...]</i><BR />\n";
398
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLs separated by commas are tried first<BR />\n";
399
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before URLs separated by the pipe is checked.<BR />\n";
400
        anlst += "Examples:<BR />\n";
401
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>|</strong>http://b.com<strong>|</strong>http://c.com</i><BR />\n";
402
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a-c</b> in order)<BR />\n";
403
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>,</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";
404
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a-c</b> in a randomly selected order)<BR />\n";
405
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://a.com<strong>|</strong>http://b.com<strong>,</strong>http://c.com</i><BR />\n";
406
        anlst += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tries <b>a</b> first, then tries <b>b-c</b> randomly)<BR />\n";
407
 
408
    var annce  = "tracker announce URL.<BR /><BR />\n";
409
        annce += "Example:<BR />\n";
410
        annce += "&nbsp;&nbsp;&nbsp;&nbsp;<i>http://tracker.com/announce</i><BR />\n";
411
 
412
    var tornt  = "torrent name to be saved as<BR /><BR />\n";
413
        tornt += "Example:<BR />\n";
414
        tornt += "&nbsp;&nbsp;&nbsp;&nbsp;<i>gnome-livecd-2.10.torrent</i><BR />\n";
415
 
416
    var comnt  = "add a comment to your torrent file (optional)<BR />\n";
417
        comnt += "";
418
 
419
    var piece  = "data piece size for torrent<BR />\n";
420
        piece += "power of 2 value to set the piece size to<BR />\n";
421
        piece += "(0 = automatic) (0 only option in this version)<BR />\n";
422
 
423
    var prvte  = "private tracker support<BR />\n";
424
        prvte += "(disallows DHT if enabled)<BR />\n";
425
 
426
    var dhtbl  = "DHT (Distributed Hash Table)<BR /><BR />\n";
427
        dhtbl += "can only be set abled if private flag is not set true<BR />\n";
428
</SCRIPT>
429
<body topmargin="8" leftmargin="5" bgcolor="<?php echo $cfg["main_bgcolor"] ?>" style="font-family:Tahoma, 'Times New Roman'; font-size:12px;" onLoad="
430
<?php
431
    if( !empty( $private ) )
432
        echo "ToggleDHT(true);";
433
    else
434
        echo "ToggleDHT(false);";
435
 
436
    if( !empty( $onLoad ) )
437
        echo $onLoad;
438
?>">
439
    <div align="center">
440
    <table border="0" cellpadding="0" cellspacing="0">
441
        <tr>
442
            <td>
443
                <table border="1" bordercolor="<?php echo $cfg["table_border_dk"] ?>" cellpadding="4" cellspacing="0">
444
                    <tr>
445
                        <td bgcolor="<?php echo $cfg["main_bgcolor"] ?>" background="themes/<?php echo $cfg["theme"] ?>/images/bar.gif">
446
                            <?php DisplayTitleBar($cfg["pagetitle"]." - Torrent Maker", false); ?>
447
                        </td>
448
                    </tr>
449
                    <tr>
450
                        <td bgcolor="<?php echo $cfg["table_header_bg"] ?>">
451
                            <div align="left">
452
                                <table width="100%" bgcolor="<?php echo $cfg["body_data_bg"] ?>">
453
                                    <tr>
454
                                        <td>
455
                                            <form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post" id="maketorrent" name="maketorrent">
456
                                            <table>
457
                                                <tr>
458
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(tornt);" hspace="1" />Torrent name:</td>
459
                                                    <td><input type="text" id="torrent" name="torrent" size="55" value="<?php echo $torrent; ?>" /> <label id="ttag"></label></td>
460
                                                </tr>
461
                                                <tr>
462
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(annce);" hspace="1" />Announcement URL:</td>
463
                                                    <td><input type="text" id="announce" name="announce" size="55" value="<?php echo $announce; ?>" /> <label id="atag"></label></td>
464
                                                </tr>
465
                                                <tr>
466
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(anlst);" hspace="1" />Announce List:</td>
467
                                                    <td><input type="text" id="announcelist" name="announcelist" size="55" value="<?php echo $ancelist; ?>" /> <label id="altag"></label></td>
468
                                                </tr>
469
                                                <tr>
470
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(piece);" hspace="1" />Piece size:</td>
471
                                                    <td><select id="piecesize" name="piecesize">
472
                                                        <option id="0" value="0" selected>0 (Auto)</option>
473
                                                        <!-- Removed for now as it doesn't seem to be working with creating torrents (??) -->
474
                                                        <!--
475
                                                        <option id="256" value="256">256</option>
476
                                                        <option id="512" value="512">512</option>
477
                                                        <option id="1024" value="1024">1024</option>
478
                                                        <option id="2048" value="2048">2048</option>
479
                                                        -->
480
                                                    </select> bytes</td>
481
                                                </tr>
482
                                                <tr>
483
                                                    <td valign="top"><img align="absmiddle" src="images/info.gif" onmouseover="return escape(comnt);" hspace="1" />Comments:</td>
484
                                                    <td><textarea cols="50" rows="3" id="comments" name="comments"><?php echo $comment; ?></textarea></td>
485
                                                </tr>
486
                                                <tr>
487
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(prvte);" hspace="1" />Private Torrent:</td>
488
                                                    <td>
489
                                                        <input type="radio" id="Private" name="Private" value="Private" onClick="ToggleDHT(true);"<?php echo ( $private ) ? " checked" : ""; ?>>Yes</input>
490
                                                        <input type="radio" id="Private" name="Private" value="NotPrivate" onClick="ToggleDHT(false);"<?php echo ( !$private ) ? " checked" : ""; ?>>No</input>
491
                                                    </td>
492
                                                </tr>
493
                                                <tr>
494
                                                    <td><img align="absmiddle" src="images/info.gif" onmouseover="return escape(dhtbl);" hspace="1" />DHT Support:</td>
495
                                                    <td><input type="checkbox" id="DHT" name="DHT"<?php echo ( $dht ) ? " checked" : ""; ?> value="DHT"></input></td>
496
                                                </tr>
497
                                                <tr>
498
                                                    <td>&nbsp;</td>
499
                                                    <td>
500
                                                        <input type="submit" id="tsubmit" name="tsubmit" onClick="return doSubmit(this);" value="Create" />
501
                                                        <input type="button" id="Cancel" name="close" value="Close" onClick="window.close();" />
502
                                                        <label for="alert" title="Send alert message box when torrent has been completed.">
503
                                                            <input type="checkbox" id="alert" name="alert"<?php echo ( $alert != "''" ) ? " checked" : ""; ?> value="AlertMe" />
504
                                                            Notify me of completion 
505
                                                        </label>
506
                                                    </td>
507
                                                </tr>
508
                                                <tr>
509
                                                    <td colspan="2">
510
                                                        <div id="progress" name="progress" align="center" style="display: none;"><img src="images/progress_bar.gif" width="200" height="20" /></div>
511
                                                        <label id="output"></label>
512
                                                    </td>
513
                                                </tr>
514
                                            </table>
515
                                            </form>
516
                                        </td>
517
                                    </tr>
518
                                </table>
519
                            </div>
520
                        </td>
521
                    </tr>
522
                </table>
523
<?php 
524
                DisplayTorrentFluxLink(); 
525
?>
526
            </td>
527
        </tr>
528
    </table>
529
    </div>
530
    <script language="javascript">tt_Init();</script>
531
</body>
532
</html>
533