Details and documentation about a specific module, including version and documentation (if available).
Note that while links to perldoc.com and
search.cpan.org are provided, the module may be part of a
larger distribution. If you reach a File Not Found page on either site, please try the parent module.
WWW::Mechanize supports performing a sequence of page fetches including
following links and submitting forms. Each fetched page is parsed
and its links and forms are extracted. A link or a form can be
selected, form fields can be filled and the next page can be fetched.
Mech also stores a history of the URLs you've visited, which can
be queried and revisited.
use WWW::Mechanize ();
my $mech = WWW::Mechanize->new();
# Enable strict form processing to catch typos and non-existant form fields.
my $strict_mech = WWW::Mechanize->new( strict_forms => 1);
$strict_mech->get( $url );
# This method call will die, saving you lots of time looking for the bug.
$strict_mech->submit_form(
form_number => 3,
fields => {
usernaem => 'mungo', # typo in field name
password => 'lost-and-alone',
extra_field => 123, # field does not exist
}
);
Mech is well suited for use in testing web applications. If you use
one of the Test::*, like the Test::HTML::Lint manpage modules, you can check the
fetched content and use that as input to a test call.
use Test::More;
like( $mech->content(), qr/$expected/, "Got expected content" );
Each page fetch stores its URL in a history stack which you can
traverse.
$mech->back();
If you want finer control over your page fetching, you can use
these methods. follow_link and submit_form are just high
level wrappers around them.
You can override these overrides by passing params to the constructor,
as in:
my $mech = WWW::Mechanize->new( agent => 'wonderbot 1.01' );
If you want none of the overhead of a cookie jar, or don't want your
bot accepting cookies, you have to explicitly disallow it, like so:
my $mech = WWW::Mechanize->new( cookie_jar => undef );
Here are the params that WWW::Mechanize recognizes. These do not include
params that the LWP::UserAgent manpage recognizes.
autocheck => [0|1]
Checks each request made to see if it was successful. This saves
you the trouble of manually checking yourself. Any errors found
are errors, not warnings.
The default value is ON, unless it's being subclassed, in which
case it is OFF. This means that standalone the WWW::Mechanize manpage instances
have autocheck turned on, which is protective for the vast majority
of Mech users who don't bother checking the return value of get()
and post() and can't figure why their code fails. However, if
the WWW::Mechanize manpage is subclassed, such as for the Test::WWW::Mechanize manpage
or the Test::WWW::Mechanize::Catalyst manpage, this may not be an appropriate
default, so it's off.
This needs to be explicitly turned off if you're using the Crypt::SSLeay manpage to
access a https site via a proxy server. Note: you still need to set your
HTTPS_PROXY environment variable as appropriate.
onwarn => \&func
Reference to a warn-compatible function, such as Carp::carp,
that is called when a warning needs to be shown.
If this is set to undef, no warnings will ever be shown. However,
it's probably better to use the quiet method to control that behavior.
If this value is not passed, Mech uses Carp::carp if Carp is
installed, or CORE::warn if not.
onerror => \&func
Reference to a die-compatible function, such as Carp::croak,
that is called when there's a fatal error.
If this is set to undef, no errors will ever be shown.
If this value is not passed, Mech uses Carp::croak if Carp is
installed, or CORE::die if not.
quiet => [0|1]
Don't complain on warnings. Setting quiet => 1 is the same as
calling $mech->quiet(1). Default is off.
stack_depth => $value
Sets the depth of the page stack that keeps track of all the
downloaded pages. Default is effectively infinite stack size. If
the stack is eating up your memory, then set this to a smaller
number, say 5 or 10. Setting this to zero means Mech will keep no
history.
In addition, WWW::Mechanize also allows you to globally enable
strict and verbose mode for form handling, which is done with the HTML::Form manpage.
strict_forms => [0|1]
Globally sets the HTML::Form strict flag which causes form submission to
croak if any of the passed fields don't exist in the form, and/or a value
doesn't exist in a select element. This can still be disabled in individual
calls to submit_form()|"$mech->submit_form( ... )".
Default is off.
verbose_forms => [0|1]
Globally sets the HTML::Form verbose flag which causes form submission to
warn about any bad HTML form constructs found. This cannot be disabled
later.
Default is off.
marked_sections => [0|1]
Globally sets the HTML::Parser marked sections flag which causes HTML
CDATA[[ sections to be honoured. This cannot be disabled
later.
Default is on.
To support forms, WWW::Mechanize's constructor pushes POST
on to the agent's requests_redirectable list (see also
the LWP::UserAgent manpage.)
The results are stored internally in the agent object, but you don't
know that. Just use the accessors listed below. Poking at the
internals is deprecated and subject to change in the future.
get() is a well-behaved overloaded version of the method in
the LWP::UserAgent manpage. This lets you do things like
$mech->get( $uri, ':content_file' => $tempfile );
and you can rest assured that the params will get filtered down
appropriately.
NOTE: Because :content_file causes the page contents to be
stored in a file instead of the response object, some Mech functions
that expect it to be there won't work as expected. Use with caution.
The equivalent of hitting the ``back'' button in a browser. Returns to
the previous page. Won't go back past the first page. (Really, what
would it do if it could?)
Returns true if it could go back, or false if not.
This returns the nth item in history. The 0th item is the most recent
request and response, which would be acted on by methods like
find_link()|"$mech->find_link( ... )".
The 1th item is the state you'd return to if you called
back()|/$mech->back().
The maximum useful value for $n is $mech->history_count - 1.
Requests beyond that bound will return undef.
History items are returned as hash references, in the form:
When called in a list context, returns a list of the forms found in
the last fetched page. In a scalar context, returns a reference to
an array with those forms. The forms returned are all the HTML::Form manpage
objects.
When called in a list context, returns a list of the links found in the
last fetched page. In a scalar context it returns a reference to an array
with those links. Each link is a the WWW::Mechanize::Link manpage object.
Returns the content that the mech uses internally for the last page
fetched. Ordinarily this is the same as
$mech->response()->decoded_content(),
but this may differ for HTML documents if update_html is
overloaded (in which case the value passed to the base-class
implementation of same will be returned), and/or extra named arguments
are passed to content():
Returns a text-only version of the page, with all HTML markup
stripped. This feature requires HTML::TreeBuilder version 5 or higher
to be installed, or a fatal error will be thrown. This works only if
the contents are HTML.
Returns the HTML document, modified to contain a
<base href="$base_href"> mark-up in the header.
$base_href is $mech->base() if not specified. This is
handy to pass the HTML to e.g. the HTML::Display manpage. This works only if
the contents are HTML.
$mech-content( raw => 1 ) >>$mech->content( raw => 1 )
Returns $self->response()->content(), i.e. the raw contents from the
response.
Returns $self->response()->decoded_content(charset => $charset)
(see the HTTP::Response manpage for details).
To preserve backwards compatibility, additional parameters will be
ignored unless none of raw | decoded_by_headers | charset is
specified and the text is HTML, in which case an error will be triggered.
Lists all the links on the current page. Each link is a
WWW::Mechanize::Link object. In list context, returns a list of all
links. In scalar context, returns an array reference of all links.
Finds a link in the currently fetched page. It returns a
the WWW::Mechanize::Link manpage object which describes the link. (You'll
probably be most interested in the url() property.) If it fails
to find a link it returns undef.
You can take the URL part and pass it to the get() method. If
that's your plan, you might as well use the follow_link() method
directly, since it does the get() for you automatically.
Note that <FRAME SRC="..."> tags are parsed out of the the HTML
and treated as links so this method works with them.
You can select which link to find by passing in one or more of these
key/value pairs:
text => 'string', and text_regex => qr/regex/, text matches the text of the link against string, which must be an
exact match. To select a link with text that is exactly ``download'', use
$mech->find_link( text => 'download' );
text_regex matches the text of the link against regex. To select a
link with text that has ``download'' anywhere in it, regardless of case, use
$mech->find_link( text_regex => qr/download/i );
Note that the text extracted from the page's links are trimmed. For
example, <a> foo </a> is stored as 'foo', and searching for
leading or trailing spaces will fail.
url => 'string', and url_regex => qr/regex/,
Matches the URL of the link against string or regex, as appropriate.
The URL may be a relative URL, like foo/bar.html, depending on how
it's coded on the page.
url_abs => string and url_abs_regex => regex
Matches the absolute URL of the link against string or regex,
as appropriate. The URL will be an absolute URL, even if it's relative
in the page.
tag => string and tag_regex => regex
Matches the tag that the link came from against string or regex,
as appropriate. The tag_regex is probably most useful to check for
more than one tag, as in:
$mech->find_link( tag_regex => qr/^(a|frame)$/ );
The tags and attributes looked at are defined below.
If n is not specified, it defaults to 1. Therefore, if you don't
specify any params, this method defaults to finding the first link on the
page.
Note that you can specify multiple text or URL parameters, which
will be ANDed together. For example, to find the first link with
text of ``News'' and with ``cnn.com'' in the URL, use:
$mech->find_link( text => 'News', url_regex => qr/cnn\.com/ );
Returns all the links on the current page that match the criteria. The
method for specifying link criteria is the same as in
find_link()|"$mech->find_link( ... )".
Each of the links returned is a the WWW::Mechanize::Link manpage object.
In list context, find_all_links() returns a list of the links.
Otherwise, it returns a reference to the list of links.
find_all_links() with no parameters returns all links in the
page.
find_all_inputs() returns an array of all the input controls in the
current form whose properties match all of the regexes passed in.
The controls returned are all descended from HTML::Form::Input.
See INPUTS in the HTML::Form manpage for details.
If no criteria are passed, all inputs will be returned.
If there is no current page, there is no form on the current
page, or there are no submit controls in the current form
then the return will be an empty array.
You may use a regex or a literal string:
# get all textarea controls whose names begin with "customer"
my @customer_text_inputs = $mech->find_all_inputs(
type => 'textarea',
name_regex => qr/^customer/,
);
# get all text or textarea controls called "customer"
my @customer_text_inputs = $mech->find_all_inputs(
type_regex => qr/^(text|textarea)$/,
name => 'customer',
);
find_all_submits() does the same thing as find_all_inputs()
except that it only returns controls that are submit controls,
ignoring other types of input controls like text and checkboxes.
Lists all the images on the current page. Each image is a
WWW::Mechanize::Image object. In list context, returns a list of all
images. In scalar context, returns an array reference of all images.
Finds an image in the current page. It returns a
the WWW::Mechanize::Image manpage object which describes the image. If it fails
to find an image it returns undef.
You can select which image to find by passing in one or more of these
key/value pairs:
alt => 'string' and alt_regex => qr/regex/ alt matches the ALT attribute of the image against string, which must be an
exact match. To select a image with an ALT tag that is exactly ``download'', use
$mech->find_image( alt => 'download' );
alt_regex matches the ALT attribute of the image against a regular
expression. To select an image with an ALT attribute that has ``download''
anywhere in it, regardless of case, use
$mech->find_image( alt_regex => qr/download/i );
url => 'string' and url_regex => qr/regex/
Matches the URL of the image against string or regex, as appropriate.
The URL may be a relative URL, like foo/bar.html, depending on how
it's coded on the page.
url_abs => string and url_abs_regex => regexurl_abs => string and url_abs_regex => regex
Matches the absolute URL of the image against string or regex,
as appropriate. The URL will be an absolute URL, even if it's relative
in the page.
tag => string and tag_regex => regextag => string and tag_regex => regex
Matches the tag that the image came from against string or regex,
as appropriate. The tag_regex is probably most useful to check for
more than one tag, as in:
id => string and id_regex => regexid => string and id_regex => regex id matches the id attribute of the image against string, which must
be an exact match. To select an image with the exact id ``download-image'', use
$mech->find_image( id => 'download-image' );
id_regex matches the id attribute of the image against a regular
expression. To select the first image with an id that contains ``download''
anywhere in it, use
$mech->find_image( id_regex => qr/download/ );
classs => string and class_regex => regex class matches the class attribute of the image against string, which must
be an exact match. To select an image with the exact class ``img-fuid'', use
$mech->find_image( class => 'img-fluid' );
To select an image with the class attribute ``rounded float-left'', use
$mech->find_image( class => 'rounded float-left' );
Note that the classes have to be matched as a complete string, in the exact
order they appear in the website's source code.
class_regex matches the class attribute of the image against a regular
expression. Use this if you want a partial class name, or if an image has
several classes, but you only care about one.
To select the first image with the class ``rounded'', where there are multiple
images that might also have either class ``float-left'' or ``float-right'', use
Selecting an image with multiple classes where you do not care about the
order they appear in the website's source code is not currently supported.
If n is not specified, it defaults to 1. Therefore, if you don't
specify any params, this method defaults to finding the first image on the
page.
Note that you can specify multiple ALT or URL parameters, which
will be ANDed together. For example, to find the first image with
ALT text of ``News'' and with ``cnn.com'' in the URL, use:
Returns all the images on the current page that match the criteria. The
method for specifying image criteria is the same as in
find_image()|"$mech->find_image()".
Each of the images returned is a the WWW::Mechanize::Image manpage object.
In list context, find_all_images() returns a list of the images.
Otherwise, it returns a reference to the list of images.
find_all_images() with no parameters returns all images in the page.
Lists all the forms on the current page. Each form is an the HTML::Form manpage
object. In list context, returns a list of all forms. In scalar
context, returns an array reference of all forms.
Selects the numberth form on the page as the target for subsequent
calls to field()|"$mech->field( $name, $value, $number )"
and click()|"$mech->click( $button [, $x, $y] )".
Also returns the form that was selected.
If it is found, the form is returned as an the HTML::Form manpage object and set internally
for later use with Mech's form methods such as
field()|"$mech->field( $name, $value, $number )" and
click()|"$mech->click( $button [, $x, $y] )".
When called in a list context, the number of the found form is also returned as
a second value.
Emits a warning and returns undef if no form is found.
Selects a form by name. If there is more than one form on the page
with that name, then the first one is used, and a warning is
generated.
If it is found, the form is returned as an the HTML::Form manpage object and
set internally for later use with Mech's form methods such as
field()|"$mech->field( $name, $value, $number )" and
click()|"$mech->click( $button [, $x, $y] )".
Selects a form by ID. If there is more than one form on the page
with that ID, then the first one is used, and a warning is generated.
If it is found, the form is returned as an the HTML::Form manpage object and
set internally for later use with Mech's form methods such as
field()|"$mech->field( $name, $value, $number )" and
click()|"$mech->click( $button [, $x, $y] )".
If no form is found it returns undef. This will also trigger a warning,
unless quiet is enabled.
Selects a form by passing in a list of field names it must contain. All matching forms (perhaps none) are returned as a list of the HTML::Form manpage objects.
Selects a form by passing in a list of field names it must contain. If there
is more than one form on the page with that matches, then the first one is used,
and a warning is generated.
If it is found, the form is returned as an the HTML::Form manpage object and set internally
for later used with Mech's form methods such as
field()|"$mech->field( $name, $value, $number )" and
click()|"$mech->click( $button [, $x, $y] )".
Returns undef and emits a warning if no form is found.
Note that this functionality requires libwww-perl 5.69 or higher.
Searches for forms with arbitrary attribute/value pairs within the <form>
tag.
(Currently does not work for attribute action due to implementation details
of the HTML::Form manpage.)
When given more than one pair, all criteria must match.
Using undef as value means that the attribute in question must not be present.
All matching forms (perhaps none) are returned as a list of the HTML::Form manpage objects.
Searches for forms with arbitrary attribute/value pairs within the <form>
tag.
(Currently does not work for attribute action due to implementation details
of the HTML::Form manpage.)
When given more than one pair, all criteria must match.
Using undef as value means that the attribute in question must not be present.
If it is found, the form is returned as an the HTML::Form manpage object and set internally
for later used with Mech's form methods such as
field()|"$mech->field( $name, $value, $number )" and
click()|"$mech->click( $button [, $x, $y] )".
Given the name of a field, set its value to the value specified.
This applies to the current form (as set by the
form_name()|"$mech->form_name( $name )" or
form_number()|"$mech->form_number($number)"
method or defaulting to the first form on the page).
The optional $number parameter is used to distinguish between two fields
with the same name. The fields are numbered from 1.
Given the name of a select field, set its value to the value
specified. If the field is not <select multiple> and the
$value is an array, only the first value will be set. [Note:
the documentation previously claimed that only the last value would
be set, but this was incorrect.] Passing $value as a hash with
an n key selects an item by number (e.g.
{n => 3} or {n => [2,4]}).
The numbering starts at 1. This applies to the current form.
If you have a field with <select multiple> and you pass a single
$value, then $value will be added to the list of fields selected,
without clearing the others. However, if you pass an array reference,
then all previously selected values will be cleared.
Returns true on successfully setting the value. On failure, returns
false and calls $self->warn() with an error message.
This method sets multiple fields of the current form. It takes a list
of field name and value pairs. If there is more than one field with
the same name, the first one found is set. If you want to select which
of the duplicate field to set, use a value which is an anonymous array
which has the field value and its number as the 2 elements.
# set the second foo field
$mech->set_fields( $name => [ 'foo', 2 ] );
This method sets fields of the current form without having to know
their names. So if you have a login screen that wants a username and
password, you do not have to fetch the form and inspect the source (or
use the mech-dump utility, installed with WWW::Mechanize) to see
what the field names are; you can just say
$mech->set_visible( $username, $password );
and the first and second fields will be set accordingly. The method
is called set_visible because it acts only on visible fields;
hidden form inputs are not considered. The order of the fields is
the order in which they appear in the HTML source which is nearly
always the order anyone viewing the page would think they are in,
but some creative work with tables could change that; caveat user.
Each element in @criteria is either a field value or a field
specifier. A field value is a scalar. A field specifier allows
you to specify the type of input field you want to set and is
denoted with an arrayref containing two elements. So you could
specify the first radio button with
$mech->set_visible( [ radio => 'KCRW' ] );
Field values and specifiers can be intermixed, hence
would set the first two fields to ``fred'' and ``secret'', and the nextOPTION menu field to ``Checking''.
The possible field specifier types are: ``text'', ``password'', ``hidden'',
``textarea'', ``file'', ``image'', ``submit'', ``radio'', ``checkbox'' and ``option''.
``Ticks'' the first checkbox that has both the name and value associated
with it on the current form. Dies if there is no named check box for
that value. Passing in a false value as the third optional argument
will cause the checkbox to be unticked.
Given the name of a field, return its value. This applies to the current
form.
The optional $number parameter is used to distinguish between two fields
with the same name. The fields are numbered from 1.
If the field is of type file (file upload field), the value is always
cleared to prevent remote sites from downloading your local files.
To upload a file, specify its file name explicitly.
Has the effect of clicking a button on the current form. The first
argument is the name of the button to be clicked. The second and
third arguments (optional) allow you to specify the (x,y) coordinates
of the click.
If there is only one button on the form, $mech->click() with
no arguments simply clicks that one button.
Has the effect of clicking a button on the current form by specifying
its name, value, or index. Its arguments are a list of key/value
pairs. Only one of name, number, input or value must be specified in
the keys.
name => name
Clicks the button named name in the current form.
id => id
Clicks the button with the id id in the current form.
number => n
Clicks the nth button in the current form. Numbering starts at 1.
value => value
Clicks the button with the value value in the current form.
This method lets you select a form from the previously fetched page,
fill in its fields, and submit it. It combines the form_number/form_name,
set_fields and click methods into one higher level call. Its arguments
are a list of key/value pairs, all of which are optional.
fields => \%fields
Specifies the fields to be filled in the current form.
with_fields => \%fields
Probably all you need for the common case. It combines a smart form selector
and data setting in one operation. It selects the first form that contains all
fields mentioned in \%fields. This is nice because you don't need to know
the name or number of the form to do this.
If you choose with_fields, the fields option will be ignored. The
form_number, form_name and form_id options will still be used. An
exception will be thrown unless exactly one form matches all of the provided
criteria.
form_number => n
Selects the nth form (calls
form_number()|"$mech->form_number($number)". If this param is not
specified, the currently-selected form is used.
form_name => name
Selects the form named name (calls
form_name()|"$mech->form_name( $name )")
form_id => ID
Selects the form with ID ID (calls
form_id()|"$mech->form_id( $name )")
x => x, y => y
Sets the x or y values for click()|"$mech->click( $button [, $x, $y] )"
strict_forms => bool
Sets the HTML::Form strict flag which causes form submission to croak if any of the passed
fields don't exist on the page, and/or a value doesn't exist in a select element.
By default HTML::Form sets this value to false.
This behavior can also be turned on globally by passing strict_forms => 1 to
WWW::Mechanize->new. If you do that, you can still disable it for individual calls
by passing strict_forms => 0 here.
If no form is selected, the first form found is used.
If button is not passed, then the submit()|"$mech->submit()"
method is used instead.
If you want to submit a file and get its content from a scalar rather
than a file in the filesystem, you can use:
Sets HTTP headers for the agent to add or remove from the HTTP request.
$mech->add_header( Encoding => 'text/klingon' );
If a value is undef, then that header will be removed from any
future requests. For example, to never send a Referer header:
$mech->add_header( Referer => undef );
If you want to delete a header, use delete_header.
Returns the number of name/value pairs added.
NOTE: This method was very different in WWW::Mechanize before 1.00.
Back then, the headers were stored in a package hash, not as a member of
the object instance. Calling add_header() would modify the headers
for every WWW::Mechanize object, even after your object no longer existed.
are passed as-is to $mech->content(%opts). In particular,
decoded_by_headers might come handy if you want to revert the effect
of line compression performed by the web server but without further
interpreting the contents (e.g. decoding it according to the charset).
An overloaded version of redirect_ok() in the LWP::UserAgent manpage.
This method is used to determine whether a redirection in the request
should be followed.
Note that WWW::Mechanize's constructor pushes POST on to the agent's
requests_redirectable list.
Overloaded version of request() in the LWP::UserAgent manpage. Performs
the actual request. Normally, if you're using WWW::Mechanize, it's
because you don't want to deal with this level of stuff anyway.
Allows you to replace the HTML that the mech has found. Updates the
forms and links parse-trees that the mech uses internally.
Say you have a page that you know has malformed output, and you want to
update it so the links come out correctly:
my $html = $mech->content;
$html =~ s[</option>.{0,3}</td>][</option></select></td>]isg;
$mech->update_html( $html );
This method is also used internally by the mech itself to update its
own HTML content when loading a page. This means that if you would
like to systematically perform the above HTML substitution, you
would overload update_html in a subclass thusly:
package MyMech;
use base 'WWW::Mechanize';
sub update_html {
my ($self, $html) = @_;
$html =~ s[</option>.{0,3}</td>][</option></select></td>]isg;
$self->WWW::Mechanize::update_html( $html );
}
If you do this, then the mech will use the tidied-up HTML instead of
the original both when parsing for its own needs, and for returning to
you through content()|"$mech->content(...)".
Overloading this method is also the recommended way of implementing
extra validation steps (e.g. link checkers) for every HTML page
received. warn and die would then come in handy to signal
validation errors.
Updates all internal variables in $mech as if $request was just
performed, and returns $response. The page stack is not altered by
this method, it is up to caller (e.g.
request|"$mech->request( $request [, $arg [, $size]])")
to do that.
Centralized warning method, for diagnostics and non-fatal problems.
Defaults to calling CORE::warn, but may be overridden by setting
onwarn in the constructor.
autocheck can save you the overhead of checking status codes for success.
You may outgrow it as your needs get more sophisticated, but it's a safe option
to start with.
my $agent = WWW::Mechanize->new( autocheck => 1 );
Consider turning on the strict_forms option when you create a new Mech.
This will perform a helpful sanity check on form fields every time you are
submitting a form, which can save you a lot of debugging time.
my $agent = WWW::Mechanize->new( strict_forms => 1 );
If you do not want to have this option globally, you can still turn it on for
individual forms.
http://www.oreilly.com/catalog/googlehks2/chapter/hack84.pdf
Leland Johnson's hack #84 in Google Hacks, 2nd Edition is
an example of a production script that uses WWW::Mechanize and
HTML::TableContentParser. It takes in keywords and returns the estimated
price of these keywords on Google's AdWords program.
http://www.stonehenge.com/merlyn/LinuxMag/col47.html
Randal Schwartz's article on scraping Yahoo News for images. It's
already out of date: He manually walks the list of links hunting
for matches, which wouldn't have been necessary if the
find_link()|"$mech->find_link( ... )" method existed at press time.
Thanks to the numerous people who have helped out on WWW::Mechanize in
one way or another, including
Kirrily Robert for the original WWW::Automate,
Lyle Hopkins,
Damien Clark,
Ansgar Burchardt,
Gisle Aas,
Jeremy Ary,
Hilary Holz,
Rafael Kitover,
Norbert Buchmuller,
Dave Page,
David Sainty,
H.Merijn Brand,
Matt Lawrence,
Michael Schwern,
Adriano Ferreira,
Miyagawa,
Peteris Krumins,
Rafael Kitover,
David Steinbrunner,
Kevin Falcone,
Mike O'Regan,
Mark Stosberg,
Uri Guttman,
Peter Scott,
Philippe Bruhat,
Ian Langworth,
John Beppu,
Gavin Estey,
Jim Brandt,
Ask Bjoern Hansen,
Greg Davies,
Ed Silva,
Mark-Jason Dominus,
Autrijus Tang,
Mark Fowler,
Stuart Children,
Max Maischein,
Meng Wong,
Prakash Kailasa,
Abigail,
Jan Pazdziora,
Dominique Quatravaux,
Scott Lanning,
Rob Casey,
Leland Johnson,
Joshua Gatcomb,
Julien Beasley,
Abe Timmerman,
Peter Stevens,
Pete Krawczyk,
Tad McClellan,
and the late great Iain Truskett.