Regenerate docs for upcoming 3.0.1 release.
[privoxy.git] / doc / webserver / user-manual / filter-file.html
1 <HTML
2 ><HEAD
3 ><TITLE
4 >The Filter File</TITLE
5 ><META
6 NAME="GENERATOR"
7 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
8 "><LINK
9 REL="HOME"
10 TITLE="Privoxy 3.0.1 User Manual"
11 HREF="index.html"><LINK
12 REL="PREVIOUS"
13 TITLE="Actions Files"
14 HREF="actions-file.html"><LINK
15 REL="NEXT"
16 TITLE="Templates"
17 HREF="templates.html"><LINK
18 REL="STYLESHEET"
19 TYPE="text/css"
20 HREF="../p_doc.css"></HEAD
21 ><BODY
22 CLASS="SECT1"
23 BGCOLOR="#EEEEEE"
24 TEXT="#000000"
25 LINK="#0000FF"
26 VLINK="#840084"
27 ALINK="#0000FF"
28 ><DIV
29 CLASS="NAVHEADER"
30 ><TABLE
31 SUMMARY="Header navigation table"
32 WIDTH="100%"
33 BORDER="0"
34 CELLPADDING="0"
35 CELLSPACING="0"
36 ><TR
37 ><TH
38 COLSPAN="3"
39 ALIGN="center"
40 >Privoxy 3.0.1 User Manual</TH
41 ></TR
42 ><TR
43 ><TD
44 WIDTH="10%"
45 ALIGN="left"
46 VALIGN="bottom"
47 ><A
48 HREF="actions-file.html"
49 ACCESSKEY="P"
50 >Prev</A
51 ></TD
52 ><TD
53 WIDTH="80%"
54 ALIGN="center"
55 VALIGN="bottom"
56 ></TD
57 ><TD
58 WIDTH="10%"
59 ALIGN="right"
60 VALIGN="bottom"
61 ><A
62 HREF="templates.html"
63 ACCESSKEY="N"
64 >Next</A
65 ></TD
66 ></TR
67 ></TABLE
68 ><HR
69 ALIGN="LEFT"
70 WIDTH="100%"></DIV
71 ><DIV
72 CLASS="SECT1"
73 ><H1
74 CLASS="SECT1"
75 ><A
76 NAME="FILTER-FILE"
77 ></A
78 >9. The Filter File</H1
79 ><P
80 > All text substitutions that can be invoked through the
81  <TT
82 CLASS="LITERAL"
83 ><A
84 HREF="actions-file.html#FILTER"
85 >filter</A
86 ></TT
87 > action
88  must first be defined in the filter file, which is typically
89  called <TT
90 CLASS="FILENAME"
91 >default.filter</TT
92 > and which can be
93  selected through the <TT
94 CLASS="LITERAL"
95 > <A
96 HREF="config.html#FILTERFILE"
97 >filterfile</A
98 ></TT
99 > config
100  option.</P
101 ><P
102 > Typical reasons for doing such substitutions are to eliminate
103  common annoyances in HTML and JavaScript, such as pop-up windows,
104  exit consoles, crippled windows without navigation tools, the
105  infamous &#60;BLINK&#62; tag etc, to suppress images with certain
106  width and height attributes (standard banner sizes or web-bugs),
107  or just to have fun. The possibilities are endless.</P
108 ><P
109 > Filtering works on any text-based document type, including plain
110  text, HTML, JavaScript, CSS etc. (all <TT
111 CLASS="LITERAL"
112 >text/*</TT
113 >
114  MIME types). Substitutions are made at the source level, so if
115  you want to <SPAN
116 CLASS="QUOTE"
117 >"roll your own"</SPAN
118 > filters, you should be
119  familiar with HTML syntax.</P
120 ><P
121 > Just like the <A
122 HREF="actions-file.html"
123 >actions files</A
124 >, the
125  filter file is organized in sections, which are called <SPAN
126 CLASS="emphasis"
127 ><I
128 CLASS="EMPHASIS"
129 >filters</I
130 ></SPAN
131 >
132  here. Each filter consists of a heading line, that starts with the
133  <SPAN
134 CLASS="emphasis"
135 ><I
136 CLASS="EMPHASIS"
137 >keyword</I
138 ></SPAN
139 > <TT
140 CLASS="LITERAL"
141 >FILTER:</TT
142 >, followed by
143  the filter's <SPAN
144 CLASS="emphasis"
145 ><I
146 CLASS="EMPHASIS"
147 >name</I
148 ></SPAN
149 >, and a short (one line) 
150  <SPAN
151 CLASS="emphasis"
152 ><I
153 CLASS="EMPHASIS"
154 >description</I
155 ></SPAN
156 > of what it does. Below that line
157  come the <SPAN
158 CLASS="emphasis"
159 ><I
160 CLASS="EMPHASIS"
161 >jobs</I
162 ></SPAN
163 >, i.e. lines that define the actual
164  text substitutions. By convention, the name of a filter
165  should describe what the filter <SPAN
166 CLASS="emphasis"
167 ><I
168 CLASS="EMPHASIS"
169 >eliminates</I
170 ></SPAN
171 >. The
172  comment is used in the <A
173 HREF="http://config.privoxy.org/"
174 TARGET="_top"
175 >web-based
176  user interface</A
177 >.</P
178 ><P
179 > Once a filter called <TT
180 CLASS="REPLACEABLE"
181 ><I
182 >name</I
183 ></TT
184 > has been defined
185  in the filter file, it can be invoked by using an action of the form
186  +<TT
187 CLASS="LITERAL"
188 ><A
189 HREF="actions-file.html#FILTER"
190 >filter</A
191 >{<TT
192 CLASS="REPLACEABLE"
193 ><I
194 >name</I
195 ></TT
196 >}</TT
197 >
198  in any <A
199 HREF="actions-file.html"
200 >actions file</A
201 >.</P
202 ><P
203 > A filter header line for a filter called <SPAN
204 CLASS="QUOTE"
205 >"foo"</SPAN
206 > could look
207  like this:</P
208 ><P
209 > <TABLE
210 BORDER="0"
211 BGCOLOR="#E0E0E0"
212 WIDTH="100%"
213 ><TR
214 ><TD
215 ><PRE
216 CLASS="SCREEN"
217 >FILTER: foo Replace all "foo" with "bar"</PRE
218 ></TD
219 ></TR
220 ></TABLE
221 ></P
222 ><P
223 > Below that line, and up to the next header line, come the jobs that
224  define what text replacements the filter executes. They are specified
225  in a syntax that imitates <A
226 HREF="http://www.perl.org/"
227 TARGET="_top"
228 >Perl</A
229 >'s
230  <TT
231 CLASS="LITERAL"
232 >s///</TT
233 > operator. If you are familiar with Perl, you
234  will find this to be quite intuitive, and may want to look at the
235  <A
236 HREF="http://www.oesterhelt.org/pcrs/pcrs.3.html"
237 TARGET="_top"
238 >PCRS man page</A
239 >
240  for the subtle differences to Perl behaviour. Most notably, the non-standard
241  option letter <TT
242 CLASS="LITERAL"
243 >U</TT
244 > is supported, which turns the default
245  to ungreedy matching.</P
246 ><P
247 > If you are new to regular expressions, you might want to take a look at
248  the <A
249 HREF="appendix.html#REGEX"
250 >Appendix on regular expressions</A
251 >, and
252  see the <A
253 HREF="http://perldoc.com/perl5.6.1/pod/perl.html"
254 TARGET="_top"
255 >Perl
256  manual</A
257 > for
258  <A
259 HREF="http://perldoc.com/perl5.6.1/pod/perlop.html#s-PATTERN-REPLACEMENT-egimosx"
260 TARGET="_top"
261 >the 
262  <TT
263 CLASS="LITERAL"
264 >s///</TT
265 > operator's syntax</A
266 > and <A
267 HREF="http://perldoc.com/perl5.6.1/pod/perlre.html"
268 TARGET="_top"
269 >Perl-style regular
270  expressions</A
271 > in general.
272  The below examples might also help to get you started.</P
273 ><DIV
274 CLASS="SECT2"
275 ><H2
276 CLASS="SECT2"
277 ><A
278 NAME="AEN3271"
279 ></A
280 >9.1. Filter File Tutorial</H2
281 ><P
282 > Now, let's complete our <SPAN
283 CLASS="QUOTE"
284 >"foo"</SPAN
285 > filter. We have already defined
286  the heading, but the jobs are still missing. Since all it does is to replace
287  <SPAN
288 CLASS="QUOTE"
289 >"foo"</SPAN
290 > with <SPAN
291 CLASS="QUOTE"
292 >"bar"</SPAN
293 >, there is only one (trivial) job
294  needed:</P
295 ><P
296 > <TABLE
297 BORDER="0"
298 BGCOLOR="#E0E0E0"
299 WIDTH="100%"
300 ><TR
301 ><TD
302 ><PRE
303 CLASS="SCREEN"
304 >s/foo/bar/</PRE
305 ></TD
306 ></TR
307 ></TABLE
308 ></P
309 ><P
310 > But wait! Didn't the comment say that <SPAN
311 CLASS="emphasis"
312 ><I
313 CLASS="EMPHASIS"
314 >all</I
315 ></SPAN
316 > occurrences
317  of <SPAN
318 CLASS="QUOTE"
319 >"foo"</SPAN
320 > should be replaced? Our current job will only take
321  care of the first <SPAN
322 CLASS="QUOTE"
323 >"foo"</SPAN
324 > on each page. For global substitution,
325  we'll need to add the <TT
326 CLASS="LITERAL"
327 >g</TT
328 > option:</P
329 ><P
330 > <TABLE
331 BORDER="0"
332 BGCOLOR="#E0E0E0"
333 WIDTH="100%"
334 ><TR
335 ><TD
336 ><PRE
337 CLASS="SCREEN"
338 >s/foo/bar/g</PRE
339 ></TD
340 ></TR
341 ></TABLE
342 ></P
343 ><P
344 > Our complete filter now looks like this:</P
345 ><P
346 > <TABLE
347 BORDER="0"
348 BGCOLOR="#E0E0E0"
349 WIDTH="100%"
350 ><TR
351 ><TD
352 ><PRE
353 CLASS="SCREEN"
354 >FILTER: foo Replace all "foo" with "bar"
355 s/foo/bar/g</PRE
356 ></TD
357 ></TR
358 ></TABLE
359 ></P
360 ><P
361 > Let's look at some real filters for more interesting examples. Here you see
362  a filter that protects against some common annoyances that arise from JavaScript
363  abuse. Let's look at its jobs one after the other:</P
364 ><P
365 > <TABLE
366 BORDER="0"
367 BGCOLOR="#E0E0E0"
368 WIDTH="100%"
369 ><TR
370 ><TD
371 ><PRE
372 CLASS="SCREEN"
373 >FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
374
375 # Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
376 #
377 s|(&#60;script.*)document\.referrer(.*&#60;/script&#62;)|$1"Not Your Business!"$2|Usg</PRE
378 ></TD
379 ></TR
380 ></TABLE
381 ></P
382 ><P
383 > Following the header line and a comment, you see the job. Note that it uses
384  <TT
385 CLASS="LITERAL"
386 >|</TT
387 > as the delimiter instead of <TT
388 CLASS="LITERAL"
389 >/</TT
390 >, because
391  the pattern contains a forward slash, which would otherwise have to be escaped
392  by a backslash (<TT
393 CLASS="LITERAL"
394 >\</TT
395 >).</P
396 ><P
397 > Now, let's examine the pattern: it starts with the text <TT
398 CLASS="LITERAL"
399 >&#60;script.*</TT
400 >
401  enclosed in parentheses. Since the dot matches any character, and <TT
402 CLASS="LITERAL"
403 >*</TT
404 >
405  means: <SPAN
406 CLASS="QUOTE"
407 >"Match an arbitrary number of the element left of myself"</SPAN
408 >, this
409  matches <SPAN
410 CLASS="QUOTE"
411 >"&#60;script"</SPAN
412 >, followed by <SPAN
413 CLASS="emphasis"
414 ><I
415 CLASS="EMPHASIS"
416 >any</I
417 ></SPAN
418 > text, i.e.
419  it matches the whole page, from the start of the first &#60;script&#62; tag.</P
420 ><P
421 > That's more than we want, but the pattern continues: <TT
422 CLASS="LITERAL"
423 >document\.referrer</TT
424 >
425  matches only the exact string <SPAN
426 CLASS="QUOTE"
427 >"document.referrer"</SPAN
428 >. The dot needed to
429  be <SPAN
430 CLASS="emphasis"
431 ><I
432 CLASS="EMPHASIS"
433 >escaped</I
434 ></SPAN
435 >, i.e. preceded by a backslash, to take away its
436  special meaning as a joker, and make it just a regular dot. So far, the meaning is:
437  Match from the start of the first &#60;script&#62; tag in a the page, up to, and including,
438  the text <SPAN
439 CLASS="QUOTE"
440 >"document.referrer"</SPAN
441 >, if <SPAN
442 CLASS="emphasis"
443 ><I
444 CLASS="EMPHASIS"
445 >both</I
446 ></SPAN
447 > are present
448  in the page (and appear in that order).</P
449 ><P
450 > But there's still more pattern to go. The next element, again enclosed in parentheses,
451  is <TT
452 CLASS="LITERAL"
453 >.*&#60;/script&#62;</TT
454 >. You already know what <TT
455 CLASS="LITERAL"
456 >.*</TT
457 >
458  means, so the whole pattern translates to: Match from the start of the first  &#60;script&#62;
459  tag in a page to the end of the last &#60;script&#62; tag, provided that the text
460  <SPAN
461 CLASS="QUOTE"
462 >"document.referrer"</SPAN
463 > appears somewhere in between.</P
464 ><P
465 > This is still not the whole story, since we have ignored the options and the parentheses:
466  The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
467  remembered and be available through the variables <TT
468 CLASS="LITERAL"
469 >$1, $2, ...</TT
470 > in
471  the substitute. The <TT
472 CLASS="LITERAL"
473 >U</TT
474 > option switches to ungreedy matching, which means
475  that the first <TT
476 CLASS="LITERAL"
477 >.*</TT
478 > in the pattern will only <SPAN
479 CLASS="QUOTE"
480 >"eat up"</SPAN
481 > all
482  text in between <SPAN
483 CLASS="QUOTE"
484 >"&#60;script"</SPAN
485 > and the <SPAN
486 CLASS="emphasis"
487 ><I
488 CLASS="EMPHASIS"
489 >first</I
490 ></SPAN
491 > occurrence
492  of <SPAN
493 CLASS="QUOTE"
494 >"document.referrer"</SPAN
495 >, and that the second <TT
496 CLASS="LITERAL"
497 >.*</TT
498 > will
499  only span the text up to the <SPAN
500 CLASS="emphasis"
501 ><I
502 CLASS="EMPHASIS"
503 >first</I
504 ></SPAN
505 > <SPAN
506 CLASS="QUOTE"
507 >"&#60;/script&#62;"</SPAN
508 >
509  tag. Furthermore, the <TT
510 CLASS="LITERAL"
511 >s</TT
512 > option says that the match may span
513  multiple lines in the page, and the <TT
514 CLASS="LITERAL"
515 >g</TT
516 > option again means that the
517  substitution is global.</P
518 ><P
519 > So, to summarize, the pattern means: Match all scripts that contain the text
520  <SPAN
521 CLASS="QUOTE"
522 >"document.referrer"</SPAN
523 >. Remember the parts of the script from
524  (and including) the start tag up to (and excluding) the string
525  <SPAN
526 CLASS="QUOTE"
527 >"document.referrer"</SPAN
528 > as <TT
529 CLASS="LITERAL"
530 >$1</TT
531 >, and the part following
532  that string, up to and including the closing tag, as <TT
533 CLASS="LITERAL"
534 >$2</TT
535 >.</P
536 ><P
537 > Now the pattern is deciphered, but wasn't this about substituting things? So
538  lets look at the substitute: <TT
539 CLASS="LITERAL"
540 >$1"Not Your Business!"$2</TT
541 > is
542  easy to read: The text remembered as <TT
543 CLASS="LITERAL"
544 >$1</TT
545 >, followed by 
546  <TT
547 CLASS="LITERAL"
548 >"Not Your Business!"</TT
549 > (<SPAN
550 CLASS="emphasis"
551 ><I
552 CLASS="EMPHASIS"
553 >including</I
554 ></SPAN
555 >
556  the quotation marks!), followed by the text remembered as <TT
557 CLASS="LITERAL"
558 >$2</TT
559 >.
560  This produces an exact copy of the original string, with the middle part
561  (the <SPAN
562 CLASS="QUOTE"
563 >"document.referrer"</SPAN
564 >) replaced by <TT
565 CLASS="LITERAL"
566 >"Not Your
567  Business!"</TT
568 >.</P
569 ><P
570 > The whole job now reads: Replace <SPAN
571 CLASS="QUOTE"
572 >"document.referrer"</SPAN
573 > by
574  <TT
575 CLASS="LITERAL"
576 >"Not Your Business!"</TT
577 > wherever it appears inside a
578  &#60;script&#62; tag. Note that this job won't break JavaScript syntax,
579  since both the original and the replacement are syntactically valid
580  string objects. The script just won't have access to the referrer
581  information anymore.</P
582 ><P
583 > We'll show you two other jobs from the JavaScript taming department, but
584  this time only point out the constructs of special interest:</P
585 ><P
586 > <TABLE
587 BORDER="0"
588 BGCOLOR="#E0E0E0"
589 WIDTH="100%"
590 ><TR
591 ><TD
592 ><PRE
593 CLASS="SCREEN"
594 ># The status bar is for displaying link targets, not pointless blahblah
595 #
596 s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</PRE
597 ></TD
598 ></TR
599 ></TABLE
600 ></P
601 ><P
602 > <TT
603 CLASS="LITERAL"
604 >\s</TT
605 > stands for whitespace characters (space, tab, newline,
606  carriage return, form feed), so that <TT
607 CLASS="LITERAL"
608 >\s*</TT
609 > means: <SPAN
610 CLASS="QUOTE"
611 >"zero
612  or more whitespace"</SPAN
613 >. The <TT
614 CLASS="LITERAL"
615 >?</TT
616 > in <TT
617 CLASS="LITERAL"
618 >.*?</TT
619 >
620  makes this matching of arbitrary text ungreedy. (Note that the <TT
621 CLASS="LITERAL"
622 >U</TT
623 >
624  option is not set). The <TT
625 CLASS="LITERAL"
626 >['"]</TT
627 > construct means: <SPAN
628 CLASS="QUOTE"
629 >"a single
630  <SPAN
631 CLASS="emphasis"
632 ><I
633 CLASS="EMPHASIS"
634 >or</I
635 ></SPAN
636 > a double quote"</SPAN
637 >. Finally, <TT
638 CLASS="LITERAL"
639 >\1</TT
640 > is
641  a backreference to the first parenthesis just like <TT
642 CLASS="LITERAL"
643 >$1</TT
644 > above,
645  with the difference that in the <SPAN
646 CLASS="emphasis"
647 ><I
648 CLASS="EMPHASIS"
649 >pattern</I
650 ></SPAN
651 >, a backslash indicates
652  a backreference, whereas in the <SPAN
653 CLASS="emphasis"
654 ><I
655 CLASS="EMPHASIS"
656 >substitute</I
657 ></SPAN
658 >, it's the dollar.</P
659 ><P
660 > So what does this job do? It replaces assignments of single- or double-quoted
661  strings to the <SPAN
662 CLASS="QUOTE"
663 >"window.status"</SPAN
664 > object with a dummy assignment
665  (using a variable name that is hopefully odd enough not to conflict with
666  real variables in scripts). Thus, it catches many cases where e.g. pointless
667  descriptions are displayed in the status bar instead of the link target when
668  you move your mouse over links.</P
669 ><P
670 > <TABLE
671 BORDER="0"
672 BGCOLOR="#E0E0E0"
673 WIDTH="100%"
674 ><TR
675 ><TD
676 ><PRE
677 CLASS="SCREEN"
678 ># Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
679 #
680 s/(&#60;body [^&#62;]*)onunload(.*&#62;)/$1never$2/iU</PRE
681 ></TD
682 ></TR
683 ></TABLE
684 ></P
685 ><P
686 > Including the
687  <A
688 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
689 TARGET="_top"
690 >OnUnload
691  event binding</A
692 > in the HTML DOM was a <SPAN
693 CLASS="emphasis"
694 ><I
695 CLASS="EMPHASIS"
696 >CRIME</I
697 ></SPAN
698 >.
699  When I close a browser window, I want it to close and die. Basta.
700  This job replaces the <SPAN
701 CLASS="QUOTE"
702 >"onunload"</SPAN
703 > attribute in
704  <SPAN
705 CLASS="QUOTE"
706 >"&#60;body&#62;"</SPAN
707 > tags with the dummy word <TT
708 CLASS="LITERAL"
709 >never</TT
710 >.
711  Note that the <TT
712 CLASS="LITERAL"
713 >i</TT
714 > option makes the pattern matching
715  case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
716  a minimal match: In the first parenthesis, we had to use <TT
717 CLASS="LITERAL"
718 >[^&#62;]*</TT
719 >
720  instead of <TT
721 CLASS="LITERAL"
722 >.*</TT
723 > to prevent the match from exceeding the 
724  &#60;body&#62; tag if it doesn't contain <SPAN
725 CLASS="QUOTE"
726 >"OnUnload"</SPAN
727 >, but the page's
728  content does.</P
729 ><P
730 > The last example is from the fun department:</P
731 ><P
732 > <TABLE
733 BORDER="0"
734 BGCOLOR="#E0E0E0"
735 WIDTH="100%"
736 ><TR
737 ><TD
738 ><PRE
739 CLASS="SCREEN"
740 >FILTER: fun Fun text replacements
741
742 # Spice the daily news:
743 #
744 s/microsoft(?!\.com)/MicroSuck/ig</PRE
745 ></TD
746 ></TR
747 ></TABLE
748 ></P
749 ><P
750 > Note the <TT
751 CLASS="LITERAL"
752 >(?!\.com)</TT
753 > part (a so-called negative lookahead)
754  in the job's pattern, which means: Don't match, if the string 
755  <SPAN
756 CLASS="QUOTE"
757 >".com"</SPAN
758 > appears directly following <SPAN
759 CLASS="QUOTE"
760 >"microsoft"</SPAN
761 >
762  in the page. This prevents links to microsoft.com from being trashed, while
763  still replacing the word everywhere else.</P
764 ><P
765 > <TABLE
766 BORDER="0"
767 BGCOLOR="#E0E0E0"
768 WIDTH="100%"
769 ><TR
770 ><TD
771 ><PRE
772 CLASS="SCREEN"
773 ># Buzzword Bingo (example for extended regex syntax)
774 #
775 s* industry[ -]leading \
776 |  cutting[ -]edge \
777 |  customer[ -]focused \
778 |  market[ -]driven \
779 |  award[ -]winning # Comments are OK, too! \
780 |  high[ -]performance \
781 |  solutions[ -]based \
782 |  unmatched \
783 |  unparalleled \
784 |  unrivalled \
785 *&#60;font color="red"&#62;&#60;b&#62;BINGO!&#60;/b&#62;&#60;/font&#62; \
786 *igx</PRE
787 ></TD
788 ></TR
789 ></TABLE
790 ></P
791 ><P
792 > The <TT
793 CLASS="LITERAL"
794 >x</TT
795 > option in this job turns on extended syntax, and allows for
796  e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. </P
797 ><P
798 > You get the idea?</P
799 ></DIV
800 ></DIV
801 ><DIV
802 CLASS="NAVFOOTER"
803 ><HR
804 ALIGN="LEFT"
805 WIDTH="100%"><TABLE
806 SUMMARY="Footer navigation table"
807 WIDTH="100%"
808 BORDER="0"
809 CELLPADDING="0"
810 CELLSPACING="0"
811 ><TR
812 ><TD
813 WIDTH="33%"
814 ALIGN="left"
815 VALIGN="top"
816 ><A
817 HREF="actions-file.html"
818 ACCESSKEY="P"
819 >Prev</A
820 ></TD
821 ><TD
822 WIDTH="34%"
823 ALIGN="center"
824 VALIGN="top"
825 ><A
826 HREF="index.html"
827 ACCESSKEY="H"
828 >Home</A
829 ></TD
830 ><TD
831 WIDTH="33%"
832 ALIGN="right"
833 VALIGN="top"
834 ><A
835 HREF="templates.html"
836 ACCESSKEY="N"
837 >Next</A
838 ></TD
839 ></TR
840 ><TR
841 ><TD
842 WIDTH="33%"
843 ALIGN="left"
844 VALIGN="top"
845 >Actions Files</TD
846 ><TD
847 WIDTH="34%"
848 ALIGN="center"
849 VALIGN="top"
850 >&nbsp;</TD
851 ><TD
852 WIDTH="33%"
853 ALIGN="right"
854 VALIGN="top"
855 >Templates</TD
856 ></TR
857 ></TABLE
858 ></DIV
859 ></BODY
860 ></HTML
861 >