Backout changeset 69050ad29af0 due to Mac/Linux test failures. CLOSED TREE
authorSiddharth Agarwal <sid.bugzilla@gmail.com>
Tue, 16 Aug 2011 03:16:59 +0530
changeset 8760 3f27028bcc5f31c04831d4620c3fea615f68ecfc
parent 8759 edd17fb955abbff6679178966dd009f23ca8ef1d
child 8761 279fd9704fede4e2f9b2c73940b5422fa6c0bc0f
push id158
push userbugzilla@standard8.plus.com
push dateTue, 27 Sep 2011 19:18:14 +0000
treeherdercomm-beta@e47b99c61e4d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
backs out69050ad29af01176ec99a8e94a91d0a55ef28d1a
Backout changeset 69050ad29af0 due to Mac/Linux test failures. CLOSED TREE
configure.in
mail/test/mozmill/Makefile.in
mail/test/mozmill/folder-display/test-message-commands.js
mail/test/mozmill/message-header/test-message-header.js
mail/test/mozmill/runtest.py
mail/test/mozmill/runtestlist.py
mail/test/mozmill/shared-modules/test-folder-display-helpers.js
mail/test/mozmill/shared-modules/test-migration-helpers.js
mail/test/resources/ManifestDestiny/PKG-INFO
mail/test/resources/ManifestDestiny/README.txt
mail/test/resources/ManifestDestiny/manifestparser.py
mail/test/resources/ManifestDestiny/setup.cfg
mail/test/resources/ManifestDestiny/setup.py
mail/test/resources/installmozmill.py
mail/test/resources/jsbridge/MANIFEST.in
mail/test/resources/jsbridge/jsbridge/__init__.py
mail/test/resources/jsbridge/jsbridge/extension/chrome.manifest
mail/test/resources/jsbridge/jsbridge/extension/chrome/content/overlay.js
mail/test/resources/jsbridge/jsbridge/extension/chrome/content/overlay.xul
mail/test/resources/jsbridge/jsbridge/extension/components/cmdarg.js
mail/test/resources/jsbridge/jsbridge/extension/install.rdf
mail/test/resources/jsbridge/jsbridge/extension/resource/modules/events.js
mail/test/resources/jsbridge/jsbridge/extension/resource/modules/init.js
mail/test/resources/jsbridge/jsbridge/extension/resource/modules/json2.js
mail/test/resources/jsbridge/jsbridge/extension/resource/modules/server.js
mail/test/resources/jsbridge/jsbridge/jsobjects.py
mail/test/resources/jsbridge/jsbridge/network.py
mail/test/resources/jsbridge/setup.py
mail/test/resources/mozmill/MANIFEST.in
mail/test/resources/mozmill/docs/Makefile
mail/test/resources/mozmill/docs/_build/doctrees/environment.pickle
mail/test/resources/mozmill/docs/_build/doctrees/index.doctree
mail/test/resources/mozmill/docs/_build/html/_sources/index.txt
mail/test/resources/mozmill/docs/_build/html/_static/contents.png
mail/test/resources/mozmill/docs/_build/html/_static/default.css
mail/test/resources/mozmill/docs/_build/html/_static/doctools.js
mail/test/resources/mozmill/docs/_build/html/_static/file.png
mail/test/resources/mozmill/docs/_build/html/_static/jquery.js
mail/test/resources/mozmill/docs/_build/html/_static/minus.png
mail/test/resources/mozmill/docs/_build/html/_static/navigation.png
mail/test/resources/mozmill/docs/_build/html/_static/plus.png
mail/test/resources/mozmill/docs/_build/html/_static/pygments.css
mail/test/resources/mozmill/docs/_build/html/_static/rightsidebar.css
mail/test/resources/mozmill/docs/_build/html/_static/searchtools.js
mail/test/resources/mozmill/docs/_build/html/_static/sphinxdoc.css
mail/test/resources/mozmill/docs/_build/html/_static/stickysidebar.css
mail/test/resources/mozmill/docs/_build/html/_static/traditional.css
mail/test/resources/mozmill/docs/_build/html/genindex.html
mail/test/resources/mozmill/docs/_build/html/index.html
mail/test/resources/mozmill/docs/_build/html/modindex.html
mail/test/resources/mozmill/docs/_build/html/objects.inv
mail/test/resources/mozmill/docs/_build/html/search.html
mail/test/resources/mozmill/docs/_build/html/searchindex.js
mail/test/resources/mozmill/docs/conf.py
mail/test/resources/mozmill/docs/index.rst
mail/test/resources/mozmill/mozmill/__init__.py
mail/test/resources/mozmill/mozmill/extension/build.xml
mail/test/resources/mozmill/mozmill/extension/chrome-jar.manifest
mail/test/resources/mozmill/mozmill/extension/chrome.manifest
mail/test/resources/mozmill/mozmill/extension/content/chrome.js
mail/test/resources/mozmill/mozmill/extension/content/css/fg.menu.css
mail/test/resources/mozmill/mozmill/extension/content/css/mozmill.css
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-icons_222222_256x240.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-icons_2e83ff_256x240.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-icons_454545_256x240.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-icons_888888_256x240.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/images/ui-icons_cd0a0a_256x240.png
mail/test/resources/mozmill/mozmill/extension/content/css/smoothness/jquery-ui-1.7.1.custom.css
mail/test/resources/mozmill/mozmill/extension/content/dx.js
mail/test/resources/mozmill/mozmill/extension/content/dxwindow.xul
mail/test/resources/mozmill/mozmill/extension/content/editor/bespin/BespinEmbedded.css
mail/test/resources/mozmill/mozmill/extension/content/editor/bespin/BespinEmbedded.js
mail/test/resources/mozmill/mozmill/extension/content/editor/bespin/BespinMain.js
mail/test/resources/mozmill/mozmill/extension/content/editor/bespin/BespinWorker.js
mail/test/resources/mozmill/mozmill/extension/content/editor/bespin/resources/screen_theme/theme.less
mail/test/resources/mozmill/mozmill/extension/content/editor/editor.js
mail/test/resources/mozmill/mozmill/extension/content/img/wmIcon.png
mail/test/resources/mozmill/mozmill/extension/content/inspector.js
mail/test/resources/mozmill/mozmill/extension/content/jquery/fg.menu.css
mail/test/resources/mozmill/mozmill/extension/content/jquery/fg.menu.js
mail/test/resources/mozmill/mozmill/extension/content/jquery/jquery-1.3.2.min.js
mail/test/resources/mozmill/mozmill/extension/content/jquery/jquery-ui-1.7.1.custom.min.js
mail/test/resources/mozmill/mozmill/extension/content/jquery/jquery.ui.core.js
mail/test/resources/mozmill/mozmill/extension/content/jquery/jquery.ui.menu.js
mail/test/resources/mozmill/mozmill/extension/content/menus.js
mail/test/resources/mozmill/mozmill/extension/content/mozmill.html
mail/test/resources/mozmill/mozmill/extension/content/mozmill.js
mail/test/resources/mozmill/mozmill/extension/content/mozmill.xul
mail/test/resources/mozmill/mozmill/extension/content/output.js
mail/test/resources/mozmill/mozmill/extension/content/overlay.js
mail/test/resources/mozmill/mozmill/extension/content/overlay.xul
mail/test/resources/mozmill/mozmill/extension/content/overlay_tb.xul
mail/test/resources/mozmill/mozmill/extension/content/prefs.xul
mail/test/resources/mozmill/mozmill/extension/content/rec.js
mail/test/resources/mozmill/mozmill/extension/content/shell.js
mail/test/resources/mozmill/mozmill/extension/content/shortcuts.js
mail/test/resources/mozmill/mozmill/extension/content/test/test.css
mail/test/resources/mozmill/mozmill/extension/content/test/test.html
mail/test/resources/mozmill/mozmill/extension/content/test/test.js
mail/test/resources/mozmill/mozmill/extension/content/test/test.xul
mail/test/resources/mozmill/mozmill/extension/content/testwindow.xul
mail/test/resources/mozmill/mozmill/extension/content/ui.js
mail/test/resources/mozmill/mozmill/extension/defaults/preferences/debug.js
mail/test/resources/mozmill/mozmill/extension/install.rdf
mail/test/resources/mozmill/mozmill/extension/locale/en-US/mozmill.dtd
mail/test/resources/mozmill/mozmill/extension/locale/en-US/overlay.dtd
mail/test/resources/mozmill/mozmill/extension/readme.txt
mail/test/resources/mozmill/mozmill/extension/resource/modules/controller.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/elementslib.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/events.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/frame.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/init.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/inspection.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/jum.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/mozmill.js
mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/EventUtils.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/arrays.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/dom.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/httpd.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/json2.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/objects.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/os.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/securable-module.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/strings.js
mail/test/resources/mozmill/mozmill/extension/resource/stdlib/withs.js
mail/test/resources/mozmill/mozmill/extension/skin/chrome.css
mail/test/resources/mozmill/mozmill/extension/skin/overlay.css
mail/test/resources/mozmill/mozmill/extension/zipexclude.lst
mail/test/resources/mozmill/patches/eventUtils.patch
mail/test/resources/mozmill/patches/httpd.patch
mail/test/resources/mozmill/scripts/songmill.py
mail/test/resources/mozmill/scripts/sync_dependencies.py
mail/test/resources/mozmill/setup.py
mail/test/resources/mozmill/test/commonjs/modules1/moda.js
mail/test/resources/mozmill/test/commonjs/modules1/modb.js
mail/test/resources/mozmill/test/commonjs/modules2/modc.js
mail/test/resources/mozmill/test/commonjs/tests/test_require.js
mail/test/resources/mozmill/test/dnd/testDragLink.js
mail/test/resources/mozmill/test/dnd/testTabView.js
mail/test/resources/mozmill/test/dnd/testhtml.js
mail/test/resources/mozmill/test/dnd/testxul.js
mail/test/resources/mozmill/test/elementLib-UnitTest.js
mail/test/resources/mozmill/test/files/singlediv.html
mail/test/resources/mozmill/test/first_sunbird_test.js
mail/test/resources/mozmill/test/first_thunderbird_test.js
mail/test/resources/mozmill/test/restart/test_browser/testPost.js
mail/test/resources/mozmill/test/restart/test_browser/testPre.js
mail/test/resources/mozmill/test/restart/test_fails/testPost.js
mail/test/resources/mozmill/test/restart/test_fails/testPre.js
mail/test/resources/mozmill/test/restart/test_multi_restart/test1.js
mail/test/resources/mozmill/test/restart/test_multi_restart/test2.js
mail/test/resources/mozmill/test/restart/test_multi_restart/test3.js
mail/test/resources/mozmill/test/restart/test_multi_restart/test4.js
mail/test/resources/mozmill/test/restart/test_multi_restart/test5.js
mail/test/resources/mozmill/test/restart/test_nothing/testPost.js
mail/test/resources/mozmill/test/restart/test_nothing/testPre.js
mail/test/resources/mozmill/test/restart/test_python_callback/callbacks.py
mail/test/resources/mozmill/test/restart/test_python_callback/testPost.js
mail/test/resources/mozmill/test/restart/test_python_callback/testPre.js
mail/test/resources/mozmill/test/restart/test_user_restart/test1.js
mail/test/resources/mozmill/test/restart/test_user_restart/test2.js
mail/test/resources/mozmill/test/restart/test_user_restart/test3.js
mail/test/resources/mozmill/test/restart/test_user_restart/test4.js
mail/test/resources/mozmill/test/restart/test_user_restart/test5.js
mail/test/resources/mozmill/test/test_assert.js
mail/test/resources/mozmill/test/test_demo.js
mail/test/resources/mozmill/test/test_diggIterator.js
mail/test/resources/mozmill/test/test_focus.js
mail/test/resources/mozmill/test/test_git.js
mail/test/resources/mozmill/test/test_googleIterator.js
mail/test/resources/mozmill/test/test_jum.js
mail/test/resources/mozmill/test/test_menu.js
mail/test/resources/mozmill/test/test_prefs.js
mail/test/resources/mozmill/test/test_property.js
mail/test/resources/mozmill/test/test_python_callbacks.js
mail/test/resources/mozmill/test/test_python_callbacks_callbacks.py
mail/test/resources/mozmill/test/test_radio.js
mail/test/resources/mozmill/test/test_reportErrorConsole.js
mail/test/resources/mozmill/test/test_selector.js
mail/test/resources/mozmill/test/test_something/test_parents.js
mail/test/resources/mozmill/test/test_something/test_sub/test_deps.js
mail/test/resources/mozmill/test/test_staleelement.js
mail/test/resources/mozmill/test/test_synthesizeEvents.js
mail/test/resources/mozmill/test/test_unit.js
mail/test/resources/mozmill/test/test_usershutdown.js
mail/test/resources/mozmill/test/test_waitForPageLoad.js
mail/test/resources/mozrunner/mozrunner/__init__.py
mail/test/resources/mozrunner/mozrunner/killableprocess.py
mail/test/resources/mozrunner/mozrunner/qijo.py
mail/test/resources/mozrunner/mozrunner/winprocess.py
mail/test/resources/mozrunner/mozrunner/wpk.py
mail/test/resources/mozrunner/setup.py
mail/test/resources/mozrunner/tests/debub_settings.py
mail/test/resources/mozrunner/tests/jss_settings.py
mail/test/resources/simplejson-2.1.6/.gitignore
mail/test/resources/simplejson-2.1.6/.gitmodules
mail/test/resources/simplejson-2.1.6/CHANGES.txt
mail/test/resources/simplejson-2.1.6/LICENSE.txt
mail/test/resources/simplejson-2.1.6/PKG-INFO
mail/test/resources/simplejson-2.1.6/README.rst
mail/test/resources/simplejson-2.1.6/conf.py
mail/test/resources/simplejson-2.1.6/ez_setup.py
mail/test/resources/simplejson-2.1.6/index.rst
mail/test/resources/simplejson-2.1.6/scripts/make_docs.py
mail/test/resources/simplejson-2.1.6/setup.cfg
mail/test/resources/simplejson-2.1.6/setup.py
mail/test/resources/simplejson-2.1.6/simplejson/__init__.py
mail/test/resources/simplejson-2.1.6/simplejson/_speedups.c
mail/test/resources/simplejson-2.1.6/simplejson/decoder.py
mail/test/resources/simplejson-2.1.6/simplejson/encoder.py
mail/test/resources/simplejson-2.1.6/simplejson/ordered_dict.py
mail/test/resources/simplejson-2.1.6/simplejson/scanner.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/__init__.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_check_circular.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_decimal.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_decode.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_default.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_dump.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_encode_basestring_ascii.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_encode_for_html.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_errors.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_fail.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_float.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_indent.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_pass1.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_pass2.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_pass3.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_recursion.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_scanstring.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_separators.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_speedups.py
mail/test/resources/simplejson-2.1.6/simplejson/tests/test_unicode.py
mail/test/resources/simplejson-2.1.6/simplejson/tool.py
mail/test/resources/virtualenv/AUTHORS.txt
mail/test/resources/virtualenv/LICENSE.txt
mail/test/resources/virtualenv/MANIFEST.in
mail/test/resources/virtualenv/PKG-INFO
mail/test/resources/virtualenv/docs/index.txt
mail/test/resources/virtualenv/docs/news.txt
mail/test/resources/virtualenv/scripts/virtualenv
mail/test/resources/virtualenv/setup.cfg
mail/test/resources/virtualenv/setup.py
mail/test/resources/virtualenv/virtualenv.py
mail/test/resources/virtualenv/virtualenv_support/__init__.py
mail/test/resources/virtualenv/virtualenv_support/distribute-0.6.16.tar.gz
mail/test/resources/virtualenv/virtualenv_support/pip-1.0.1.tar.gz
mail/test/resources/virtualenv/virtualenv_support/setuptools-0.6c11-py2.4.egg
mail/test/resources/virtualenv/virtualenv_support/setuptools-0.6c11-py2.5.egg
mail/test/resources/virtualenv/virtualenv_support/setuptools-0.6c11-py2.6.egg
mail/test/resources/virtualenv/virtualenv_support/setuptools-0.6c11-py2.7.egg
mail/testsuite-targets.mk
mailnews/test/resources/logHelper.js
--- a/configure.in
+++ b/configure.in
@@ -76,17 +76,16 @@ TARGET_OS="${target_os}"
 
 dnl comm-central-specific options
 dnl (MOZILLA_SRCDIR would fit here, but is needed to find autoconf tools)
 COMM_BUILD=1
 AC_SUBST(COMM_BUILD)
 dnl export this, so the var is set for mozilla/configure
 MOZCONFIG=`$_AUTOCONF_TOOLS_DIR/mozconfig-find $topsrcdir`
 export MOZCONFIG
-echo "MOZCONFIG = $MOZCONFIG"
 
 MOZ_DEB_TIMESTAMP=`date +"%a, %d  %b %Y %T %z"   2>&1` 
 AC_SUBST(MOZ_DEB_TIMESTAMP)
 
 dnl ========================================================
 dnl =
 dnl = Don't change the following two lines.  Doing so breaks:
 dnl =
--- a/mail/test/mozmill/Makefile.in
+++ b/mail/test/mozmill/Makefile.in
@@ -70,31 +70,18 @@ GARBAGE += automation.py
 
 # Copy the mozmill bits to $(_DEST_DIR)
 libs:: $(_HARNESS_FILES)
 	echo $(_HARNESS_FILES)
 	$(INSTALL) $(_HARNESS_FILES) $(_DEST_DIR)
 
 # Copy the mailnews and mail resources that we require.
 libs::
-	$(INSTALL) $(topsrcdir)/mailnews/test/resources/* $(_DEST_DIR)/resources
-	$(INSTALL) $(topsrcdir)/mailnews/test/fakeserver/* $(_DEST_DIR)/resources
-	$(INSTALL) $(topsrcdir)/mail/base/test/unit/resources/* $(_DEST_DIR)/resources
-
-# Copy MozMill and its dependencies over, and set up a virtualenv. The
-# virtualenv directory is outside because we don't want to bundle it up during
-# stage-package.
-VIRTUALENV_DIR = $(_DEST_DIR)/../mozmill-virtualenv
-mozmill-virtualenv: NSDISTMODE=copy
-mozmill-virtualenv:
-	$(DIR_INSTALL) $(topsrcdir)/mail/test/resources $(_DEST_DIR)
-	rm -rf $(VIRTUALENV_DIR) && \
-	mkdir $(VIRTUALENV_DIR) && \
-	$(PYTHON) $(_DEST_DIR)/resources/installmozmill.py $(VIRTUALENV_DIR)
-
-libs:: mozmill-virtualenv
+	$(INSTALL) $(topsrcdir)/mailnews/test/resources/* $(MOZDEPTH)/_tests/mozmill/resources
+	$(INSTALL) $(topsrcdir)/mailnews/test/fakeserver/* $(MOZDEPTH)/_tests/mozmill/resources
+	$(INSTALL) $(topsrcdir)/mail/base/test/unit/resources/* $(MOZDEPTH)/_tests/mozmill/resources
 
 PKG_STAGE = $(DIST)/test-package-stage
 
 stage-package:
 	$(NSINSTALL) -D $(PKG_STAGE)/mozmill/
 	@(cd $(topsrcdir)/mail/test/mozmill && tar $(TAR_CREATE_FLAGS) - *) | (cd $(PKG_STAGE)/mozmill/ && tar -xf -)
 	@(cd $(MOZDEPTH)/_tests/mozmill && tar $(TAR_CREATE_FLAGS) - *) | (cd $(PKG_STAGE)/mozmill/ && tar -xf -)
--- a/mail/test/mozmill/folder-display/test-message-commands.js
+++ b/mail/test/mozmill/folder-display/test-message-commands.js
@@ -477,13 +477,8 @@ function test_tag_keys_disabled_in_conte
   wait_for_content_tab_load(tab);
   assert_content_tab_has_url(tab, 'about:addons');
 
   // Make sure pressing the "1" key in a content tab doesn't tag a message
   check_tag_in_message(curMessage, tagArray[0], false);
   mc.keypress(null, "1", {});
   check_tag_in_message(curMessage, tagArray[0], false);
 }
-
-function teardownModule() {
-  // Make sure archiving is enabled at the end
-  enable_archiving(true);
-}
\ No newline at end of file
--- a/mail/test/mozmill/message-header/test-message-header.js
+++ b/mail/test/mozmill/message-header/test-message-header.js
@@ -44,44 +44,43 @@ var MODULE_NAME = 'test-message-header';
 var RELATIVE_ROOT = '../shared-modules';
 var MODULE_REQUIRES = ['folder-display-helpers', 'window-helpers',
                        'address-book-helpers'];
 
 var elib = {};
 Cu.import('resource://mozmill/modules/elementslib.js', elib);
 
 var folder;
-var gInterestingMessage;
 
 function setupModule(module) {
   let fdh = collector.getModule('folder-display-helpers');
   fdh.installInto(module);
   let wh = collector.getModule('window-helpers');
   wh.installInto(module);
   let abh = collector.getModule('address-book-helpers');
   abh.installInto(module);
 
   folder = create_folder("MessageWindowA");
 
   // create a message that has the interesting headers that commonly
   // show up in the message header pane for testing
-  gInterestingMessage = create_message({cc: msgGen.makeNamesAndAddresses(20), // YYY
-    subject: "This is a really, really, really, really, really, really, really, really, long subject.",
-    clobberHeaders: {
-      "Newsgroups": "alt.test",
-      "Reply-To": "J. Doe <j.doe@momo.invalid>",
-      "Content-Base": "http://example.com/",
-      "Bcc": "Richard Roe <richard.roe@momo.invalid>"
-    }});
+  let msg = create_message({cc: msgGen.makeNamesAndAddresses(20), // YYY
+                            subject: "This is a really, really, really, really, really, really, really, really, long subject.",
+                            clobberHeaders: {
+                              "Newsgroups": "alt.test",
+                              "Reply-To": "J. Doe <j.doe@momo.invalid>",
+                              "Content-Base": "http://example.com/",
+                              "Bcc": "Richard Roe <richard.roe@momo.invalid>"
+                            }});
 
-  add_message_to_folder(folder, gInterestingMessage);
+  add_message_to_folder(folder, msg);
 
   // create a message that has boring headers to be able to switch to and
   // back from, to force the more button to collapse again.
-  let msg = create_message();
+  msg = create_message();
   add_message_to_folder(folder, msg);
 }
 
 function test_add_tag_with_really_long_label() {
   be_in_folder(folder);
 
   // select the first message, which will display it
   let curMessage = select_click_row(0);
@@ -128,16 +127,161 @@ function test_add_tag_with_really_long_l
 
   // Remove the tag and put it back so that the a11y label gets regenerated
   // with the normal value rather than "taaaaaaaags"
   tagsLabel.value = oldTagsValue;
   mc.keypress(mc.eid("expandedHeadersNameColumn"), "1", {});
   mc.keypress(mc.eid("expandedHeadersNameColumn"), "1", {});
 }
 
+/**
+ * @param headerName used for pretty-printing in exceptions
+ * @param headerValueElement code to be eval()ed returning the DOM element
+ *        with the data.
+ * @param expectedName code to be eval()ed returning the expected value of
+ *                     nsIAccessible.name for the DOM element in question
+ * @param expectedRole the expected value for nsIAccessible.role
+ */
+let headersToTest = [
+{
+  headerName: "Subject",
+  headerValueElement: "mc.a('expandedsubjectBox', {class: 'headerValue'})",
+  expectedName: "mc.e('expandedsubjectLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.textContent",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Content-Base",
+  headerValueElement: "mc.a('expandedcontent-baseBox', {class: 'headerValue text-link headerValueUrl'})",
+  expectedName: "mc.e('expandedcontent-baseLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.textContent",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "From",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandedfromBox', {tagName: 'mail-emailaddress'})," +
+                      "'class', 'emailDisplayButton')",
+  expectedName: "mc.e('expandedfromLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.getAttribute('fullAddress')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "To",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandedtoBox', {tagName: 'mail-emailaddress'})," +
+                      "'class', 'emailDisplayButton')",
+  expectedName: "mc.e('expandedtoLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.getAttribute('fullAddress')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Cc",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandedccBox', {tagName: 'mail-emailaddress'})," +
+                      "'class', 'emailDisplayButton')",
+  expectedName: "mc.e('expandedccLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.getAttribute('fullAddress')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Bcc",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandedbccBox', {tagName: 'mail-emailaddress'})," +
+                      "'class', 'emailDisplayButton')",
+  expectedName: "mc.e('expandedbccLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.getAttribute('fullAddress')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Reply-To",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandedreply-toBox', {tagName: 'mail-emailaddress'})," +
+                      "'class', 'emailDisplayButton')",
+  expectedName: "mc.e('expandedreply-toLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.getAttribute('fullAddress')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Newsgroups",
+  headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
+                      "mc.a('expandednewsgroupsBox', {tagName: 'mail-newsgroup'})," +
+                      "'class', 'newsgrouplabel')",
+  expectedName: "mc.e('expandednewsgroupsLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.parentNode.parentNode.getAttribute('newsgroup')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
+},
+{
+  headerName: "Tags",
+  headerValueElement: "mc.a('expandedtagsBox', {class: 'tagvalue blc-FF0000'})",
+  expectedName: "mc.e('expandedtagsLabel').value.slice(0,-1) + ': ' + " +
+                "headerValueElement.getAttribute('value')",
+  expectedRole: Ci.nsIAccessibleRole.ROLE_LABEL
+}
+];
+
+// used to get the accessible object for a DOM node
+let gAccRetrieval = Cc["@mozilla.org/accessibleRetrieval;1"].
+                    getService(Ci.nsIAccessibleRetrieval);
+
+/**
+ * Use the information from aHeaderInfo to verify that screenreaders will
+ * do the right thing with the given message header.
+ *
+ * @param {Object} aHeaderInfo  Information about how to do the verification;
+ *                              See the comments above the headersToTest array
+ *                              for details.
+ */
+function verify_header_a11y(aHeaderInfo) {
+  // XXX Don't use eval here.
+  let headerValueElement = eval(aHeaderInfo.headerValueElement);
+
+  let headerAccessible = gAccRetrieval.getAccessibleFor(headerValueElement);
+  if (headerAccessible.role != aHeaderInfo.expectedRole) {
+    throw new Error("role for " + aHeaderInfo.headerName + " was " +
+                    headerAccessible.role + "; should have been " +
+                    aHeaderInfo.expectedRole);
+  }
+
+  // XXX Don't use eval here.
+  let expectedName = eval(aHeaderInfo.expectedName);
+  if (headerAccessible.name != expectedName) {
+    throw new Error("headerAccessible.name for " + aHeaderInfo.headerName +
+                    " was '" + headerAccessible.name + "'; expected '" +
+                    expectedName + "'");
+  }
+}
+
+/**
+ * Test the accessibility attributes of the various message headers.
+ *
+ * XXX This test used to be after test_more_button_with_many_recipients,
+ * however, there were some accessibility changes that it didn't seem to play
+ * nicely with, and the toggling of the "more" button on the cc field was
+ * causing this test to fail on the cc element. Tests with accessibilty
+ * hardware/software showed that the code was working fine. Therefore the test
+ * may be suspect.
+ */
+function test_a11y_attrs() {
+  // skip this test on platforms that don't support accessibility
+  if (!("nsIAccessibleRole" in Components.interfaces))
+    return;
+
+  be_in_folder(folder);
+
+  // select and open the first message
+  let curMessage = select_click_row(0);
+
+  // make sure it loads
+  wait_for_message_display_completion(mc);
+  assert_selected_and_displayed(mc, curMessage);
+
+  headersToTest.forEach(verify_header_a11y);
+}
+
 function test_more_button_with_many_recipients()
 {
   // Start on the interesting message.
   let curMessage = select_click_row(0);
 
   // make sure it loads
   wait_for_message_display_completion(mc);
   assert_selected_and_displayed(mc, curMessage);
@@ -733,152 +877,8 @@ function test_get_msg_button_customize_h
   if (originalServerCount != finalServerCount) {
     throw new Error("number of entries in Get Message Button popup menu after " +
                     "header toolbar customization " +
                     finalServerCount + " <> as before: " +
                     originalServerCount);
   }
 }
 
-// Some platforms (notably Mac) don't have a11y, so disable these tests there.
-if ("nsIAccessibleRole" in Ci) {
-  /**
-   * @param headerName used for pretty-printing in exceptions
-   * @param headerValueElement code to be eval()ed returning the DOM element
-   *        with the data.
-   * @param expectedName code to be eval()ed returning the expected value of
-   *                     nsIAccessible.name for the DOM element in question
-   * @param expectedRole the expected value for nsIAccessible.role
-   */
-  let headersToTest = [
-  {
-    headerName: "Subject",
-    headerValueElement: "mc.a('expandedsubjectBox', {class: 'headerValue'})",
-    expectedName: "mc.e('expandedsubjectLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.textContent",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Content-Base",
-    headerValueElement: "mc.a('expandedcontent-baseBox', {class: 'headerValue text-link headerValueUrl'})",
-    expectedName: "mc.e('expandedcontent-baseLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.textContent",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "From",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandedfromBox', {tagName: 'mail-emailaddress'})," +
-                        "'class', 'emailDisplayButton')",
-    expectedName: "mc.e('expandedfromLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.getAttribute('fullAddress')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "To",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandedtoBox', {tagName: 'mail-emailaddress'})," +
-                        "'class', 'emailDisplayButton')",
-    expectedName: "mc.e('expandedtoLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.getAttribute('fullAddress')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Cc",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandedccBox', {tagName: 'mail-emailaddress'})," +
-                        "'class', 'emailDisplayButton')",
-    expectedName: "mc.e('expandedccLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.getAttribute('fullAddress')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Bcc",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandedbccBox', {tagName: 'mail-emailaddress'})," +
-                        "'class', 'emailDisplayButton')",
-    expectedName: "mc.e('expandedbccLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.getAttribute('fullAddress')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Reply-To",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandedreply-toBox', {tagName: 'mail-emailaddress'})," +
-                        "'class', 'emailDisplayButton')",
-    expectedName: "mc.e('expandedreply-toLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.getAttribute('fullAddress')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Newsgroups",
-    headerValueElement: "mc.window.document.getAnonymousElementByAttribute(" +
-                        "mc.a('expandednewsgroupsBox', {tagName: 'mail-newsgroup'})," +
-                        "'class', 'newsgrouplabel')",
-    expectedName: "mc.e('expandednewsgroupsLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.parentNode.parentNode.getAttribute('newsgroup')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_ENTRY
-  },
-  {
-    headerName: "Tags",
-    headerValueElement: "mc.a('expandedtagsBox', {class: 'tagvalue blc-FF0000'})",
-    expectedName: "mc.e('expandedtagsLabel').value.slice(0,-1) + ': ' + " +
-                  "headerValueElement.getAttribute('value')",
-    expectedRole: Ci.nsIAccessibleRole.ROLE_LABEL
-  }
-  ];
-
-  // used to get the accessible object for a DOM node
-  let gAccRetrieval = Cc["@mozilla.org/accessibleRetrieval;1"].
-                      getService(Ci.nsIAccessibleRetrieval);
-
-  /**
-   * Use the information from aHeaderInfo to verify that screenreaders will
-   * do the right thing with the given message header.
-   *
-   * @param {Object} aHeaderInfo  Information about how to do the verification;
-   *                              See the comments above the headersToTest array
-   *                              for details.
-   */
-  function verify_header_a11y(aHeaderInfo) {
-    // XXX Don't use eval here.
-    let headerValueElement = eval(aHeaderInfo.headerValueElement);
-
-    let headerAccessible = gAccRetrieval.getAccessibleFor(headerValueElement)
-    if (headerAccessible.role != aHeaderInfo.expectedRole) {
-      throw new Error("role for " + aHeaderInfo.headerName + " was " +
-                      headerAccessible.role + "; should have been " +
-                      aHeaderInfo.expectedRole);
-    }
-
-    // XXX Don't use eval here.
-    let expectedName = eval(aHeaderInfo.expectedName);
-    if (headerAccessible.name != expectedName) {
-      throw new Error("headerAccessible.name for " + aHeaderInfo.headerName +
-                      " was '" + headerAccessible.name + "'; expected '" +
-                      expectedName + "'");
-    }
-  }
-
-  /**
-   * Test the accessibility attributes of the various message headers.
-   *
-   * XXX This test used to be after test_more_button_with_many_recipients,
-   * however, there were some accessibility changes that it didn't seem to play
-   * nicely with, and the toggling of the "more" button on the cc field was
-   * causing this test to fail on the cc element. Tests with accessibilty
-   * hardware/software showed that the code was working fine. Therefore the test
-   * may be suspect.
-   */
-  function test_a11y_attrs() {
-    be_in_folder(folder);
-
-    // select and open the interesting message
-    
-    let curMessage = select_click_row(mc.dbView.findIndexOfMsgHdr(
-                                        gInterestingMessage, false));
-
-    // make sure it loads
-    assert_selected_and_displayed(mc, curMessage);
-
-    headersToTest.forEach(verify_header_a11y);
-  }
-} // if ("nsIAccessibleRole" in Ci)
--- a/mail/test/mozmill/runtest.py
+++ b/mail/test/mozmill/runtest.py
@@ -197,19 +197,16 @@ class ThunderTestProfile(mozrunner.Thund
         We always put our profile in the same location.  We only clear it out
         when we are creating a new profile so that we can go in after the run
         and examine things for debugging or general interest.
         '''
         # create a clean directory
         if os.path.exists(PROFILE_DIR):
             shutil.rmtree(PROFILE_DIR, onerror=rmtree_onerror)
         os.makedirs(PROFILE_DIR)
-        print 'Using profile dir:', PROFILE_DIR
-        if not os.path.exists(PROFILE_DIR):
-            raise Exception('somehow failed to create profile dir!')
 
         if wrapper is not None and hasattr(wrapper, "on_profile_created"):
             # It's a little dangerous to allow on_profile_created access to the
             # profile object, because it isn't fully initalized yet
             wrapper.on_profile_created(PROFILE_DIR)
 
         if (wrapper is not None and hasattr(wrapper, "NO_ACCOUNTS")
             and wrapper.NO_ACCOUNTS):
@@ -290,105 +287,64 @@ class ThunderTestRunner(mozrunner.Thunde
             try:
                 if self.use_vnc_server and self.vnc_alive:
                     subprocess.check_call([self.VNC_SERVER_PATH,
                                            '-kill', ':99'])
             except Exception, ex:
                 print '!!! Exception during killing VNC server:', ex
 
 
-def monkeypatched_15_run_tests(self, tests, sleeptime=0):
-    frame = mozmill.jsbridge.JSObject(self.bridge,
-                "Components.utils.import('resource://mozmill/modules/frame.js')")
-    sleep(sleeptime)
-
-    # transfer persisted data
-    frame.persisted = self.persisted
-
-    if len(tests) == 1 and not os.path.isdir(tests[0]):
-        # tests[0] isn't necessarily an abspath'd path, so do that now
-        test = os.path.abspath(tests[0])
-        frame.runTestFile(test)
-    else:
-        # run the test files
-        for test_dir in self.test_dirs:
-            frame.runTestDirectory(test_dir)
-
-    # Give a second for any callbacks to finish.
-    sleep(1)
-if hasattr(mozmill.MozMill, 'find_tests'):
-    # Monkey-patch run_tests
-    mozmill.MozMill.old_run_tests = mozmill.MozMill.run_tests
-    mozmill.MozMill.run_tests = monkeypatched_15_run_tests
-
 class ThunderTestCLI(mozmill.CLI):
 
     profile_class = ThunderTestProfile
     runner_class = ThunderTestRunner
     parser_options = copy.copy(mozmill.CLI.parser_options)
     parser_options[('--symbols-path',)] = {"default": None, "dest": "symbols",
                                            "help": "The path to the symbol files from build_symbols"}
 
     def __init__(self, *args, **kwargs):
         global SYMBOLS_PATH, TEST_NAME
-
-        # mozmill 1.5.4 still explicitly hardcodes references to Firefox; in
-        # order to avoid missing out on initializer logic or needing to copy
-        # it, we monkeypatch mozmill's view of mozrunner.  (Keep in mind that
-        # the python module import process shallow copies dictionaries...)
-        mozmill.mozrunner.FirefoxRunner = self.runner_class
-        mozmill.mozrunner.FirefoxProfile = self.profile_class
-
-        # note: we previously hardcoded a JS bridge timeout of 300 seconds,
-        # but the default is now 60 seconds...
-        mozmill.CLI.__init__(self, *args, **kwargs)
-
+        # invoke jsbridge.CLI's constructor directly since we are explicitly
+        #  trying to replace mozmill's CLI constructor here (which hardcodes
+        #  the firefox runner and profile in 1.3 for no clear reason).
+        jsbridge.CLI.__init__(self, *args, **kwargs)
         SYMBOLS_PATH = self.options.symbols
-        if isinstance(self.options.test, basestring):
-            test_paths = [self.options.test]
-        else:
-            test_paths = self.options.test
-        TEST_NAME = ', '.join([os.path.basename(t) for t in test_paths])
-
-        test_dirs = self.test_dirs = []
-        for test_file in test_paths:
-            test_file = os.path.abspath(test_file)
-            if not os.path.isdir(test_file):
-                test_file = os.path.dirname(test_file)
-            if not test_file in test_dirs:
-                test_dirs.append(test_file)
-
-        # if we are monkeypatching, give it the test directories.
-        if hasattr(self.mozmill, 'find_tests'):
-            self.mozmill.test_dirs = test_dirs
+        TEST_NAME = os.path.basename(self.options.test)
 
         self._load_wrapper()
 
+        self.mozmill = self.mozmill_class(runner_class=self.runner_class,
+                                          profile_class=self.profile_class,
+                                          jsbridge_port=int(self.options.port),
+                                          jsbridge_timeout=300)
+
+        self.mozmill.add_global_listener(mozmill.LoggerListener())
+
     def _load_wrapper(self):
         global wrapper
         """
         Load the wrapper module if it is present in the test directory.
         """
-        if len(self.test_dirs) > 1:
-            raise Exception("Wrapper semantics require only a single test dir")
-        testdir = self.test_dirs[0]
+        if os.path.isdir(self.options.test):
+            testdir = self.options.test
+        else:
+            testdir = os.path.dirname(self.options.test)
 
         try:
             (fd, path, desc) = imp.find_module(WRAPPER_MODULE_NAME, [testdir])
         except ImportError:
             # No wrapper module, which is fine.
             pass
         else:
             try:
                 wrapper = imp.load_module(WRAPPER_MODULE_NAME, fd, path, desc)
             finally:
                 if fd is not None:
                     fd.close()
 
-
 TEST_RESULTS = []
 # Versions of MozMill prior to 1.5 did not output test-pass /
 # TEST-UNEXPECTED-FAIL. Since 1.5 happened this gets output, so we only want
 # a summary at the end to make it easy for developers.
 def logEndTest(obj):
     # If we've got a string here, we know we're later than 1.5, and we can just
     # display a summary at the end as 1.5 will do TEST-UNEXPECTED-FAIL for us.
     if isinstance(obj, str):
@@ -400,25 +356,17 @@ mozmill.LoggerListener.cases['mozmill.en
 # We now send extended meta-data about failures.  We do not want the entire
 # message dumped with this extra data, so clobber the default mozmill.fail
 # with one that wraps it and only tells it the exception message rather than
 # the whole JSON blob.
 ORIGINAL_FAILURE_LOGGER = mozmill.LoggerListener.cases['mozmill.fail']
 def logFailure(obj):
     if isinstance(obj, basestring):
         obj = json.loads(obj)
-    if 'exception' in obj:
-        objex = obj['exception']
-        if 'message' in objex:
-            report_as = objex['message']
-        else:
-            report_as = 'Empty object thrown as an exception somehow'
-    else:
-        report_as = 'No exception provided'
-    ORIGINAL_FAILURE_LOGGER(report_as)
+    ORIGINAL_FAILURE_LOGGER(obj["exception"]["message"])
 mozmill.LoggerListener.cases['mozmill.fail'] = logFailure
 
 
 def prettifyFilename(path, tail_segs_desired=1):
     parts = path.split('/')
     return '/'.join(parts[-tail_segs_desired:])
 
 def prettyPrintException(e):
@@ -456,22 +404,18 @@ import pprint, atexit
 @atexit.register
 def prettyPrintResults():
     for result in TEST_RESULTS:
         #pprint.pprint(result)
         testOrSummary = 'TEST'
         if 'summary' in result:
             testOrSummary = 'SUMMARY'
         if len(result['fails']) == 0:
-            if result.get('skipped', False):
-                kind = 'SKIP'
-            else:
-                kind = 'PASS'
             if result['name'] not in TEST_BLACKLIST:
-                print '%s-%s | %s' % (testOrSummary, kind, result['name'])
+                print '%s-PASS | %s' % (testOrSummary, result['name'])
         else:
             print '%s-UNEXPECTED-FAIL | %s | %s' % (testOrSummary, prettifyFilename(result['filename']), result['name'])
         for failure in result['fails']:
             if 'exception' in failure:
                 prettyPrintException(failure['exception'])
 
 @atexit.register
 def dumpRichResults():
--- a/mail/test/mozmill/runtestlist.py
+++ b/mail/test/mozmill/runtestlist.py
@@ -98,17 +98,17 @@ totalDirectories = 0
 f = open(options.list, 'rt')
 for directory in f:
     log.info("INFO | (runtestlist.py) | Running directory: %s",
              directory.rstrip())
     if options.dir != "":
         testDirectory = os.path.join(options.dir, directory.rstrip())
     else:
         testDirectory = directory.rstrip()
-    args = [sys.executable, "runtest.py", "-t", testDirectory,
+    args = ["python", "runtest.py", "-t", testDirectory,
             "--binary", options.binary, "--symbols-path", options.symbols]
     print args
     outputPipe = subprocess.PIPE
 
     proc = subprocess.Popen(args, cwd=SCRIPT_DIRECTORY, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
 
     testErrors = 0
     testPasses = 0
--- a/mail/test/mozmill/shared-modules/test-folder-display-helpers.js
+++ b/mail/test/mozmill/shared-modules/test-folder-display-helpers.js
@@ -192,37 +192,21 @@ function setupModule() {
       testHelperModule.mark_sub_test_start(obj.name);
     });
   // Listen for the fail event so that we can annotate the failure object
   //  with additional metadata.  This works out because we are directly handed
   //  a reference to the object that will be provided to the jsbridge and we
   //  can mutate it.  (The jsbridge is a global listener and so is guaranteed
   //  to be invoked after our specific named listener.)
   frame.events.addListener("fail", function(obj) {
-      // normalize nsIExceptions so they look like JS exceptions...
-      rawex = obj.exception;
-      if (obj.exception != null &&
-          (obj.exception instanceof Ci.nsIException)) {
-        obj.exception = {
-          message: "nsIException: " + rawex.message + " (" + rawex.result + ")",
-          fileName: rawex.filename,
-          lineNumber: rawex.lineNumber,
-          name: rawex.name,
-          result: rawex.result,
-          stack: "",
-        };
-      }
-
       // generate the failure notification now so it shows up in the event log
       //  bucket for presentation purposes.
       testHelperModule._xpcshellLogger.info(
         testHelperModule._testLoggerActiveContext,
-        new testHelperModule._Failure(
-          obj.exception ? obj.exception.message : "No Exception!",
-          rawex));
+        new testHelperModule._Failure(obj.exception.message, obj.exception));
 
       try {
         obj.failureContext = {
           preEvents: bucketAppender.getPreviousBucketEvents(10000),
           events: bucketAppender.getBucketEvents(),
           windows: windowHelper.captureWindowStatesForErrorReporting(
                      testHelperModule._normalize_for_json),
         };
--- a/mail/test/mozmill/shared-modules/test-migration-helpers.js
+++ b/mail/test/mozmill/shared-modules/test-migration-helpers.js
@@ -124,15 +124,15 @@ function close_migration_assistant(fc) {
  *     contentFrame displaying the appropriate pane.
  */
 function get_subpage(fc) {
   let contentWindow = fc.e("contentFrame").contentWindow;
   // XXX this is not my fault, but I'm not going to fix it.  just make it less
   // broken:
 
   // Lie to mozmill to convince it to not explode because these frames never
-  // get a mozmillDocumentLoaded attribute.
-  contentWindow.mozmillDocumentLoaded = true;
+  // get a documentLoaded attribute.
+  contentWindow.documentLoaded = true;
   // And sleep so the page has a chance to load
   controller.sleep(1000);
   let aController = new controller.MozMillController(contentWindow);
   return wh.augment_controller(aController);
 }
deleted file mode 100644
--- a/mail/test/resources/ManifestDestiny/PKG-INFO
+++ /dev/null
@@ -1,189 +0,0 @@
-Metadata-Version: 1.0
-Name: ManifestDestiny
-Version: 0.2.2
-Summary: universal reader for manifests
-Home-page: https://wiki.mozilla.org/Auto-tools/Projects/ManifestDestiny
-Author: Jeff Hammel
-Author-email: jhammel@mozilla.com
-License: MPL
-Description: ManifestDestiny
-        ===============
-        
-        Universal manifests for Mozilla test harnesses
-        
-        
-        What is ManifestDestiny?
-        ------------------------
-        
-        What ManifestDestiny gives you is:
-        
-        * manifests are (ordered) lists of tests
-        * tests may have an arbitrary number of key, value pairs
-        * the parser returns an ordered list of test data structures, which
-          are just dicts with some keys.  For example, a test with no
-          user-specified metadata looks like this::
-        
-          [{'path':
-            '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests/testToolbar/testBackForwardButtons.js',
-            'name': 'testToolbar/testBackForwardButtons.js', 'here':
-            '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests',
-            'manifest': '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests',}]
-        
-        The keys displayed here (path, name, here, and manifest) are reserved
-        words for ManifestDestiny and any consuming APIs.
-        
-        
-        Manifest Format
-        ---------------
-        
-        Manifests are .ini file with the section names denoting the path
-        relative to the manifest::
-        
-         [foo.js]
-         [bar.js]
-         [fleem.js]
-        
-        The sections are read in order. In addition, tests may include
-        arbitrary key, value metadata to be used by the harness.  You can also
-        have a ``[DEFAULT]`` section that will give key, value pairs that will
-        be inherited by each test unless overridden::
-        
-         [DEFAULT]
-         type = restart
-        
-         [lilies.js]
-         color = white
-        
-         [daffodils.js]
-         color = yellow
-         type = other
-         # override type from DEFAULT
-        
-         [roses.js]
-         color = red
-        
-        You can also include other manifests::
-        
-         [include:subdir/anothermanifest.ini]
-        
-        
-        Data
-        ----
-        
-        Manifest Destiny gives tests as a list of dictionary (in python
-        terms). 
-        
-        * path: full path to the test
-        * name: short name of the test; this is the (usually) relative path
-          specified in the section name
-        * here: the parent directory of the manifest
-        * manifest: the path to the manifest containing the test
-        
-        This data corresponds to a one-line manifest::
-        
-         [testToolbar/testBackForwardButtons.js]
-        
-        If additional key, values were specified, they would be in this dict
-        as well.
-        
-        Outside of the reserved keys, the remaining key, values
-        are up to convention to use.  There is a (currently very minimal)
-        generic integration layer in ManifestDestiny for use of all tests.
-        For instance, if the 'disabled' key is present, you can get the set of
-        tests without disabled (various other queries are doable as well).
-        
-        Since the system is convention-based, the harnesses may do whatever
-        they want with the data.  They may ignore it completely, they may use
-        the provided integration layer, or they may provide their own
-        integration layer.  This should allow whatever sort of logic they
-        want.  For instance, if in yourtestharness you wanted to run only on
-        mondays for a certain class of tests::
-        
-         tests = []
-         for test in manifests.tests:
-             if 'runOnDay' in test:
-                if calendar.day_name[calendar.weekday(*datetime.datetime.now().timetuple()[:3])].lower() == test['runOnDay'].lower():
-                    tests.append(test)
-             else:
-                tests.append(test)
-        
-        To recap:
-        * the manifests allow you to specify test data
-        * the parser gives you this data
-        * you can use it however you want or process it further as you need
-        
-        Tests are denoted by sections in an .ini file (see
-        http://hg.mozilla.org/automation/ManifestDestiny/file/tip/manifestdestiny/tests/mozmill-example.ini). 
-        
-        Additional manifest files may be included with a [include:] directive::
-        
-         [include:path-to-additional-file.manifest]
-        
-        The path to included files is relative to the current manifest.
-        
-        The ``[DEFAULT]`` section contains variables that all tests inherit from.
-        
-        Included files will inherit the top-level variables but may override
-        in their own ``[DEFAULT]`` section.
-        
-        
-        Creating Manifests
-        ------------------
-        
-        ManifestDestiny comes with a console script, ``manifestparser create``, that
-        may be used to create a seed manifest structure from a directory of
-        files.  Run ``manifestparser help create`` for usage information.
-        
-        
-        Copying Manifests
-        -----------------
-        
-        To copy tests and manifests from a source::
-        
-         manifestparser [options] copy from_manifest to_directory -tag1 -tag2 --key1=value1 key2=value2 ...
-        
-        
-        Upating Tests
-        -------------
-        
-        To update the tests associated with with a manifest from a source
-        directory::
-        
-         manifestparser [options] update manifest from_directory -tag1 -tag2 --key1=value1 --key2=value2 ...
-        
-        
-        Tests
-        -----
-        
-        ManifestDestiny includes a suite of tests:
-        
-        http://hg.mozilla.org/automation/ManifestDestiny/file/tip/manifestdestiny/tests
-        
-        ``test_manifest.txt`` is a doctest that may be helpful in figuring out
-        how to use the API.  Tests are run via ``python test.py``.
-        
-        
-        CLI
-        ---
-        
-        Run ``manifestparser help`` for usage information.
-        
-        To create a manifest from a set of directories::
-        
-         manifestparser [options] create directory <directory> <...> [create-options]
-        
-        To output a manifest of tests::
-        
-         manifestparser [options] write manifest <manifest> <...> -tag1 -tag2 --key1=value1 --key2=value2 ...
-        
-        To copy tests and manifests from a source::
-        
-         manifestparser [options] copy from_manifest to_manifest -tag1 -tag2 --key1=value1 key2=value2 ...
-        
-        To update the tests associated with with a manifest from a source
-        directory::
-        
-         manifestparser [options] update manifest from_directory -tag1 -tag2 --key1=value1 --key2=value2 ...
-        
-Keywords: mozilla manifests
-Platform: UNKNOWN
deleted file mode 100644
--- a/mail/test/resources/ManifestDestiny/README.txt
+++ /dev/null
@@ -1,178 +0,0 @@
-ManifestDestiny
-===============
-
-Universal manifests for Mozilla test harnesses
-
-
-What is ManifestDestiny?
-------------------------
-
-What ManifestDestiny gives you is:
-
-* manifests are (ordered) lists of tests
-* tests may have an arbitrary number of key, value pairs
-* the parser returns an ordered list of test data structures, which
-  are just dicts with some keys.  For example, a test with no
-  user-specified metadata looks like this::
-
-  [{'path':
-    '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests/testToolbar/testBackForwardButtons.js',
-    'name': 'testToolbar/testBackForwardButtons.js', 'here':
-    '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests',
-    'manifest': '/home/jhammel/mozmill/src/ManifestDestiny/manifestdestiny/tests',}]
-
-The keys displayed here (path, name, here, and manifest) are reserved
-words for ManifestDestiny and any consuming APIs.
-
-
-Manifest Format
----------------
-
-Manifests are .ini file with the section names denoting the path
-relative to the manifest::
-
- [foo.js]
- [bar.js]
- [fleem.js]
-
-The sections are read in order. In addition, tests may include
-arbitrary key, value metadata to be used by the harness.  You can also
-have a ``[DEFAULT]`` section that will give key, value pairs that will
-be inherited by each test unless overridden::
-
- [DEFAULT]
- type = restart
-
- [lilies.js]
- color = white
-
- [daffodils.js]
- color = yellow
- type = other
- # override type from DEFAULT
-
- [roses.js]
- color = red
-
-You can also include other manifests::
-
- [include:subdir/anothermanifest.ini]
-
-
-Data
-----
-
-Manifest Destiny gives tests as a list of dictionary (in python
-terms). 
-
-* path: full path to the test
-* name: short name of the test; this is the (usually) relative path
-  specified in the section name
-* here: the parent directory of the manifest
-* manifest: the path to the manifest containing the test
-
-This data corresponds to a one-line manifest::
-
- [testToolbar/testBackForwardButtons.js]
-
-If additional key, values were specified, they would be in this dict
-as well.
-
-Outside of the reserved keys, the remaining key, values
-are up to convention to use.  There is a (currently very minimal)
-generic integration layer in ManifestDestiny for use of all tests.
-For instance, if the 'disabled' key is present, you can get the set of
-tests without disabled (various other queries are doable as well).
-
-Since the system is convention-based, the harnesses may do whatever
-they want with the data.  They may ignore it completely, they may use
-the provided integration layer, or they may provide their own
-integration layer.  This should allow whatever sort of logic they
-want.  For instance, if in yourtestharness you wanted to run only on
-mondays for a certain class of tests::
-
- tests = []
- for test in manifests.tests:
-     if 'runOnDay' in test:
-        if calendar.day_name[calendar.weekday(*datetime.datetime.now().timetuple()[:3])].lower() == test['runOnDay'].lower():
-            tests.append(test)
-     else:
-        tests.append(test)
-
-To recap:
-* the manifests allow you to specify test data
-* the parser gives you this data
-* you can use it however you want or process it further as you need
-
-Tests are denoted by sections in an .ini file (see
-http://hg.mozilla.org/automation/ManifestDestiny/file/tip/manifestdestiny/tests/mozmill-example.ini). 
-
-Additional manifest files may be included with a [include:] directive::
-
- [include:path-to-additional-file.manifest]
-
-The path to included files is relative to the current manifest.
-
-The ``[DEFAULT]`` section contains variables that all tests inherit from.
-
-Included files will inherit the top-level variables but may override
-in their own ``[DEFAULT]`` section.
-
-
-Creating Manifests
-------------------
-
-ManifestDestiny comes with a console script, ``manifestparser create``, that
-may be used to create a seed manifest structure from a directory of
-files.  Run ``manifestparser help create`` for usage information.
-
-
-Copying Manifests
------------------
-
-To copy tests and manifests from a source::
-
- manifestparser [options] copy from_manifest to_directory -tag1 -tag2 --key1=value1 key2=value2 ...
-
-
-Upating Tests
--------------
-
-To update the tests associated with with a manifest from a source
-directory::
-
- manifestparser [options] update manifest from_directory -tag1 -tag2 --key1=value1 --key2=value2 ...
-
-
-Tests
------
-
-ManifestDestiny includes a suite of tests:
-
-http://hg.mozilla.org/automation/ManifestDestiny/file/tip/manifestdestiny/tests
-
-``test_manifest.txt`` is a doctest that may be helpful in figuring out
-how to use the API.  Tests are run via ``python test.py``.
-
-
-CLI
----
-
-Run ``manifestparser help`` for usage information.
-
-To create a manifest from a set of directories::
-
- manifestparser [options] create directory <directory> <...> [create-options]
-
-To output a manifest of tests::
-
- manifestparser [options] write manifest <manifest> <...> -tag1 -tag2 --key1=value1 --key2=value2 ...
-
-To copy tests and manifests from a source::
-
- manifestparser [options] copy from_manifest to_manifest -tag1 -tag2 --key1=value1 key2=value2 ...
-
-To update the tests associated with with a manifest from a source
-directory::
-
- manifestparser [options] update manifest from_directory -tag1 -tag2 --key1=value1 --key2=value2 ...
deleted file mode 100644
--- a/mail/test/resources/ManifestDestiny/manifestparser.py
+++ /dev/null
@@ -1,776 +0,0 @@
-#!/usr/bin/env python
-
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-# 
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-# 
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-# 
-# The Original Code is mozilla.org code.
-# 
-# The Initial Developer of the Original Code is
-# Mozilla.org.
-# Portions created by the Initial Developer are Copyright (C) 2010
-# the Initial Developer. All Rights Reserved.
-# 
-# Contributor(s):
-#     Jeff Hammel <jhammel@mozilla.com>     (Original author)
-# 
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-# 
-# ***** END LICENSE BLOCK *****
-
-"""
-Mozilla universal manifest parser
-"""
-
-# this file lives at
-# http://hg.mozilla.org/automation/ManifestDestiny/raw-file/tip/manifestparser.py
-
-__all__ = ['ManifestParser', 'TestManifest', 'convert']
-
-import os
-import shutil
-import sys
-from fnmatch import fnmatch
-from optparse import OptionParser
-
-version = '0.2.2' # package version
-try:
-    from setuptools import setup
-except ImportError:
-    setup = None
-
-def read_ini(fp, variables=None, default='DEFAULT',
-             comments=';#', separators=('=', ':'),
-             strict=True):
-    """
-    read an .ini file and return a list of [(section, values)]
-    - fp : file pointer or path to read
-    - variables : default set of variables
-    - default : name of the section for the default section
-    - comments : characters that if they start a line denote a comment
-    - separators : strings that denote key, value separation in order
-    - strict : whether to be strict about parsing
-    """
-
-    if variables is None:
-        variables = {}
-
-    if isinstance(fp, basestring):
-        fp = file(fp)
-
-    sections = []
-    key = value = None
-    section_names = set([])
-
-    # read the lines
-    for line in fp.readlines():
-
-        stripped = line.strip()
-
-        # ignore blank lines
-        if not stripped:
-            # reset key and value to avoid continuation lines
-            key = value = None
-            continue
-
-        # ignore comment lines
-        if stripped[0] in comments:
-            continue
-
-        # check for a new section
-        if len(stripped) > 2 and stripped[0] == '[' and stripped[-1] == ']':
-            section = stripped[1:-1].strip()
-            key = value = None
-
-            # deal with DEFAULT section
-            if section.lower() == default.lower():
-                if strict:
-                    assert default not in section_names
-                section_names.add(default)
-                current_section = variables
-                continue
-
-            if strict:
-                # make sure this section doesn't already exist
-                assert section not in section_names
-
-            section_names.add(section)
-            current_section = {}
-            sections.append((section, current_section))
-            continue
-
-        # if there aren't any sections yet, something bad happen
-        if not section_names:
-            raise Exception('No sections yet :(')
-
-        # (key, value) pair
-        for separator in separators:
-            if separator in stripped:
-                key, value = stripped.split(separator, 1)
-                key = key.strip()
-                value = value.strip()
-
-                if strict:
-                    # make sure this key isn't already in the section or empty
-                    assert key
-                    if current_section is not variables:
-                        assert key not in current_section
-
-                current_section[key] = value
-                break
-        else:
-            # continuation line ?
-            if line[0].isspace() and key:
-                value = '%s%s%s' % (value, os.linesep, stripped)
-                current_section[key] = value
-            else:
-                # something bad happen!
-                raise Exception("Not sure what you're trying to do")
-
-    # interpret the variables
-    def interpret_variables(global_dict, local_dict):
-        variables = global_dict.copy()
-        variables.update(local_dict)
-        return variables
-
-    sections = [(i, interpret_variables(variables, j)) for i, j in sections]
-    return sections
-
-
-### objects for parsing manifests
-
-class ManifestParser(object):
-    """read .ini manifests"""
-
-    ### methods for reading manifests
-
-    def __init__(self, manifests=(), defaults=None, strict=True):
-        self._defaults = defaults or {}
-        self.tests = []
-        self.strict = strict
-        self.rootdir = None
-        if manifests:
-            self.read(*manifests)
-
-    def read(self, *filenames, **defaults):
-
-        # ensure all files exist
-        missing = [ filename for filename in filenames
-                    if not os.path.exists(filename) ]
-        if missing:
-            raise IOError('Missing files: %s' % ', '.join(missing))
-
-        # process each file
-        for filename in filenames:
-
-            # set the per file defaults
-            defaults = defaults.copy() or self._defaults.copy()
-            here = os.path.dirname(os.path.abspath(filename))
-            defaults['here'] = here
-
-            if self.rootdir is None:
-                # set the root directory
-                # == the directory of the first manifest given
-                self.rootdir = here
-
-            # read the configuration
-            sections = read_ini(filename, variables=defaults)
-
-            # get the tests
-            for section, data in sections:
-
-                # a file to include
-                # TODO: keep track of structure:
-                # self.manifests = {'manifest.ini': 'relative/path.ini'}
-                if section.startswith('include:'):
-                    include_file = section.split('include:', 1)[-1]
-                    include_file = os.path.join(here, include_file)
-                    if not os.path.exists(include_file):
-                        if strict:
-                            raise IOError("File '%s' does not exist" % include_file)
-                        else:
-                            continue
-                    include_defaults = data.copy()
-                    self.read(include_file, **include_defaults)
-                    continue
-
-                # otherwise a test
-                test = data
-                test['name'] = section
-                test['path'] = os.path.join(here, section)
-                test['manifest'] = os.path.abspath(filename)
-                self.tests.append(test)
-
-    ### methods for querying manifests
-
-    def query(self, *checks):
-        """
-        general query function for tests
-        - checks : callable conditions to test if the test fulfills the query
-        """
-        retval = []
-        for test in self.tests:
-            for check in checks:
-                if not check(test):
-                    break
-            else:
-                retval.append(test)
-        return retval
-
-    def get(self, _key=None, inverse=False, tags=None, **kwargs):
-        # TODO: pass a dict instead of kwargs since you might hav
-        # e.g. 'inverse' as a key in the dict
-
-        # TODO: tags should just be part of kwargs with None values
-        # (None == any is kinda weird, but probably still better)
-
-        # fix up tags
-        if tags:
-            tags = set(tags)
-        else:
-            tags = set()
-
-        # make some check functions
-        if inverse:
-            has_tags = lambda test: tags.isdisjoint(test.keys())
-            def dict_query(test):
-                for key, value in kwargs.items():
-                    if test.get(key) == value:
-                        return False
-                return True
-        else:
-            has_tags = lambda test: tags.issubset(test.keys())
-            def dict_query(test):
-                for key, value in kwargs.items():
-                    if test.get(key) != value:
-                        return False
-                return True
-
-        # query the tests
-        tests = self.query(has_tags, dict_query)
-
-        # if a key is given, return only a list of that key
-        # useful for keys like 'name' or 'path'
-        if _key:
-            return [test[_key] for test in tests]
-
-        # return the tests
-        return tests
-
-    def missing(self, tests=None):
-        """return list of tests that do not exist on the filesystem"""
-        if tests is None:
-            tests = self.tests
-        return [test for test in tests
-                if not os.path.exists(test['path'])]
-
-    def manifests(self, tests=None):
-        """
-        return manifests in order in which they appear in the tests
-        """
-        if tests is None:
-            tests = self.tests
-        manifests = []
-        for test in tests:
-            manifest = test.get('manifest')
-            if not manifest:
-                continue
-            if manifest not in manifests:
-                manifests.append(manifest)
-        return manifests
-
-
-    ### methods for outputting from manifests
-
-    def write(self, fp=sys.stdout, rootdir=None,
-              global_tags=None, global_kwargs=None,
-              local_tags=None, local_kwargs=None):
-        """
-        write a manifest given a query
-        global and local options will be munged to do the query
-        globals will be written to the top of the file
-        locals (if given) will be written per test
-        """
-
-        # root directory
-        if rootdir is None:
-            rootdir = self.rootdir
-
-        # sanitize input
-        global_tags = global_tags or set()
-        local_tags = local_tags or set()
-        global_kwargs = global_kwargs or {}
-        local_kwargs = local_kwargs or {}
-        
-        # create the query
-        tags = set([])
-        tags.update(global_tags)
-        tags.update(local_tags)
-        kwargs = {}
-        kwargs.update(global_kwargs)
-        kwargs.update(local_kwargs)
-
-        # get matching tests
-        tests = self.get(tags=tags, **kwargs)
-
-        # print the .ini manifest
-        if global_tags or global_kwargs:
-            print >> fp, '[DEFAULT]'
-            for tag in global_tags:
-                print >> fp, '%s =' % tag
-            for key, value in global_kwargs.items():
-                print >> fp, '%s = %s' % (key, value)
-            print >> fp
-
-        for test in tests:
-            test = test.copy() # don't overwrite
-
-            path = test['name']
-            if not os.path.isabs(path):
-                path = os.path.relpath(test['path'], self.rootdir)
-            print >> fp, '[%s]' % path
-          
-            # reserved keywords:
-            reserved = ['path', 'name', 'here', 'manifest']
-            for key in sorted(test.keys()):
-                if key in reserved:
-                    continue
-                if key in global_kwargs:
-                    continue
-                if key in global_tags and not test[key]:
-                    continue
-                print >> fp, '%s = %s' % (key, test[key])
-            print >> fp
-
-    def copy(self, directory, rootdir=None, *tags, **kwargs):
-        """
-        copy the manifests and associated tests
-        - directory : directory to copy to
-        - rootdir : root directory to copy to (if not given from manifests)
-        - tags : keywords the tests must have
-        - kwargs : key, values the tests must match
-        """
-        # XXX note that copy does *not* filter the tests out of the
-        # resulting manifest; it just stupidly copies them over.
-        # ideally, it would reread the manifests and filter out the
-        # tests that don't match *tags and **kwargs
-        
-        # destination
-        if not os.path.exists(directory):
-            os.path.makedirs(directory)
-        else:
-            # sanity check
-            assert os.path.isdir(directory)
-
-        # tests to copy
-        tests = self.get(tags=tags, **kwargs)
-        if not tests:
-            return # nothing to do!
-
-        # root directory
-        if rootdir is None:
-            rootdir = self.rootdir
-
-        # copy the manifests + tests
-        manifests = [os.path.relpath(manifest, rootdir) for manifest in self.manifests()]
-        for manifest in manifests:
-            destination = os.path.join(directory, manifest)
-            dirname = os.path.dirname(destination)
-            if not os.path.exists(dirname):
-                os.makedirs(dirname)
-            else:
-                # sanity check
-                assert os.path.isdir(dirname)
-            shutil.copy(os.path.join(rootdir, manifest), destination)
-        for test in tests:
-            if os.path.isabs(test['name']):
-                continue
-            source = test['path']
-            if not os.path.exists(source):
-                print >> sys.stderr, "Missing test: '%s' does not exist!" % source
-                continue
-                # TODO: should err on strict
-            destination = os.path.join(directory, os.path.relpath(test['path'], rootdir))
-            shutil.copy(source, destination)
-            # TODO: ensure that all of the tests are below the from_dir
-
-    def update(self, from_dir, rootdir=None, *tags, **kwargs):
-        """
-        update the tests as listed in a manifest from a directory
-        - from_dir : directory where the tests live
-        - rootdir : root directory to copy to (if not given from manifests)
-        - tags : keys the tests must have
-        - kwargs : key, values the tests must match
-        """
-    
-        # get the tests
-        tests = self.get(tags=tags, **kwargs)
-
-        # get the root directory
-        if not rootdir:
-            rootdir = self.rootdir
-
-        # copy them!
-        for test in tests:
-            if not os.path.isabs(test['name']):
-                relpath = os.path.relpath(test['path'], rootdir)
-                source = os.path.join(from_dir, relpath)
-                if not os.path.exists(source):
-                    # TODO err on strict
-                    print >> sys.stderr, "Missing test: '%s'; skipping" % test['name']
-                    continue
-                destination = os.path.join(rootdir, relpath)
-                shutil.copy(source, destination)
-
-
-class TestManifest(ManifestParser):
-    """
-    apply logic to manifests;  this is your integration layer :)
-    specific harnesses may subclass from this if they need more logic
-    """
-
-    def active_tests(self):
-
-        # ignore disabled tests
-        tests = self.get(inverse=True, tags=['disabled'])
-
-        # TODO: could filter out by current platform, existence, etc
-        return tests
-
-    def test_paths(self):
-        return [test['path'] for test in self.active_tests()]
-
-
-### utility function(s); probably belongs elsewhere
-
-def convert(directories, pattern=None, ignore=(), write=None):
-    """
-    convert directories to a simple manifest
-    """
-
-    retval = []
-    include = []
-    for directory in directories:
-        for dirpath, dirnames, filenames in os.walk(directory):
-
-            # filter out directory names
-            dirnames = [ i for i in dirnames if i not in ignore ]
-            dirnames.sort()
-
-            # reference only the subdirectory
-            _dirpath = dirpath
-            dirpath = dirpath.split(directory, 1)[-1].strip('/')
-
-            if dirpath.split(os.path.sep)[0] in ignore:
-                continue
-
-            # filter by glob
-            if pattern:
-                filenames = [filename for filename in filenames
-                             if fnmatch(filename, pattern)]
-
-            filenames.sort()
-
-            # write a manifest for each directory
-            if write and (dirnames or filenames):
-                manifest = file(os.path.join(_dirpath, write), 'w')
-                for dirname in dirnames:
-                    print >> manifest, '[include:%s]' % os.path.join(dirname, write)
-                for filename in filenames:
-                    print >> manifest, '[%s]' % filename
-                manifest.close()
-
-            # add to the list
-            retval.extend([os.path.join(dirpath, filename)
-                           for filename in filenames])
-
-    if write:
-        return # the manifests have already been written!
-  
-    retval.sort()
-    retval = ['[%s]' % filename for filename in retval]
-    return '\n'.join(retval)
-
-### command line attributes
-
-class ParserError(Exception):
-  """error for exceptions while parsing the command line"""
-
-def parse_args(_args):
-    """
-    parse and return:
-    --keys=value (or --key value)
-    -tags
-    args
-    """
-
-
-    # return values
-    _dict = {}
-    tags = []
-    args = []
-
-    # parse the arguments
-    key = None
-    for arg in _args:
-        if arg.startswith('---'):
-            raise ParserError("arguments should start with '-' or '--' only")
-        elif arg.startswith('--'):
-            if key:
-                raise ParserError("Key %s still open" % key)
-            key = arg[2:]
-            if '=' in key:
-                key, value = key.split('=', 1)
-                _dict[key] = value
-                key = None
-                continue
-        elif arg.startswith('-'):
-            if key:
-                raise ParserError("Key %s still open" % key)
-            tags.append(arg[1:])
-            continue
-        else:
-            if key:
-                _dict[key] = arg
-                continue
-            args.append(arg)
-
-    # return values
-    return (_dict, tags, args)
-
-
-### classes for subcommands
-
-class CLICommand(object):
-    usage = '%prog [options] command'
-    def __init__(self, parser):
-      self._parser = parser # master parser
-    def parser(self):
-      return OptionParser(usage=self.usage, description=self.__doc__,
-                          add_help_option=False)
-
-class Copy(CLICommand):
-    usage = '%prog [options] copy manifest directory -tag1 -tag2 --key1=value1 --key2=value2 ...'
-    def __call__(self, options, args):
-      # parse the arguments
-      try:
-        kwargs, tags, args = parse_args(args)
-      except ParserError, e:
-        self._parser.error(e.message)
-
-      # make sure we have some manifests, otherwise it will
-      # be quite boring
-      if not len(args) == 2:
-        HelpCLI(self._parser)(options, ['copy'])
-        return
-
-      # read the manifests
-      # TODO: should probably ensure these exist here
-      manifests = ManifestParser()
-      manifests.read(args[0])
-
-      # print the resultant query
-      manifests.copy(args[1], None, *tags, **kwargs)
-
-
-class CreateCLI(CLICommand):
-    """
-    create a manifest from a list of directories
-    """
-    usage = '%prog [options] create directory <directory> <...>'
-
-    def parser(self):
-        parser = CLICommand.parser(self)
-        parser.add_option('-p', '--pattern', dest='pattern',
-                          help="glob pattern for files")
-        parser.add_option('-i', '--ignore', dest='ignore',
-                          default=[], action='append',
-                          help='directories to ignore')
-        parser.add_option('-w', '--in-place', dest='in_place',
-                          help='Write .ini files in place; filename to write to')
-        return parser
-
-    def __call__(self, _options, args):
-        parser = self.parser()
-        options, args = parser.parse_args(args)
-
-        # need some directories
-        if not len(args):
-            parser.print_usage()
-            return
-
-        # add the directories to the manifest
-        for arg in args:
-            assert os.path.exists(arg)
-            assert os.path.isdir(arg)
-            manifest = convert(args, pattern=options.pattern, ignore=options.ignore,
-                               write=options.in_place)
-        if manifest:
-            print manifest
-
-
-class WriteCLI(CLICommand):
-    """
-    write a manifest based on a query
-    """
-    usage = '%prog [options] write manifest <manifest> -tag1 -tag2 --key1=value1 --key2=value2 ...'
-    def __call__(self, options, args):
-
-        # parse the arguments
-        try:
-            kwargs, tags, args = parse_args(args)
-        except ParserError, e:
-            self._parser.error(e.message)
-
-        # make sure we have some manifests, otherwise it will
-        # be quite boring
-        if not args:
-            HelpCLI(self._parser)(options, ['write'])
-            return
-
-        # read the manifests
-        # TODO: should probably ensure these exist here
-        manifests = ManifestParser()
-        manifests.read(*args)
-
-        # print the resultant query
-        manifests.write(global_tags=tags, global_kwargs=kwargs)
-      
-
-class HelpCLI(CLICommand):
-    """
-    get help on a command
-    """
-    usage = '%prog [options] help [command]'
-
-    def __call__(self, options, args):
-        if len(args) == 1 and args[0] in commands:
-            commands[args[0]](self._parser).parser().print_help()
-        else:
-            self._parser.print_help()
-            print '\nCommands:'
-            for command in sorted(commands):
-                print '  %s : %s' % (command, commands[command].__doc__.strip())
-
-class SetupCLI(CLICommand):
-    """
-    setup using setuptools
-    """
-    usage = '%prog [options] setup [setuptools options]'
-    
-    def __call__(self, options, args):
-        sys.argv = [sys.argv[0]] + args
-        assert setup is not None, "You must have setuptools installed to use SetupCLI"
-        here = os.path.dirname(os.path.abspath(__file__))
-        try:
-            filename = os.path.join(here, 'README.txt')
-            description = file(filename).read()
-        except:    
-            description = ''
-        os.chdir(here)
-
-        setup(name='ManifestDestiny',
-              version=version,
-              description="universal reader for manifests",
-              long_description=description,
-              classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
-              keywords='mozilla manifests',
-              author='Jeff Hammel',
-              author_email='jhammel@mozilla.com',
-              url='https://wiki.mozilla.org/Auto-tools/Projects/ManifestDestiny',
-              license='MPL',
-              zip_safe=False,
-              py_modules=['manifestparser'],
-              install_requires=[
-                  # -*- Extra requirements: -*-
-                  ],
-              entry_points="""
-              [console_scripts]
-              manifestparser = manifestparser:main
-              """,
-              )
-
-
-class UpdateCLI(CLICommand):
-    """
-    update the tests as listed in a manifest from a directory
-    """
-    usage = '%prog [options] update manifest directory -tag1 -tag2 --key1=value1 --key2=value2 ...'
-
-    def __call__(self, options, args):
-        # parse the arguments
-        try:
-            kwargs, tags, args = parse_args(args)
-        except ParserError, e:
-            self._parser.error(e.message)
-
-        # make sure we have some manifests, otherwise it will
-        # be quite boring
-        if not len(args) == 2:
-            HelpCLI(self._parser)(options, ['update'])
-            return
-
-        # read the manifests
-        # TODO: should probably ensure these exist here
-        manifests = ManifestParser()
-        manifests.read(args[0])
-
-        # print the resultant query
-        manifests.update(args[1], None, *tags, **kwargs)
-
-
-# command -> class mapping
-commands = { 'create': CreateCLI,
-             'help': HelpCLI,
-             'update': UpdateCLI,
-             'write': WriteCLI }
-if setup is not None:
-    commands['setup'] = SetupCLI
-
-def main(args=sys.argv[1:]):
-    """console_script entry point"""
-
-    # set up an option parser
-    usage = '%prog [options] [command] ...'
-    description = __doc__
-    parser = OptionParser(usage=usage, description=description)
-    parser.add_option('-s', '--strict', dest='strict',
-                      action='store_true', default=False,
-                      help='adhere strictly to errors')
-    parser.disable_interspersed_args()
-
-    options, args = parser.parse_args(args)
-
-    if not args:
-        HelpCLI(parser)(options, args)
-        parser.exit()
-
-    # get the command
-    command = args[0]
-    if command not in commands:
-        parser.error("Command must be one of %s (you gave '%s')" % (', '.join(sorted(commands.keys())), command))
-
-    handler = commands[command](parser)
-    handler(options, args[1:])
-
-if __name__ == '__main__':
-    main()
deleted file mode 100644
--- a/mail/test/resources/ManifestDestiny/setup.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-[egg_info]
-tag_build = 
-tag_date = 0
-tag_svn_revision = 0
-
deleted file mode 100644
--- a/mail/test/resources/ManifestDestiny/setup.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-# 
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-# 
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-# 
-# The Original Code is mozilla.org code.
-# 
-# The Initial Developer of the Original Code is
-# Mozilla.org.
-# Portions created by the Initial Developer are Copyright (C) 2011
-# the Initial Developer. All Rights Reserved.
-# 
-# Contributor(s):
-#     Jeff Hammel <jhammel@mozilla.com>     (Original author)
-# 
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-# 
-# ***** END LICENSE BLOCK *****
-
-# The real details are in manifestparser.py; this is just a front-end
-
-
-import sys
-from manifestparser import SetupCLI
-SetupCLI(None)(None, sys.argv[1:])
-
-
-                 
deleted file mode 100644
--- a/mail/test/resources/installmozmill.py
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env python
-
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Mozilla.org.
-# Portions created by the Initial Developer are Copyright (C) 2010
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#     Jeff Hammel <jhammel@mozilla.com>     (Original author)
-#     Siddharth Agarwal <sid.bugzilla@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either of the GNU General Public License Version 2 or later (the "GPL"),
-# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-"""
-install mozmill and its dependencies
-"""
-
-import os
-import sys
-from subprocess import call
-
-### utility functions for cross-platform
-
-def is_windows():
-  return sys.platform.startswith('win')
-
-def esc(path):
-  """quote and escape a path for cross-platform use"""
-  return '"%s"' % repr(path)[1:-1]
-
-def scripts_path(virtual_env):
-  """path to scripts directory"""
-  if is_windows():
-    return os.path.join(virtual_env, 'Scripts')
-  return os.path.join(virtual_env, 'bin')
-
-def python_script_path(virtual_env, script_name):
-  """path to a python script in a virtualenv"""
-  scripts_dir = scripts_path(virtual_env)
-  if is_windows():
-    script_name = script_name + '-script.py'
-  return os.path.join(scripts_dir, script_name)
-
-def entry_point_path(virtual_env, entry_point):
-  path = os.path.join(scripts_path(virtual_env), entry_point)
-  if is_windows():
-    path += '.exe'
-  return path
-
-### command-line entry point
-
-def main(args=None):
-  """command line front-end function"""
-
-  # parse command line arguments
-  args = args or sys.argv[1:]
-  usage = "Usage: %prog [destination]"
-
-  # Print the python version
-  print 'Python: %s' % sys.version
-
-  # The data is kept in the same directory as the script
-  source=os.path.abspath(os.path.dirname(__file__))
-
-  # directory to install to
-  if not len(args):
-    destination = source
-  elif len(args) == 1:
-    destination = os.path.abspath(args[0])
-  else:
-    print "Usage: %s [destination]" % sys.argv[0]
-    sys.exit(1)
-
-  os.chdir(source)
-
-  # check for existence of necessary files
-  if not os.path.exists('virtualenv'):
-    print "File not found: virtualenv"
-    sys.exit(1)
-
-  # packages to install in dependency order
-  packages = ["ManifestDestiny", "simplejson-2.1.6", "mozrunner", "jsbridge",
-              "mozmill"]
-  
-  # create the virtualenv and install packages
-  env = os.environ.copy()
-  env.pop('PYTHONHOME', None)
-  returncode = call([sys.executable, os.path.join('virtualenv', 'virtualenv.py'), destination], env=env)
-  if returncode:
-    print 'Failure to install virtualenv'
-    sys.exit(returncode)
-  pip = entry_point_path(destination, 'pip')
-  returncode = call([pip, 'install'] + [os.path.abspath(package) for package in packages], env=env)
-  if returncode:
-    print 'Failure to install packages'
-    sys.exit(returncode)
-
-if __name__ == '__main__':
-  main()
deleted file mode 100644
--- a/mail/test/resources/jsbridge/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-recursive-include jsbridge/extension *
-recursive-include jsbridge/xpi *
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/__init__.py
+++ /dev/null
@@ -1,181 +0,0 @@
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-# 
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-# 
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-# 
-# The Original Code is Mozilla Corporation Code.
-# 
-# The Initial Developer of the Original Code is
-# Mikeal Rogers.
-# Portions created by the Initial Developer are Copyright (C) 2008 -2009
-# the Initial Developer. All Rights Reserved.
-# 
-# Contributor(s):
-#  Mikeal Rogers <mikeal.rogers@gmail.com>
-#  Henrik Skupin <hskupin@mozilla.com>
-# 
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-# 
-# ***** END LICENSE BLOCK *****
-
-import socket
-import os
-import copy
-import asyncore
-
-from time import sleep
-from network import Bridge, BackChannel, create_network
-from jsobjects import JSObject
-
-import mozrunner
-
-settings_env = 'JSBRIDGE_SETTINGS_FILE'
-
-parent = os.path.abspath(os.path.dirname(__file__))
-extension_path = os.path.join(parent, 'extension')
-
-window_string = "Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow('')"
-
-wait_to_create_timeout = 60
-
-def wait_and_create_network(host, port, timeout=wait_to_create_timeout):
-    ttl = 0
-    while ttl < timeout:
-        try:
-            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-            s.connect((host, port))
-            s.close()
-            break
-        except socket.error:
-            pass
-        sleep(.25)
-        ttl += .25
-    if ttl == timeout:
-        raise Exception("Sorry, cannot connect to jsbridge extension, port %s" % port)
-    
-    back_channel, bridge = create_network(host, port)
-    sleep(.5)
-    
-    while back_channel.registered is False:
-        back_channel.close()
-        bridge.close()
-        asyncore.socket_map = {}
-        sleep(1)
-        back_channel, bridge = create_network(host, port)
-    
-    return back_channel, bridge
-
-class CLI(mozrunner.CLI):
-    """Command line interface."""
-    
-    module = "jsbridge"
-
-    parser_options = copy.copy(mozrunner.CLI.parser_options)
-    parser_options[('-D', '--debug',)] = dict(dest="debug", 
-                                             action="store_true",
-                                             help="Debug mode", 
-                                             metavar="JSBRIDGE_DEBUG",
-                                             default=False )
-    parser_options[('-s', '--shell',)] = dict(dest="shell", 
-                                             action="store_true",
-                                             help="Start a Python shell",
-                                             metavar="JSBRIDGE_SHELL",
-                                             default=False )
-    parser_options[('-u', '--usecode',)] = dict(dest="usecode", action="store_true",
-                                               help="Use code module instead of iPython",
-                                               default=False)
-    parser_options[('-P', '--port')] = dict(dest="port", default="24242",
-                                            help="TCP port to run jsbridge on.")
-
-    def get_profile(self, *args, **kwargs):
-        if self.options.debug:
-            kwargs.setdefault('preferences', {}).update({
-              'extensions.checkCompatibility':False,
-              'devtools.errorconsole.enabled':True,
-              'javascript.options.strict': True
-            })
-        profile = mozrunner.CLI.get_profile(self, *args, **kwargs)
-        profile.install_addon(extension_path)
-        return profile
-        
-    def get_runner(self, *args, **kwargs):
-        runner = super(CLI, self).get_runner(*args, **kwargs)
-        if self.options.debug:
-            runner.cmdargs.append('-jsconsole')
-        if not '-jsbridge' in runner.cmdargs: 
-            runner.cmdargs += ['-jsbridge', self.options.port]
-        return runner
-        
-    def run(self):
-        runner = self.create_runner()
-        runner.start()
-        self.start_jsbridge_network()
-        if self.options.shell:
-            self.start_shell(runner)
-        else:
-            try:
-                runner.wait()
-            except KeyboardInterrupt:
-                runner.stop()
-                
-        runner.profile.cleanup()
-    
-    def start_shell(self, runner):
-        try:
-            import IPython
-        except:
-            IPython = None
-        if not hasattr(self, 'bridge'):
-            self.start_jsbridge_network()
-        jsobj = JSObject(self.bridge, window_string)
-        
-        if IPython is None or self.options.usecode:
-            import code
-            code.interact(local={"jsobj":jsobj, 
-                                 "getBrowserWindow":lambda : getBrowserWindow(self.bridge),
-                                 "back_channel":self.back_channel,
-                                 })
-        else:
-            from IPython.Shell import IPShellEmbed
-            ipshell = IPShellEmbed([])
-            ipshell(local_ns={"jsobj":jsobj, 
-                              "getBrowserWindow":lambda : getBrowserWindow(self.bridge),
-                              "back_channel":self.back_channel,
-                              })
-        runner.stop()
-        
-    def start_jsbridge_network(self, timeout=10):
-        port = int(self.options.port)
-        host = '127.0.0.1'
-        self.back_channel, self.bridge = wait_and_create_network(host, port, timeout)
-
-def cli():
-    CLI().run()
-
-def getBrowserWindow(bridge):
-    return JSObject(bridge, "Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow('')")
-    
-
-
-
-
-
-
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/chrome.manifest
+++ /dev/null
@@ -1,14 +0,0 @@
-resource jsbridge resource/
-
-content jsbridge chrome/content/
-
-overlay chrome://browser/content/browser.xul chrome://jsbridge/content/overlay.xul
-overlay chrome://messenger/content/mailWindowOverlay.xul chrome://jsbridge/content/overlay.xul
-
-overlay chrome://calendar/content/calendar.xul chrome://jsbridge/content/overlay.xul
-
-overlay windowtype:Songbird:Main chrome://jsbridge/content/overlay.xul
-
-component {2872d428-14f6-11de-ac86-001f5bd9235c} components/cmdarg.js
-contract @mozilla.org/commandlinehandler/general-startup;1?type=jsbridge {2872d428-14f6-11de-ac86-001f5bd9235c}
-category command-line-handler jsbridge @mozilla.org/commandlinehandler/general-startup;1?type=jsbridge
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/chrome/content/overlay.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// ***** BEGIN LICENSE BLOCK *****
-// Version: MPL 1.1/GPL 2.0/LGPL 2.1
-// 
-// The contents of this file are subject to the Mozilla Public License Version
-// 1.1 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-// 
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-// 
-// The Original Code is Mozilla Corporation Code.
-// 
-// The Initial Developer of the Original Code is
-// Mikeal Rogers.
-// Portions created by the Initial Developer are Copyright (C) 2008
-// the Initial Developer. All Rights Reserved.
-// 
-// Contributor(s):
-//  Mikeal Rogers <mikeal.rogers@gmail.com>
-// 
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-// 
-// ***** END LICENSE BLOCK *****
-
-var jsbridgeInit = {}; Components.utils.import('resource://jsbridge/modules/init.js',jsbridgeInit);
-
-
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/chrome/content/overlay.xul
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<overlay id="jsbridge-overlay"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script src="overlay.js"/>
-</overlay>
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/components/cmdarg.js
+++ /dev/null
@@ -1,124 +0,0 @@
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-const nsIAppShellService    = Components.interfaces.nsIAppShellService;
-const nsISupports           = Components.interfaces.nsISupports;
-const nsICategoryManager    = Components.interfaces.nsICategoryManager;
-const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
-const nsICommandLine        = Components.interfaces.nsICommandLine;
-const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler;
-const nsIFactory            = Components.interfaces.nsIFactory;
-const nsIModule             = Components.interfaces.nsIModule;
-const nsIWindowWatcher      = Components.interfaces.nsIWindowWatcher;
-
-// CHANGEME: to the chrome URI of your extension or application
-const CHROME_URI = "chrome://jsbridge/content/";
-
-// CHANGEME: change the contract id, CID, and category to be unique
-// to your application.
-const clh_contractID = "@mozilla.org/commandlinehandler/general-startup;1?type=jsbridge";
-
-// use uuidgen to generate a unique ID
-const clh_CID = Components.ID("{2872d428-14f6-11de-ac86-001f5bd9235c}");
-
-// category names are sorted alphabetically. Typical command-line handlers use a
-// category that begins with the letter "m".
-const clh_category = "jsbridge";
-
-var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].
-     getService(Components.interfaces.nsIConsoleService);
-
-/**
- * Utility functions
- */
-
-/**
- * Opens a chrome window.
- * @param aChromeURISpec a string specifying the URI of the window to open.
- * @param aArgument an argument to pass to the window (may be null)
- */
-function openWindow(aChromeURISpec, aArgument)
-{
-  var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].
-    getService(Components.interfaces.nsIWindowWatcher);
-  ww.openWindow(null, aChromeURISpec, "_blank",
-                "chrome,menubar,toolbar,status,resizable,dialog=no",
-                aArgument);
-}
-
-/**
- * The XPCOM component that implements nsICommandLineHandler.
- * It also implements nsIFactory to serve as its own singleton factory.
- */
-function jsbridgeHandler() {
-}
-jsbridgeHandler.prototype = {
-  classID: clh_CID,
-  contractID: clh_contractID,
-  classDescription: "jsbridgeHandler",
-  _xpcom_categories: [{category: "command-line-handler", entry: clh_category}],
-
-  /* nsISupports */
-  QueryInterface : function clh_QI(iid)
-  {
-    if (iid.equals(nsICommandLineHandler) ||
-        iid.equals(nsIFactory) ||
-        iid.equals(nsISupports))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  /* nsICommandLineHandler */
-
-  handle : function clh_handle(cmdLine)
-  {
-    try {
-      var port = cmdLine.handleFlagWithParam("jsbridge", false);
-      if (port) {
-        var server = {};
-        Components.utils.import('resource://jsbridge/modules/server.js', server);
-        server.startServer(parseInt(port));
-      } else {
-        var server = {};
-        Components.utils.import('resource://jsbridge/modules/server.js', server);
-        server.startServer(24242);
-      }
-    }
-    catch (e) {
-      Components.utils.reportError("incorrect parameter passed to -jsbridge on the command line.");
-    }
-
-  },
-
-  // CHANGEME: change the help info as appropriate, but
-  // follow the guidelines in nsICommandLineHandler.idl
-  // specifically, flag descriptions should start at
-  // character 24, and lines should be wrapped at
-  // 72 characters with embedded newlines,
-  // and finally, the string should end with a newline
-  helpInfo : "  -jsbridge            Port to run jsbridge on.\n",
-
-  /* nsIFactory */
-
-  createInstance : function clh_CI(outer, iid)
-  {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-    return this.QueryInterface(iid);
-  },
-
-  lockFactory : function clh_lock(lock)
-  {
-    /* no-op */
-  }
-};
-
-/**
- * XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
- * XPCOMUtils.generateNSGetModule is for Mozilla 1.9.1 (Firefox 3.5).
- */
-if (XPCOMUtils.generateNSGetFactory)
-  const NSGetFactory = XPCOMUtils.generateNSGetFactory([jsbridgeHandler]);
-else
-  const NSGetModule = XPCOMUtils.generateNSGetModule([jsbridgeHandler]);
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/install.rdf
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-   <Description about="urn:mozilla:install-manifest">
-     <em:id>jsbridge@mozilla.com</em:id>
-     <em:name>jsbridge</em:name>
-     <em:version>2.4.4b4</em:version>
-     <em:creator>Mikeal Rogers</em:creator>
-     <em:description>Python to JavaScript bridge</em:description>
-     <em:unpack>true</em:unpack>
-     <em:targetApplication>
-       <!-- Firefox -->
-       <Description>
-         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-         <em:minVersion>3.5</em:minVersion>
-         <em:maxVersion>7.*</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-     <em:targetApplication>
-       <!-- Thunderbird -->
-       <Description>
-         <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
-         <em:minVersion>3.0a1pre</em:minVersion>
-         <em:maxVersion>6.*</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-     <em:targetApplication>
-       <!-- Sunbird -->
-       <Description>
-         <em:id>{718e30fb-e89b-41dd-9da7-e25a45638b28}</em:id>
-         <em:minVersion>1.0b1pre</em:minVersion>
-         <em:maxVersion>1.0pre</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-     <em:targetApplication>
-       <!-- SeaMonkey -->
-       <Description>
-         <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
-         <em:minVersion>2.0a1</em:minVersion>
-         <em:maxVersion>3.*</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-	   <em:targetApplication>
-	      <!-- Songbird -->
-	      <Description>
-	        <em:id>songbird@songbirdnest.com</em:id>
-	        <em:minVersion>0.3pre</em:minVersion>
-	        <em:maxVersion>2.*</em:maxVersion>
-	      </Description>
-	   </em:targetApplication>
-	   <em:targetApplication>
-         <Description>
-          <em:id>toolkit@mozilla.org</em:id>
-          <em:minVersion>1.9.1</em:minVersion>
-          <em:maxVersion>2.0*</em:maxVersion>
-         </Description>
-     </em:targetApplication>
-   </Description>
-
-
-</RDF>
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/resource/modules/events.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var EXPORTED_SYMBOLS = ["backchannels", "fireEvent", "addBackChannel"];
-
-var backchannels = [];
-
-var fireEvent = function (name, obj) {
-  for each(backchannel in backchannels) {
-    backchannel.session.encodeOut({'eventType':name, 'result':obj});
-  }
-}
-
-var addBackChannel = function (backchannel) {
-    backchannels.push(backchannel);
-}
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/resource/modules/init.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// ***** BEGIN LICENSE BLOCK *****
-// Version: MPL 1.1/GPL 2.0/LGPL 2.1
-// 
-// The contents of this file are subject to the Mozilla Public License Version
-// 1.1 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-// 
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-// 
-// The Original Code is Mozilla Corporation Code.
-// 
-// The Initial Developer of the Original Code is
-// Mikeal Rogers.
-// Portions created by the Initial Developer are Copyright (C) 2008
-// the Initial Developer. All Rights Reserved.
-// 
-// Contributor(s):
-//  Mikeal Rogers <mikeal.rogers@gmail.com>
-// 
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-// 
-// ***** END LICENSE BLOCK *****
-
-var EXPORTED_SYMBOLS = ["server"];
-
-var server = {}; Components.utils.import('resource://jsbridge/modules/server.js', server);
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/resource/modules/json2.js
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
-    http://www.JSON.org/json2.js
-    2008-05-25
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects without a toJSON
-                        method. It can be a function or an array.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the object holding the key.
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 ? '0' + n : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array, then it will be used to
-            select the members to be serialized. It filters the results such
-            that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date ?
-                    'Date(' + this[key] + ')' : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-*/
-
-/*jslint evil: true */
-
-/*global JSON */
-
-/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", call,
-    charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes,
-    getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length,
-    parse, propertyIsEnumerable, prototype, push, replace, slice, stringify,
-    test, toJSON, toString
-*/
-
-var EXPORTED_SYMBOLS = ["JSON"];
-
-if (!this.JSON) {
-
-// Create a JSON object only if one does not already exist. We create the
-// object in a closure to avoid creating global variables.
-
-    JSON = function () {
-
-        function f(n) {
-            // Format integers to have at least two digits.
-            return n < 10 ? '0' + n : n;
-        }
-
-        Date.prototype.toJSON = function (key) {
-
-            return this.getUTCFullYear()   + '-' +
-                 f(this.getUTCMonth() + 1) + '-' +
-                 f(this.getUTCDate())      + 'T' +
-                 f(this.getUTCHours())     + ':' +
-                 f(this.getUTCMinutes())   + ':' +
-                 f(this.getUTCSeconds())   + 'Z';
-        };
-
-        var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-            escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-            gap,
-            indent,
-            meta = {    // table of character substitutions
-                '\b': '\\b',
-                '\t': '\\t',
-                '\n': '\\n',
-                '\f': '\\f',
-                '\r': '\\r',
-                '"' : '\\"',
-                '\\': '\\\\'
-            },
-            rep;
-
-
-        function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-            escapeable.lastIndex = 0;
-            return escapeable.test(string) ?
-                '"' + string.replace(escapeable, function (a) {
-                    var c = meta[a];
-                    if (typeof c === 'string') {
-                        return c;
-                    }
-                    return '\\u' + ('0000' +
-                            (+(a.charCodeAt(0))).toString(16)).slice(-4);
-                }) + '"' :
-                '"' + string + '"';
-        }
-
-
-        function str(key, holder) {
-
-// Produce a string from holder[key].
-
-            var i,          // The loop counter.
-                k,          // The member key.
-                v,          // The member value.
-                length,
-                mind = gap,
-                partial,
-                value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-            if (value && typeof value === 'object' &&
-                    typeof value.toJSON === 'function') {
-                value = value.toJSON(key);
-            }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-            if (typeof rep === 'function') {
-                value = rep.call(holder, key, value);
-            }
-
-// What happens next depends on the value's type.
-
-            switch (typeof value) {
-            case 'string':
-                return quote(value);
-
-            case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-                return isFinite(value) ? String(value) : 'null';
-
-            case 'boolean':
-            case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-                return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-            case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-                if (!value) {
-                    return 'null';
-                }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-                gap += indent;
-                partial = [];
-
-// If the object has a dontEnum length property, we'll treat it as an array.
-
-                if (typeof value.length === 'number' &&
-                        !(value.propertyIsEnumerable('length'))) {
-
-// The object is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                    length = value.length;
-                    for (i = 0; i < length; i += 1) {
-                        partial[i] = str(i, value) || 'null';
-                    }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                    v = partial.length === 0 ? '[]' :
-                        gap ? '[\n' + gap +
-                                partial.join(',\n' + gap) + '\n' +
-                                    mind + ']' :
-                              '[' + partial.join(',') + ']';
-                    gap = mind;
-                    return v;
-                }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-                if (rep && typeof rep === 'object') {
-                    length = rep.length;
-                    for (i = 0; i < length; i += 1) {
-                        k = rep[i];
-                        if (typeof k === 'string') {
-                            v = str(k, value, rep);
-                            if (v) {
-                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                            }
-                        }
-                    }
-                } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                    for (k in value) {
-                        if (Object.hasOwnProperty.call(value, k)) {
-                            v = str(k, value, rep);
-                            if (v) {
-                                partial.push(quote(k) + (gap ? ': ' : ':') + v);
-                            }
-                        }
-                    }
-                }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-                v = partial.length === 0 ? '{}' :
-                    gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
-                            mind + '}' : '{' + partial.join(',') + '}';
-                gap = mind;
-                return v;
-            }
-        }
-
-// Return the JSON object containing the stringify and parse methods.
-
-        return {
-            stringify: function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-                var i;
-                gap = '';
-                indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-                if (typeof space === 'number') {
-                    for (i = 0; i < space; i += 1) {
-                        indent += ' ';
-                    }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-                } else if (typeof space === 'string') {
-                    indent = space;
-                }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-                rep = replacer;
-                if (replacer && typeof replacer !== 'function' &&
-                        (typeof replacer !== 'object' ||
-                         typeof replacer.length !== 'number')) {
-                    throw new Error('JSON.stringify');
-                }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-                return str('', {'': value});
-            },
-
-
-            parse: function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-                var j;
-
-                function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                    var k, v, value = holder[key];
-                    if (value && typeof value === 'object') {
-                        for (k in value) {
-                            if (Object.hasOwnProperty.call(value, k)) {
-                                v = walk(value, k);
-                                if (v !== undefined) {
-                                    value[k] = v;
-                                } else {
-                                    delete value[k];
-                                }
-                            }
-                        }
-                    }
-                    return reviver.call(holder, key, value);
-                }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-                cx.lastIndex = 0;
-                if (cx.test(text)) {
-                    text = text.replace(cx, function (a) {
-                        return '\\u' + ('0000' +
-                                (+(a.charCodeAt(0))).toString(16)).slice(-4);
-                    });
-                }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-                if (/^[\],:{}\s]*$/.
-test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                    j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                    return typeof reviver === 'function' ?
-                        walk({'': j}, '') : j;
-                }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-                throw new SyntaxError('JSON.parse');
-            }
-        };
-    }();
-}
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/extension/resource/modules/server.js
+++ /dev/null
@@ -1,347 +0,0 @@
-// ***** BEGIN LICENSE BLOCK *****
-// Version: MPL 1.1/GPL 2.0/LGPL 2.1
-// 
-// The contents of this file are subject to the Mozilla Public License Version
-// 1.1 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-// 
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-// 
-// The Original Code is Mozilla Corporation Code.
-// 
-// The Initial Developer of the Original Code is
-// based on the MozRepl project.
-// Portions created by the Initial Developer are Copyright (C) 2008
-// the Initial Developer. All Rights Reserved.
-// 
-// Contributor(s):
-//  Mikeal Rogers <mikeal.rogers@gmail.com>
-//  Massimiliano Mirra <bard@hyperstruct.net>
-//
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-// 
-// ***** END LICENSE BLOCK *****
-
-var EXPORTED_SYMBOLS = ["Server", "server", "AsyncRead", "Session", "sessions", "globalRegistry", "startServer"];
-
-var events = {}; Components.utils.import("resource://jsbridge/modules/events.js", events);
-const DEBUG_ON = false;
-const BUFFER_SIZE = 1024;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const loader = Cc['@mozilla.org/moz/jssubscript-loader;1']
-    .getService(Ci.mozIJSSubScriptLoader);
-
-var hwindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
-    .getService(Components.interfaces.nsIAppShellService)
-    .hiddenDOMWindow;
-    
-var nativeJSON = Components.classes["@mozilla.org/dom/json;1"]
-    .createInstance(Components.interfaces.nsIJSON);
-
-var json2 = Components.utils.import("resource://jsbridge/modules/json2.js");
-
-var jsonEncode = json2.JSON.stringify;    
-
-var uuidgen = Components.classes["@mozilla.org/uuid-generator;1"]
-    .getService(Components.interfaces.nsIUUIDGenerator);
-
-function AsyncRead (session) {
-  this.session = session;
-}
-AsyncRead.prototype.onStartRequest = function (request, context) {};
-AsyncRead.prototype.onStopRequest = function (request, context, status) {
-  log("async onstoprequest: onstoprequest");
-  this.session.onQuit();
-}
-AsyncRead.prototype.onDataAvailable = function (request, context, inputStream, offset, count) {
-  var str = {};
-  str.value = '';
-
-  var bytesAvail = 0;
-  do {
-    var parts = {};
-    if (count > BUFFER_SIZE) {
-      bytesAvail = BUFFER_SIZE;
-    } else {
-      bytesAvail = count;
-    }
-
-    log("jsbridge: onDataAvailable, reading bytesAvail = " + bytesAvail + "\n");
-    var bytesRead = this.session.instream.readString(bytesAvail, parts);
-    count = count - bytesRead;
-    log("jsbridge: onDataAvailable, read bytes: " + bytesRead + " count is now: " + count + "\n"); 
-    str.value += parts.value;
-  } while (count > 0);
-  log("jsbridge: onDataAvailable, going into receive with: \n\n" + str.value + "\n\n");
-  this.session.receive(str.value);
-}
-
-
-
-globalRegistry = {};
-
-function Bridge (session) {
-  this.session = session;
-  this.registry = globalRegistry;
-}
-Bridge.prototype._register = function (_type) {
-  this.bridgeType = _type;
-  if (_type == "backchannel") {
-    events.addBackChannel(this);
-  }
-}
-Bridge.prototype.register = function (uuid, _type) {
-  try {
-    this._register(_type);
-    var passed = true;
-  } catch(e) {
-    if (typeof(e) == "string") {
-      var exception = e;
-    } else {
-      var exception = {'name':e.name, 'message':e.message};
-    }
-    this.session.encodeOut({'result':false, 'exception':exception, 'uuid':uuid});
-  }
-  if (passed != undefined) {
-    this.session.encodeOut({"result":true, 'eventType':'register', 'uuid':uuid});
-  }
-  
-}
-Bridge.prototype._describe = function (obj) {
-  var response = {};
-  if (obj == null) {
-    var type = "null";
-  } else {
-    var type = typeof(obj);
-  }
-  if (type == "object") {
-    if (obj.length != undefined) {
-      var type = "array";
-    }
-    response.attributes = [];
-    for (i in obj) {
-      response.attributes = response.attributes.concat(i);
-    }
-  }
-  else if (type != "function"){
-    response.data = obj;
-  }
-  response.type = type;
-  return response;
-}
-Bridge.prototype.describe = function (uuid, obj) {
-  var response = this._describe(obj);
-  response.uuid = uuid;
-  response.result = true;
-  this.session.encodeOut(response);
-}
-Bridge.prototype._set = function (obj) {
-  var uuid = uuidgen.generateUUID().toString();
-  this.registry[uuid] = obj;
-  return uuid;
-}
-Bridge.prototype.set = function (uuid, obj) {
-  var ruuid = this._set(obj);
-  this.session.encodeOut({'result':true, 'data':'bridge.registry["'+ruuid+'"]', 'uuid':uuid});
-}
-Bridge.prototype._setAttribute = function (obj, name, value) {
-  obj[name] = value;
-  return value;
-}
-Bridge.prototype.setAttribute = function (uuid, obj, name, value) {
-  try {
-    var result = this._setAttribute(obj, name, value);
-  } catch(e) {
-    if (typeof(e) == "string") {
-      var exception = e;
-    } else {
-      var exception = {'name':e.name, 'message':e.message};
-    }
-    this.session.encodeOut({'result':false, 'exception':exception, 'uuid':uuid});
-  }
-  if (result != undefined) {
-    this.set(uuid, obj[name]);
-  }
-}
-Bridge.prototype._execFunction = function (func, args) {
-  return func.apply(this.session.sandbox, args);
-}
-Bridge.prototype.execFunction = function (uuid, func, args) {
-  try {
-    var data = this._execFunction(func, args);
-    var result = true;
-  } catch(e) {
-    if (typeof(e) == "string") {
-      var exception = e;
-    } else {
-      var exception = {'name':e.name, 'message':e.message};
-    }
-    this.session.encodeOut({'result':false, 'exception':exception, 'uuid':uuid});
-    var result = true;
-  }  
-  if (data != undefined) {
-    this.set(uuid, data);
-  } else if ( result == true) {
-    this.session.encodeOut({'result':true, 'data':null, 'uuid':uuid});
-  } else {
-    log("jsbridge threw unknown data in execFunc");
-    throw 'JSBridge unknown data in execFunc';
-  }
-}
-
-backstage = this;
-
-function Session (transport) {
-  this.transpart = transport;
-  this.sandbox = Components.utils.Sandbox(backstage);
-  this.sandbox.bridge = new Bridge(this);
-  this.sandbox.openPreferences = hwindow.openPreferences;
-  try {
-      this.outputstream = transport.openOutputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0);	
-      this.outstream = Cc['@mozilla.org/intl/converter-output-stream;1']
-                    .createInstance(Ci.nsIConverterOutputStream);
-      this.outstream.init(this.outputstream, 'UTF-8', BUFFER_SIZE,
-                    Ci.nsIConverterOutputStream.DEFAULT_REPLACEMENT_CHARACTER);
-      this.stream = transport.openInputStream(0, 0, 0);
-      this.instream = Cc['@mozilla.org/intl/converter-input-stream;1']
-          .createInstance(Ci.nsIConverterInputStream);
-      this.instream.init(this.stream, 'UTF-8', BUFFER_SIZE,
-                    Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
-  } catch(e) {
-      log('jsbridge: Error: ' + e);
-  }
-  log('jsbridge: Accepted connection.');
-  
-  this.pump = Cc['@mozilla.org/network/input-stream-pump;1']
-      .createInstance(Ci.nsIInputStreamPump);
-  this.pump.init(this.stream, -1, -1, 0, 0, false);
-  this.pump.asyncRead(new AsyncRead(this), null);
-}
-Session.prototype.onOutput = function(string) {
-  log('jsbridge: write: '+string)
-  if (typeof(string) != "string") {
-    throw "This is not a string"
-  } 
-  try {
-    var stroffset = 0;
-    do {
-      var parts = '';
-      // Handle the case where we are writing something larger than our buffer
-      if (string.length > BUFFER_SIZE) {
-        log("jsbridge: onOutput: writing data stroffset is: " + stroffset + " string.length is: " + string.length);
-        parts = string.slice(stroffset, stroffset + BUFFER_SIZE);
-        log("jsbridge: onOutput: here is our part: \n" + parts + "\n");
-      } else {
-        parts = string;
-      }
-
-      // Update our offset
-      stroffset = stroffset += parts.length;
-
-      // write it
-      this.outstream.writeString(parts);
-    } while (stroffset < string.length);
-
-    // Ensure the entire stream is flushed
-    this.outstream.flush();
-  } catch (e) {
-    log("jsbridge: threw on writing string: " + string + "   exception: " + e);
-    throw "JSBridge cannot write: "+string
-  }
-};
-Session.prototype.onQuit = function() {
-  this.instream.close();
-  this.outstream.close();
-  sessions.remove(session);
-};
-Session.prototype.encodeOut = function (obj) {
-  try {
-    this.onOutput(jsonEncode(obj));
-  } catch(e) {
-    if (typeof(e) == "string") {
-      var exception = e;
-    } else {
-      var exception = {'name':e.name, 'message':e.message};
-    }
-    this.onOutput(jsonEncode({'result':false, 'exception':exception}));
-  }
-  
-}
-Session.prototype.receive = function(data) {
-  Components.utils.evalInSandbox(data, this.sandbox);
-}
-
-var sessions = {
-    _list: [],
-    add: function(session) {
-        this._list.push(session);
-    },
-    remove: function(session) {
-        var index = this._list.indexOf(session);
-        if(index != -1)
-            this._list.splice(index, 1);
-    },
-    get: function(index) {
-        return this._list[index];
-    },
-    quit: function() {
-        this._list.forEach(
-            function(session) { session.quit; });
-        this._list.splice(0, this._list.length);
-    }
-};
-
-function Server (port) {
-  this.port = port;
-}
-Server.prototype.start = function () {
-  try {
-    this.serv = Cc['@mozilla.org/network/server-socket;1']
-        .createInstance(Ci.nsIServerSocket);
-    this.serv.init(this.port, true, -1);
-    this.serv.asyncListen(this);
-  } catch(e) {
-    log('jsbridge: Exception: ' + e);
-  }    
-}
-Server.prototype.stop = function () {
-    log('jsbridge: Closing...');
-    this.serv.close();
-    this.sessions.quit();
-    this.serv = undefined;
-}
-Server.prototype.onStopListening = function (serv, status) {
-// Stub function
-}
-Server.prototype.onSocketAccepted = function (serv, transport) {
-  session = new Session(transport)
-  sessions.add(session);
-}
-
-function log(msg) {
-  if (DEBUG_ON) {
-    dump(msg + '\n');
-  } 
-}
-
-function startServer(port) {
-  var server = new Server(port)
-  server.start()
-}
-
-
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/jsobjects.py
+++ /dev/null
@@ -1,167 +0,0 @@
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is Mozilla Corporation Code.
-#
-# The Initial Developer of the Original Code is
-# Mikeal Rogers.
-# Portions created by the Initial Developer are Copyright (C) 2008
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#  Mikeal Rogers <mikeal.rogers@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-def init_jsobject(cls, bridge, name, value, description=None):
-    """Initialize a js object that is a subclassed base type; int, str, unicode, float."""
-    obj = cls(value)
-    obj._bridge_ = bridge
-    obj._name_ = name
-    obj._description_ = description
-    return obj
-
-def create_jsobject(bridge, fullname, value=None, obj_type=None, override_set=False):
-    """Create a single JSObject for named object on other side of the bridge.
-    
-    Handles various initization cases for different JSObjects."""
-    description = bridge.describe(fullname)
-    obj_type = description['type']
-    value = description.get('data', None)
-    
-    if value is True or value is False:
-        return value
-
-    if js_type_cases.has_key(obj_type):
-        cls, needs_init = js_type_cases[obj_type]
-        # Objects that requires initialization are base types that have "values".
-        if needs_init:
-            obj = init_jsobject(cls, bridge, fullname, value, description=description)
-        else:
-            obj = cls(bridge, fullname, description=description, override_set=override_set)
-        return obj
-    else:
-        # Something very bad happened, we don't have a representation for the given type.
-        raise TypeError("Don't have a JSObject for javascript type "+obj_type)
-    
-class JSObject(object):
-    """Base javascript object representation."""
-    _loaded_ = False
-    
-    def __init__(self, bridge, name, override_set=False, description=None, *args, **kwargs):
-        self._bridge_ = bridge
-        if not override_set:
-            name = bridge.set(name)['data']
-        self._name_ = name
-        self._description_ = description
-    
-    def __jsget__(self, name):
-        """Abstraction for final step in get events; __getitem__ and __getattr__.
-        """
-        result = create_jsobject(self._bridge_, name, override_set=True)
-        return result
-    
-    def __getattr__(self, name):
-        """Get the object from jsbridge. 
-        
-        Handles lazy loading of all attributes of self."""
-        # A little hack so that ipython returns all the names.
-        if name == '_getAttributeNames':
-            return lambda : self._bridge_.describe(self._name_)['attributes']
-            
-        attributes = self._bridge_.describe(self._name_)['attributes']
-        if name in attributes:
-            return self.__jsget__(self._name_+'["'+name+'"]')
-        else:
-            raise AttributeError(name+" is undefined.")
-    
-    __getitem__ = __getattr__
-        
-    def __setattr__(self, name, value):
-        """Set the given JSObject as an attribute of this JSObject and make proper javascript
-        assignment on the other side of the bridge."""
-        if name.startswith('_') and name.endswith('_'):
-            return object.__setattr__(self, name, value)
-
-        response = self._bridge_.setAttribute(self._name_, name, value)
-        object.__setattr__(self, name, create_jsobject(self._bridge_, response['data'], override_set=True))
-    
-    __setitem__ = __setattr__
-
-class JSFunction(JSObject):
-    """Javascript function represenation.
-    
-    Returns a JSObject instance for the serialized js type with 
-    name set to the full javascript call for this function. 
-    """    
-    
-    def __init__(self, bridge, name, override_set=False, description=None, *args, **kwargs):
-        self._bridge_ = bridge
-        self._name_ = name
-        self._description_ = description
-    
-    def __call__(self, *args):
-        response = self._bridge_.execFunction(self._name_, args)
-        if response['data'] is not None:
-            return create_jsobject(self._bridge_, response['data'], override_set=True)
-
-
-class JSString(JSObject, unicode):
-    "Javascript string representation."
-    __init__ = unicode.__init__
-
-class JSInt(JSObject, int): 
-    """Javascript number representation for Python int."""
-    __init__ = int.__init__
-
-class JSFloat(JSObject, float):
-    """Javascript number representation for Python float."""
-    __init__ = float.__init__
-    
-class JSUndefined(JSObject):
-    """Javascript undefined representation."""    
-    __str__ = lambda self : "undefined"
-
-    def __cmp__(self, other):
-        if isinstance(other, JSUndefined):
-            return True
-        else:
-            return False
-
-    __nonzero__ = lambda self: False
-
-js_type_cases = {'function'  :(JSFunction, False,), 
-                  'object'   :(JSObject, False,), 
-                  'array'    :(JSObject, False,),
-                  'string'   :(JSString, True,), 
-                  'number'   :(JSFloat, True,),
-                  'undefined':(JSUndefined, False,),
-                  'null'     :(JSObject, False,),
-                  }
-py_type_cases = {unicode  :JSString,
-                  str     :JSString,
-                  int     :JSInt,
-                  float   :JSFloat,
-                  }
deleted file mode 100644
--- a/mail/test/resources/jsbridge/jsbridge/network.py
+++ /dev/null
@@ -1,308 +0,0 @@
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is Mozilla Corporation Code.
-#
-# The Initial Developer of the Original Code is
-# Mikeal Rogers.
-# Portions created by the Initial Developer are Copyright (C) 2008
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#  Mikeal Rogers <mikeal.rogers@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-import asyncore
-import socket
-import select
-import logging
-import uuid
-from time import sleep
-from threading import Thread
-
-try:
-    import json as simplejson
-    from json.encoder import encode_basestring_ascii, encode_basestring
-except ImportError:
-    import simplejson
-    from simplejson.encoder import encode_basestring_ascii, encode_basestring
-
-logger = logging.getLogger(__name__)
-
-class JavaScriptException(Exception): pass
-
-class Telnet(asyncore.dispatcher):
-    def __init__(self, host, port):
-        self.host, self.port = host, port
-        asyncore.dispatcher.__init__(self)
-        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.connect((host, port))
-        self.buffer = ''
-        self.logger = logger
-
-    def __del__(self):
-        self.close()
-
-    def handle_close(self):
-        """override method of asyncore.dispatcher"""
-        self.close()
-
-    def handle_expt(self): 
-        self.close() # connection failed, shutdown
-    
-    def writable(self):
-        return (len(self.buffer) > 0)
-
-    def handle_write(self):
-        sent = self.send(self.buffer)
-        self.buffer = self.buffer[sent:]
-        
-    def read_all(self):
-        import socket
-        data = ''
-        while 1:
-            try:
-                data += self.recv(4096)
-            except socket.error:
-                return data
-
-    def handle_read(self):
-        self.data = self.read_all()
-        self.process_read(self.data)
-
-        
-    read_callback = lambda self, data: None
-
-decoder = simplejson.JSONDecoder()
-
-class JSObjectEncoder(simplejson.JSONEncoder):
-    """Encoder that supports jsobject references by name."""
-
-    def encode(self, o):
-        import jsobjects
-        if isinstance(o, jsobjects.JSObject):
-            return o._name_
-        else:
-            return simplejson.JSONEncoder.encode(self, o)
-
-    def _iterencode(self, o, markers=None):
-        import jsobjects
-        if isinstance(o, jsobjects.JSObject):
-            yield o._name_
-        elif isinstance(o, basestring):
-            if self.ensure_ascii:
-                encoder = encode_basestring_ascii
-            else:
-                encoder = encode_basestring
-            _encoding = self.encoding
-            if (_encoding is not None and isinstance(o, str)
-                    and not (_encoding == 'utf-8')):
-                o = o.decode(_encoding)
-            yield encoder(o)
-        elif o is None:
-            yield 'null'
-        elif o is True:
-            yield 'true'
-        elif o is False:
-            yield 'false'
-        elif isinstance(o, (int, long)):
-            yield str(o)
-        elif isinstance(o, float):
-            yield getattr(simplejson.encoder, 'floatstr', simplejson.encoder._floatstr)(o, self.allow_nan)
-        elif isinstance(o, (list, tuple)):
-            for chunk in self._iterencode_list(o, markers):
-                yield chunk
-        elif isinstance(o, dict):
-            for chunk in self._iterencode_dict(o, markers):
-                yield chunk
-        else:
-            if markers is not None:
-                markerid = id(o)
-                if markerid in markers:
-                    raise ValueError("Circular reference detected")
-                markers[markerid] = o
-            for chunk in self._iterencode_default(o, markers):
-                yield chunk
-            if markers is not None:
-                del markers[markerid]
-
-encoder = JSObjectEncoder()
-
-class JSBridgeDisconnectError(Exception): 
-    """exception raised when an unexpected disconect happens"""
-
-
-class Bridge(Telnet):
-    
-    trashes = []
-    reading = False
-    sbuffer = ''
-    events_list = []
-
-    callbacks = {}
-        
-    bridge_type = "bridge"
-    
-    registered = False
-    timeout_ctr = 0. # global timeout counter
-    
-    def __init__(self, host, port, timeout=60.):
-        """
-        - timeout : failsafe timeout for each call to run in seconds
-        """
-        self.timeout = timeout
-        Telnet.__init__(self, host, port)
-        sleep(.1)
-
-        # XXX we've actually already connected in Telnet
-        self.connect((host, port))
-    
-    def handle_connect(self):
-        self.register()
-
-    def run(self, _uuid, exec_string, interval=.2, raise_exeption=True):
-
-
-        exec_string += '\r\n'
-        self.send(exec_string)
-
-        while _uuid not in self.callbacks.keys():
-
-            Bridge.timeout_ctr += interval
-            if Bridge.timeout_ctr > self.timeout:
-                print 'Timeout: %s' % exec_string
-                raise JSBridgeDisconnectError("Connection timed out")
-            
-            sleep(interval)
-            try:
-                self.send('')
-            except socket.error, e:
-                raise JSBridgeDisconnectError("JSBridge Socket Disconnected: %s" % e)
-
-        Bridge.timeout_ctr = 0. # reset the counter
-        
-        callback = self.callbacks.pop(_uuid)
-        if callback['result'] is False and raise_exeption is True:
-            raise JavaScriptException(callback['exception'])
-        return callback 
-        
-    def register(self):
-        _uuid = str(uuid.uuid1())
-        self.send('bridge.register("'+_uuid+'", "'+self.bridge_type+'")\r\n')
-        self.registered = True
-
-    def execFunction(self, func_name, args, interval=.25):
-        _uuid = str(uuid.uuid1())
-        exec_args = [encoder.encode(_uuid), func_name, encoder.encode(args)]
-        return self.run(_uuid, 'bridge.execFunction('+ ', '.join(exec_args)+')', interval)
-        
-    def setAttribute(self, obj_name, name, value):
-        _uuid = str(uuid.uuid1())
-        exec_args = [encoder.encode(_uuid), obj_name, encoder.encode(name), encoder.encode(value)]
-        return self.run(_uuid, 'bridge.setAttribute('+', '.join(exec_args)+')')
-        
-    def set(self, obj_name):
-        _uuid = str(uuid.uuid1())
-        return self.run(_uuid, 'bridge.set('+', '.join([encoder.encode(_uuid), obj_name])+')')
-        
-    def describe(self, obj_name):
-        _uuid = str(uuid.uuid1())
-        return self.run(_uuid, 'bridge.describe('+', '.join([encoder.encode(_uuid), obj_name])+')')
-    
-    def fire_callbacks(self, obj):
-        self.callbacks[obj['uuid']] = obj
-    
-    def process_read(self, data):
-        """Parse out json objects and fire callbacks."""
-        self.sbuffer += data
-        self.reading = True
-        self.parsing = True
-        while self.parsing:
-            # Remove erroneus data in front of callback object
-            index = self.sbuffer.find('{')
-            if index is not -1 and index is not 0:
-                self.sbuffer = self.sbuffer[index:]
-            # Try to get a json object from the data stream    
-            try:
-                obj, index = decoder.raw_decode(self.sbuffer)
-            except Exception, e:
-                self.parsing = False
-            # If we got an object fire the callback infra    
-            if self.parsing:
-                self.fire_callbacks(obj)
-                self.sbuffer = self.sbuffer[index:]
-        
-class BackChannel(Bridge):
-    
-    bridge_type = "backchannel"
-    
-    def __init__(self, host, port):
-        Bridge.__init__(self, host, port)
-        self.uuid_listener_index = {}
-        self.event_listener_index = {}
-        self.global_listeners = []
-        
-    def fire_callbacks(self, obj):
-        """Handle all callback fireing on json objects pulled from the data stream."""
-        self.fire_event(**dict([(str(key), value,) for key, value in obj.items()]))
-
-    def add_listener(self, callback, uuid=None, eventType=None):
-        if uuid is not None:
-            self.uuid_listener_index.setdefault(uuid, []).append(callback)
-        if eventType is not None:
-            self.event_listener_index.setdefault(eventType, []).append(callback)
-
-    def add_global_listener(self, callback):
-        self.global_listeners.append(callback)
-
-    def fire_event(self, eventType=None, uuid=None, result=None, exception=None):
-        Bridge.timeout_ctr = 0. # reset the counter
-        event = eventType
-        if uuid is not None and self.uuid_listener_index.has_key(uuid):
-            for callback in self.uuid_listener_index[uuid]:
-                callback(result)
-        if event is not None and self.event_listener_index.has_key(event):
-            for callback in self.event_listener_index[event]:
-                callback(result)
-        for listener in self.global_listeners:
-            listener(eventType, result)
-
-thread = None
- 
-def create_network(hostname, port):
-    back_channel = BackChannel(hostname, port)
-    bridge = Bridge(hostname, port)
-    global thread
-    if not thread or not thread.isAlive():
-        def do():
-            try: asyncore.loop(use_poll=True)
-            except select.error:pass
-            
-        thread = Thread(target=do)
-        getattr(thread, 'setDaemon', lambda x : None)(True)
-        thread.start()
-    
-    return back_channel, bridge
deleted file mode 100644
--- a/mail/test/resources/jsbridge/setup.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is Mozilla Corporation Code.
-#
-# The Initial Developer of the Original Code is
-# Mikeal Rogers.
-# Portions created by the Initial Developer are Copyright (C) 2008
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#  Mikeal Rogers <mikeal.rogers@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-import sys
-from setuptools import setup, find_packages
-
-desc = """Python to JavaScript bridge interface."""
-summ = """A powerful and extensible Python to JavaScript bridge interface."""
-
-PACKAGE_NAME = "jsbridge"
-PACKAGE_VERSION = "2.4.4b4"
-
-requires = ['mozrunner == 2.5.5b4']
-
-if not sys.version.startswith('2.6'):
-    requires.append('simplejson')
-
-setup(name=PACKAGE_NAME,
-      version=PACKAGE_VERSION,
-      description=desc,
-      long_description=summ,
-      author='Mikeal Rogers, Mozilla',
-      author_email='mikeal.rogers@gmail.com',
-      url='http://github.com/mozautomation/mozmill',
-      license='http://www.apache.org/licenses/LICENSE-2.0',
-      packages=find_packages(exclude=['test']),
-      include_package_data=True,
-      package_data = {'': ['*.js', '*.css', '*.html', '*.txt', '*.xpi', '*.rdf', '*.xul', '*.jsm', '*.xml' 'extension'],},
-      zip_safe=False,
-      entry_points="""
-          [console_scripts]
-          jsbridge = jsbridge:cli
-        """,
-      platforms =['Any'],
-      install_requires = requires,
-      classifiers=['Development Status :: 4 - Beta',
-                   'Environment :: Console',
-                   'Intended Audience :: Developers',
-                   'License :: OSI Approved :: Apache Software License',
-                   'Operating System :: OS Independent',
-                   'Topic :: Software Development :: Libraries :: Python Modules',
-                  ]
-     )
deleted file mode 100644
--- a/mail/test/resources/mozmill/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-recursive-include docs *
-recursive-include mozmill/extension *
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/Makefile
+++ /dev/null
@@ -1,75 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html web pickle htmlhelp latex changes linkcheck
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html      to make standalone HTML files"
-	@echo "  pickle    to make pickle files"
-	@echo "  json      to make JSON files"
-	@echo "  htmlhelp  to make HTML files and a HTML help project"
-	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  changes   to make an overview over all changed/added/deprecated items"
-	@echo "  linkcheck to check all external links for integrity"
-
-clean:
-	-rm -rf _build/*
-
-html:
-	mkdir -p _build/html _build/doctrees
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
-	@echo
-	@echo "Build finished. The HTML pages are in _build/html."
-
-pickle:
-	mkdir -p _build/pickle _build/doctrees
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-web: pickle
-
-json:
-	mkdir -p _build/json _build/doctrees
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	mkdir -p _build/htmlhelp _build/doctrees
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in _build/htmlhelp."
-
-latex:
-	mkdir -p _build/latex _build/doctrees
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in _build/latex."
-	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
-	      "run these through (pdf)latex."
-
-changes:
-	mkdir -p _build/changes _build/doctrees
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
-	@echo
-	@echo "The overview file is in _build/changes."
-
-linkcheck:
-	mkdir -p _build/linkcheck _build/doctrees
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in _build/linkcheck/output.txt."
deleted file mode 100644
index e86b37588750230abe690cd9488c6c38fb5ad607..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 15c791446ca392f54af3299a84533327f8b95dc3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_sources/index.txt
+++ /dev/null
@@ -1,188 +0,0 @@
-:mod:`mozmill` --- Full automation of XULRunner applications.
-=============================================================
-
-.. module:: mozmill
-   :synopsis: Full automation of XULRunner applications.
-.. moduleauthor:: Mikeal Rogers <mikeal.rogers@gmail.com>
-.. sectionauthor:: Mikeal Rogers <mikeal.rogers@gmail.com>
-
-Command Line Usage
-------------------
-
-The mozmill command line is versatile and includes a fair amount of debugging options. Even though all these options are available mozmill should run by default without any arguments and find your locally installed Firefox and run with mozmill.
-
-In most modes, ctrl-c will shut down Firefox and exit out of the mozmill Python side as well.
-
-.. code-block:: none
-      
-      $ mozmill
-
-.. cmdoption:: -h, --help
-
-   Show help message.
-
-.. cmdoption:: -b <binary>, --binary <binary>
-
-   Specify application binary location.
-   
-   Default :class:`mozrunner.Profile` and :class:`mozrunner.Runner` are still 
-   :class:`mozrunner.FirefoxProfile` and :class:`mozrunner.FirefoxRunner`. You can
-   change this by creating your own command line utility by subclassing :class:`CLI`
-   
-.. cmdoption:: -d <defaultprofile>
-
-   Specify the path to the default **clean** profile used to create new profiles.
-
-.. cmdoption:: -n, --no-new-profile
-
-   Do not create a new fresh profile.
-   
-.. cmdoption:: -p <profile>, --profile <profile>
-
-   Specifies a profile to use. Must be used with --no-new-profile.
-
-.. cmdoption:: -w <plugins>, --plugins <plugins>
-
-   Comma seperated list of additional paths to plugins to install.
-
-   Plugins can be either .xpi zip compressed extensions or deflated extension directories.
-
-.. cmdoption:: -l <logfile>, --logfile <logfile>
-
-   Log all events to *logfile*.
-
-.. cmdoption:: --report <uri>
-
-   *Currently in development.*
-
-   POST results to given brasstacks results server at *uri*. 
-
-.. cmdoption:: -t <test>, --test <test>
-
-   Run *test*. Can be either single test file or directory of tests.
-
-.. cmdoption::  --showall
-
-   Show all test output.
-
-.. cmdoption:: -D, --debug
-
-   Install debugging extensions and run with -jsconole
-
-.. cmdoption:: --show-errors
-
-   Print all logger errors to the console. When running tests only test failures and skipped 
-   tests are printed, this option print all other errors.
-
-.. cmdoption:: -s, --shell
-
-   Starts a Python shell for debugging.
-
-.. cmdoption:: -u, --usecode
-
-   By default --shell mode will use iPython if install and fall back to using the code module.
-   This option forces the use of the code module instead of iPython even when installed.
-
-.. cmdoption:: -P <port>, --port <port>
-
-   Specify port for jsbridge.
-
-Command Line Class
-------------------
-
-.. class:: CLI
-
-   Inherits from :class:`jsbridge.CLI` which inherits from :class:`mozrunner.CLI`.
-   
-   All the heavy lifting is handled by jsbridge and mozrunner. If you are subclassing
-   this in order to creat a new command line interface be sure to call :func:`super` on all
-   related methods.
-   
-   .. attribute:: runner_class
-   
-      Default runner class. Should be subclass of :class:`mozrunner.Runner`.
-      Defaults to :class:`mozrunner.FirefoxRunner`. 
-
-   .. attribute:: profile_class
-   
-      Default profile class. Should be subclass of :class:`mozruner.Profile`.
-      Defaults to :class:`mozrunner.FirefoxProfile`.
-
-Running MozMill from Python
----------------------------
-
-.. class:: MozMill([runner_class[, profile_class[, jsbridge_port]]])
-
-   Manages an instance of Firefox w/ jsbridge and provides facilities for running tests and
-   keeping track of results with callback methods.
-   
-   Default *runner_class* is :class:`mozrunner.FirefoxRunner`. Value should be a subclass of 
-   :class:`mozrunner.Runner`.
-   
-   Default *profile_class* is :class:`mozrunner.FirefoxProfile`. Value should be a subclass of 
-   :class:`mozrunner.Profile`.
-   
-   Default *jsbridge_port* is `24242`.
-   
-   .. attribute:: runner_class
-   
-      Set during initialization to subclass of :class:`mozrunner.Runner`.
-      
-   .. attribute:: profile_class
-   
-      Set during initialization to subclass of :class:`mozrunner.Profile`.
-   
-   .. attribute:: jsbridge_port
-   
-      Set during initialization to :class:`numbers.Integral`.
-   
-   .. method:: start([profile[, runner]])
-   
-      Start mozrunner and jsbridge pre-requisites.
-   
-      *profile* should be an instance of a `mozrunner.Profile` subclass. If one is not passed 
-      an instance of `self.profile_class` is created. `self.profile` will be set to this 
-      value.
-      
-      *runner* should be an instance of a `mozrunner.Runner` subclass. If one is not passed an 
-      instance of :attr:`runner_class` will be created. :attr:`runner` will be set to this value.
-      
-      This method will also run `runner.start()` and :func:`mozrunner.wait_and_create_network`
-      and sets :attr:`back_channel` and :attr:`bridge` to instances of 
-      :class:`jsbridge.BackChannel` and :class:`jsbridge.Bridge` respectively.
-      
-   .. attribute:: profile
-   
-      Set during :meth:`start` to subclass of :class:`mozrunner.Profile`.
-      
-   .. attribute:: runner
-   
-      Set during :meth:`start` to subclass of :class:`mozrunner.Runner`.
-      
-   .. attribute:: back_channel
-   
-      Set during :meth:`start` to subclass of :class:`jsbridge.BackChannel`.
-      
-   .. attribute:: bridge
-   
-      Set during :meth:`start` to subclass of :class:`jsbridge.Bridge`
-
-   .. method:: run_tests(test[, report])
-   
-      Run *test* in live Firefox using :attr:`bridge`.
-      
-      Adds local listeners :meth:`endTest_listener` and :meth:`endRunner_listener` to 
-      `"endTest"` and `"endRunner"` events using :meth:`jsbridge.BackChannel.add_listener` of
-      :attr:`back_channel`.
-      
-      When tests are done the results are posted to a results server at *report* if passed.
-      
-   .. method:: endTest_listener(test)
-   
-      When a test is finished the test object will be passed to this callback.
-      
-   .. method:: endRunner_listener(obj)
-   
-      When all the tests are done running this callback will be fired.
-   
-   
\ No newline at end of file
deleted file mode 100644
index 7fb82154a1748d507925865d3fbf7508d62483e5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/default.css
+++ /dev/null
@@ -1,657 +0,0 @@
-/**
- * Sphinx Doc Design
- */
-
-body {
-    font-family: sans-serif;
-    font-size: 100%;
-    background-color: #11303d;
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-/* :::: LAYOUT :::: */
-
-div.document {
-    background-color: #1c4e63;
-}
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 0 0 230px;
-}
-
-div.body {
-    background-color: white;
-    padding: 0 20px 30px 20px;
-}
-
-div.sphinxsidebarwrapper {
-    padding: 10px 5px 0 10px;
-}
-
-div.sphinxsidebar {
-    float: left;
-    width: 230px;
-    margin-left: -100%;
-    font-size: 90%;
-}
-
-div.clearer {
-    clear: both;
-}
-
-div.footer {
-    color: #fff;
-    width: 100%;
-    padding: 9px 0 9px 0;
-    text-align: center;
-    font-size: 75%;
-}
-
-div.footer a {
-    color: #fff;
-    text-decoration: underline;
-}
-
-div.related {
-    background-color: #133f52;
-    color: #fff;
-    width: 100%;
-    line-height: 30px;
-    font-size: 90%;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-div.related a {
-    color: white;
-}
-
-/* ::: TOC :::: */
-div.sphinxsidebar h3 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: white;
-    font-size: 1.4em;
-    font-weight: normal;
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar h3 a {
-    color: white;
-}
-
-div.sphinxsidebar h4 {
-    font-family: 'Trebuchet MS', sans-serif;
-    color: white;
-    font-size: 1.3em;
-    font-weight: normal;
-    margin: 5px 0 0 0;
-    padding: 0;
-}
-
-div.sphinxsidebar p {
-    color: white;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    padding: 0;
-    list-style: none;
-    color: white;
-}
-
-div.sphinxsidebar ul ul,
-div.sphinxsidebar ul.want-points {
-    margin-left: 20px;
-    list-style: square;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar a {
-    color: #98dbcc;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-/* :::: MODULE CLOUD :::: */
-div.modulecloud {
-    margin: -5px 10px 5px 10px;
-    padding: 10px;
-    line-height: 160%;
-    border: 1px solid #cbe7e5;
-    background-color: #f2fbfd;
-}
-
-div.modulecloud a {
-    padding: 0 5px 0 5px;
-}
-
-/* :::: SEARCH :::: */
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* :::: COMMON FORM STYLES :::: */
-
-div.actions {
-    padding: 5px 10px 5px 10px;
-    border-top: 1px solid #cbe7e5;
-    border-bottom: 1px solid #cbe7e5;
-    background-color: #e0f6f4;
-}
-
-form dl {
-    color: #333;
-}
-
-form dt {
-    clear: both;
-    float: left;
-    min-width: 110px;
-    margin-right: 10px;
-    padding-top: 2px;
-}
-
-input#homepage {
-    display: none;
-}
-
-div.error {
-    margin: 5px 20px 0 0;
-    padding: 5px;
-    border: 1px solid #d00;
-    font-weight: bold;
-}
-
-/* :::: INDEX PAGE :::: */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-/* :::: INDEX STYLES :::: */
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-form.pfform {
-    margin: 10px 0 20px 0;
-}
-
-/* :::: GLOBAL STYLES :::: */
-
-.docwarning {
-    background-color: #ffe4e4;
-    padding: 10px;
-    margin: 0 -20px 0 -20px;
-    border-bottom: 1px solid #f66;
-}
-
-p.subhead {
-    font-weight: bold;
-    margin-top: 20px;
-}
-
-a {
-    color: #355f7c;
-    text-decoration: none;
-}
-
-a:hover {
-    text-decoration: underline;
-}
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: 'Trebuchet MS', sans-serif;
-    background-color: #f2f2f2;
-    font-weight: normal;
-    color: #20435c;
-    border-bottom: 1px solid #ccc;
-    margin: 20px -20px 10px -20px;
-    padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li {
-    text-align: justify;
-    line-height: 130%;
-}
-
-div.body p.caption {
-    text-align: inherit;
-}
-
-div.body td {
-    text-align: left;
-}
-
-ul.fakelist {
-    list-style: none;
-    margin: 10px 0 10px 20px;
-    padding: 0;
-}
-
-.field-list ul {
-    padding-left: 1em;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-/* "Footnotes" heading */
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-/* Sidebars */
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-/* "Topics" */
-
-div.topic {
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* Admonitions */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-div.admonition p.admonition-title + p {
-    display: inline;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-table.docutils {
-    border: 0;
-}
-
-table.docutils td, table.docutils th {
-    padding: 1px 8px 1px 0;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-dl {
-    margin-bottom: 15px;
-    clear: both;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-.refcount {
-    color: #060;
-}
-
-dt:target,
-.highlight {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-pre {
-    padding: 5px;
-    background-color: #efc;
-    color: #333;
-    border: 1px solid #ac9;
-    border-left: none;
-    border-right: none;
-    overflow: auto;
-}
-
-td.linenos pre {
-    padding: 5px 0px;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-tt {
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-    font-size: 0.95em;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-.footnote:target  { background-color: #ffa }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-form.comment {
-    margin: 0;
-    padding: 10px 30px 10px 30px;
-    background-color: #eee;
-}
-
-form.comment h3 {
-    background-color: #326591;
-    color: white;
-    margin: -10px -30px 10px -30px;
-    padding: 5px;
-    font-size: 1.4em;
-}
-
-form.comment input,
-form.comment textarea {
-    border: 1px solid #ccc;
-    padding: 2px;
-    font-family: sans-serif;
-    font-size: 100%;
-}
-
-form.comment input[type="text"] {
-    width: 240px;
-}
-
-form.comment textarea {
-    width: 100%;
-    height: 200px;
-    margin-bottom: 10px;
-}
-
-.system-message {
-    background-color: #fda;
-    padding: 5px;
-    border: 3px solid red;
-}
-
-img.math {
-    vertical-align: middle;
-}
-
-div.math p {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-img.logo {
-    border: 0;
-}
-
-/* :::: PRINT :::: */
-@media print {
-    div.document,
-    div.documentwrapper,
-    div.bodywrapper {
-        margin: 0;
-        width : 100%;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    div#comments div.new-comment-box,
-    #top-link {
-        display: none;
-    }
-}
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/doctools.js
+++ /dev/null
@@ -1,232 +0,0 @@
-/// XXX: make it cross browser
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
- */
-if (!window.console || !console.firebug) {
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
-      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
-  window.console = {};
-  for (var i = 0; i < names.length; ++i)
-    window.console[names[i]] = function() {}
-}
-
-/**
- * small helper function to urldecode strings
- */
-jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
-}
-
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
-
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
-    s = document.location.search;
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
-  var result = {};
-  for (var i = 0; i < parts.length; i++) {
-    var tmp = parts[i].split('=', 2);
-    var key = jQuery.urldecode(tmp[0]);
-    var value = jQuery.urldecode(tmp[1]);
-    if (key in result)
-      result[key].push(value);
-    else
-      result[key] = [value];
-  }
-  return result;
-}
-
-/**
- * small function to check if an array contains
- * a given item.
- */
-jQuery.contains = function(arr, item) {
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] == item)
-      return true;
-  }
-  return false;
-}
-
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
-      var val = node.nodeValue;
-      var pos = val.toLowerCase().indexOf(text);
-      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
-          document.createTextNode(val.substr(pos + text.length)),
-          node.nextSibling));
-        node.nodeValue = val.substr(0, pos);
-      }
-    }
-    else if (!jQuery(node).is("button, select, textarea")) {
-      jQuery.each(node.childNodes, function() {
-        highlight(this)
-      });
-    }
-  }
-  return this.each(function() {
-    highlight(this);
-  });
-}
-
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
-
-  init : function() {
-    this.fixFirefoxAnchorBug();
-    this.highlightSearchWords();
-    this.initModIndex();
-  },
-
-  /**
-   * i18n support
-   */
-  TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
-  LOCALE : 'unknown',
-
-  // gettext and ngettext don't access this so that the functions
-  // can savely bound to a different name (_ = Documentation.gettext)
-  gettext : function(string) {
-    var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
-      return string;
-    return (typeof translated == 'string') ? translated : translated[0];
-  },
-
-  ngettext : function(singular, plural, n) {
-    var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
-      return (n == 1) ? singular : plural;
-    return translated[Documentation.PLURALEXPR(n)];
-  },
-
-  addTranslations : function(catalog) {
-    for (var key in catalog.messages)
-      this.TRANSLATIONS[key] = catalog.messages[key];
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
-    this.LOCALE = catalog.locale;
-  },
-
-  /**
-   * add context elements like header anchor links
-   */
-  addContextElements : function() {
-    $('div[@id] > :header:first').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this headline')).
-      appendTo(this);
-    });
-    $('dt[@id]').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this definition')).
-      appendTo(this);
-    });
-  },
-
-  /**
-   * workaround a firefox stupidity
-   */
-  fixFirefoxAnchorBug : function() {
-    if (document.location.hash && $.browser.mozilla)
-      window.setTimeout(function() {
-        document.location.href += '';
-      }, 10);
-  },
-
-  /**
-   * highlight the search words provided in the url in the text
-   */
-  highlightSearchWords : function() {
-    var params = $.getQueryParameters();
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
-    if (terms.length) {
-      var body = $('div.body');
-      window.setTimeout(function() {
-        $.each(terms, function() {
-          body.highlightText(this.toLowerCase(), 'highlight');
-        });
-      }, 10);
-      $('<li class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
-          .appendTo($('.sidebar .this-page-menu'));
-    }
-  },
-
-  /**
-   * init the modindex toggle buttons
-   */
-  initModIndex : function() {
-    var togglers = $('img.toggler').click(function() {
-      var src = $(this).attr('src');
-      var idnum = $(this).attr('id').substr(7);
-      console.log($('tr.cg-' + idnum).toggle());
-      if (src.substr(-9) == 'minus.png')
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
-      else
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
-    }).css('display', '');
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
-        togglers.click();
-    }
-  },
-
-  /**
-   * helper function to hide the search marks again
-   */
-  hideSearchWords : function() {
-    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
-    $('span.highlight').removeClass('highlight');
-  },
-
-  /**
-   * make the url absolute
-   */
-  makeURL : function(relativeURL) {
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
-  },
-
-  /**
-   * get the current relative url
-   */
-  getCurrentURL : function() {
-    var path = document.location.pathname;
-    var parts = path.split(/\//);
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
-        parts.pop();
-    });
-    var url = parts.join('/');
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
-  }
-};
-
-// quick alias for translations
-_ = Documentation.gettext;
-
-$(document).ready(function() {
-  Documentation.init();
-});
deleted file mode 100644
index d18082e397e7e54f20721af768c4c2983258f1b4..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/jquery.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * jQuery 1.2.6 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
- * $Rev: 5685 $
- */
-(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
-return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
-return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
-selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
-return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
-this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
-return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
-jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
-script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
-for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
-for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
-jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
-ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
-while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
-while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
-for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
-jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
-xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
-jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
-for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
-s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
-e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
deleted file mode 100644
index da1c5620d10c047525a467a425abe9ff5269cfc2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 1081dc1439fb984dfa7ef627afe3c7dc476fdbce..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index b3cb37425ea68b39ffa7b2e5fb69161275a87541..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/pygments.css
+++ /dev/null
@@ -1,61 +0,0 @@
-.hll { background-color: #ffffcc }
-.c { color: #408090; font-style: italic } /* Comment */
-.err { border: 1px solid #FF0000 } /* Error */
-.k { color: #007020; font-weight: bold } /* Keyword */
-.o { color: #666666 } /* Operator */
-.cm { color: #408090; font-style: italic } /* Comment.Multiline */
-.cp { color: #007020 } /* Comment.Preproc */
-.c1 { color: #408090; font-style: italic } /* Comment.Single */
-.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
-.gd { color: #A00000 } /* Generic.Deleted */
-.ge { font-style: italic } /* Generic.Emph */
-.gr { color: #FF0000 } /* Generic.Error */
-.gh { color: #000080; font-weight: bold } /* Generic.Heading */
-.gi { color: #00A000 } /* Generic.Inserted */
-.go { color: #303030 } /* Generic.Output */
-.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
-.gs { font-weight: bold } /* Generic.Strong */
-.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.gt { color: #0040D0 } /* Generic.Traceback */
-.kc { color: #007020; font-weight: bold } /* Keyword.Constant */
-.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #007020 } /* Keyword.Pseudo */
-.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #902000 } /* Keyword.Type */
-.m { color: #208050 } /* Literal.Number */
-.s { color: #4070a0 } /* Literal.String */
-.na { color: #4070a0 } /* Name.Attribute */
-.nb { color: #007020 } /* Name.Builtin */
-.nc { color: #0e84b5; font-weight: bold } /* Name.Class */
-.no { color: #60add5 } /* Name.Constant */
-.nd { color: #555555; font-weight: bold } /* Name.Decorator */
-.ni { color: #d55537; font-weight: bold } /* Name.Entity */
-.ne { color: #007020 } /* Name.Exception */
-.nf { color: #06287e } /* Name.Function */
-.nl { color: #002070; font-weight: bold } /* Name.Label */
-.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
-.nt { color: #062873; font-weight: bold } /* Name.Tag */
-.nv { color: #bb60d5 } /* Name.Variable */
-.ow { color: #007020; font-weight: bold } /* Operator.Word */
-.w { color: #bbbbbb } /* Text.Whitespace */
-.mf { color: #208050 } /* Literal.Number.Float */
-.mh { color: #208050 } /* Literal.Number.Hex */
-.mi { color: #208050 } /* Literal.Number.Integer */
-.mo { color: #208050 } /* Literal.Number.Oct */
-.sb { color: #4070a0 } /* Literal.String.Backtick */
-.sc { color: #4070a0 } /* Literal.String.Char */
-.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
-.s2 { color: #4070a0 } /* Literal.String.Double */
-.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
-.sh { color: #4070a0 } /* Literal.String.Heredoc */
-.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
-.sx { color: #c65d09 } /* Literal.String.Other */
-.sr { color: #235388 } /* Literal.String.Regex */
-.s1 { color: #4070a0 } /* Literal.String.Single */
-.ss { color: #517918 } /* Literal.String.Symbol */
-.bp { color: #007020 } /* Name.Builtin.Pseudo */
-.vc { color: #bb60d5 } /* Name.Variable.Class */
-.vg { color: #bb60d5 } /* Name.Variable.Global */
-.vi { color: #bb60d5 } /* Name.Variable.Instance */
-.il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/rightsidebar.css
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Sphinx Doc Design -- Right Side Bar Overrides
- */
-
-
-div.sphinxsidebar {
-    float: right;
-}
-
-div.bodywrapper {
-    margin: 0 230px 0 0;
-}
-
-div.inlinecomments {
-    right: 250px;
-}
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/searchtools.js
+++ /dev/null
@@ -1,467 +0,0 @@
-/**
- * helper function to return a node containing the
- * search summary for a given text. keywords is a list
- * of stemmed words, hlwords is the list of normal, unstemmed
- * words. the first one is used to find the occurance, the
- * latter for highlighting it.
- */
-
-jQuery.makeSearchSummary = function(text, keywords, hlwords) {
-  var textLower = text.toLowerCase();
-  var start = 0;
-  $.each(keywords, function() {
-    var i = textLower.indexOf(this.toLowerCase());
-    if (i > -1)
-      start = i;
-  });
-  start = Math.max(start - 120, 0);
-  var excerpt = ((start > 0) ? '...' : '') +
-  $.trim(text.substr(start, 240)) +
-  ((start + 240 - text.length) ? '...' : '');
-  var rv = $('<div class="context"></div>').text(excerpt);
-  $.each(hlwords, function() {
-    rv = rv.highlightText(this, 'highlight');
-  });
-  return rv;
-}
-
-/**
- * Porter Stemmer
- */
-var PorterStemmer = function() {
-
-  var step2list = {
-    ational: 'ate',
-    tional: 'tion',
-    enci: 'ence',
-    anci: 'ance',
-    izer: 'ize',
-    bli: 'ble',
-    alli: 'al',
-    entli: 'ent',
-    eli: 'e',
-    ousli: 'ous',
-    ization: 'ize',
-    ation: 'ate',
-    ator: 'ate',
-    alism: 'al',
-    iveness: 'ive',
-    fulness: 'ful',
-    ousness: 'ous',
-    aliti: 'al',
-    iviti: 'ive',
-    biliti: 'ble',
-    logi: 'log'
-  };
-
-  var step3list = {
-    icate: 'ic',
-    ative: '',
-    alize: 'al',
-    iciti: 'ic',
-    ical: 'ic',
-    ful: '',
-    ness: ''
-  };
-
-  var c = "[^aeiou]";          // consonant
-  var v = "[aeiouy]";          // vowel
-  var C = c + "[^aeiouy]*";    // consonant sequence
-  var V = v + "[aeiou]*";      // vowel sequence
-
-  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
-  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
-  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
-  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
-
-  this.stemWord = function (w) {
-    var stem;
-    var suffix;
-    var firstch;
-    var origword = w;
-
-    if (w.length < 3)
-      return w;
-
-    var re;
-    var re2;
-    var re3;
-    var re4;
-
-    firstch = w.substr(0,1);
-    if (firstch == "y")
-      w = firstch.toUpperCase() + w.substr(1);
-
-    // Step 1a
-    re = /^(.+?)(ss|i)es$/;
-    re2 = /^(.+?)([^s])s$/;
-
-    if (re.test(w))
-      w = w.replace(re,"$1$2");
-    else if (re2.test(w))
-      w = w.replace(re2,"$1$2");
-
-    // Step 1b
-    re = /^(.+?)eed$/;
-    re2 = /^(.+?)(ed|ing)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      re = new RegExp(mgr0);
-      if (re.test(fp[1])) {
-        re = /.$/;
-        w = w.replace(re,"");
-      }
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1];
-      re2 = new RegExp(s_v);
-      if (re2.test(stem)) {
-        w = stem;
-        re2 = /(at|bl|iz)$/;
-        re3 = new RegExp("([^aeiouylsz])\\1$");
-        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-        if (re2.test(w))
-          w = w + "e";
-        else if (re3.test(w)) {
-          re = /.$/;
-          w = w.replace(re,"");
-        }
-        else if (re4.test(w))
-          w = w + "e";
-      }
-    }
-
-    // Step 1c
-    re = /^(.+?)y$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(s_v);
-      if (re.test(stem))
-        w = stem + "i";
-    }
-
-    // Step 2
-    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step2list[suffix];
-    }
-
-    // Step 3
-    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      suffix = fp[2];
-      re = new RegExp(mgr0);
-      if (re.test(stem))
-        w = stem + step3list[suffix];
-    }
-
-    // Step 4
-    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
-    re2 = /^(.+?)(s|t)(ion)$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      if (re.test(stem))
-        w = stem;
-    }
-    else if (re2.test(w)) {
-      var fp = re2.exec(w);
-      stem = fp[1] + fp[2];
-      re2 = new RegExp(mgr1);
-      if (re2.test(stem))
-        w = stem;
-    }
-
-    // Step 5
-    re = /^(.+?)e$/;
-    if (re.test(w)) {
-      var fp = re.exec(w);
-      stem = fp[1];
-      re = new RegExp(mgr1);
-      re2 = new RegExp(meq1);
-      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
-        w = stem;
-    }
-    re = /ll$/;
-    re2 = new RegExp(mgr1);
-    if (re.test(w) && re2.test(w)) {
-      re = /.$/;
-      w = w.replace(re,"");
-    }
-
-    // and turn initial Y back to y
-    if (firstch == "y")
-      w = firstch.toLowerCase() + w.substr(1);
-    return w;
-  }
-}
-
-
-/**
- * Search Module
- */
-var Search = {
-
-  _index : null,
-  _queued_query : null,
-  _pulse_status : -1,
-
-  init : function() {
-      var params = $.getQueryParameters();
-      if (params.q) {
-          var query = params.q[0];
-          $('input[@name="q"]')[0].value = query;
-          this.performSearch(query);
-      }
-  },
-
-  /**
-   * Sets the index
-   */
-  setIndex : function(index) {
-    var q;
-    this._index = index;
-    if ((q = this._queued_query) !== null) {
-      this._queued_query = null;
-      Search.query(q);
-    }
-  },
-
-  hasIndex : function() {
-      return this._index !== null;
-  },
-
-  deferQuery : function(query) {
-      this._queued_query = query;
-  },
-
-  stopPulse : function() {
-      this._pulse_status = 0;
-  },
-
-  startPulse : function() {
-    if (this._pulse_status >= 0)
-        return;
-    function pulse() {
-      Search._pulse_status = (Search._pulse_status + 1) % 4;
-      var dotString = '';
-      for (var i = 0; i < Search._pulse_status; i++)
-        dotString += '.';
-      Search.dots.text(dotString);
-      if (Search._pulse_status > -1)
-        window.setTimeout(pulse, 500);
-    };
-    pulse();
-  },
-
-  /**
-   * perform a search for something
-   */
-  performSearch : function(query) {
-    // create the required interface elements
-    this.out = $('#search-results');
-    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
-    this.dots = $('<span></span>').appendTo(this.title);
-    this.status = $('<p style="display: none"></p>').appendTo(this.out);
-    this.output = $('<ul class="search"/>').appendTo(this.out);
-
-    $('#search-progress').text(_('Preparing search...'));
-    this.startPulse();
-
-    // index already loaded, the browser was quick!
-    if (this.hasIndex())
-      this.query(query);
-    else
-      this.setQuery(query);
-  },
-
-  query : function(query) {
-    // stem the searchterms and add them to the
-    // correct list
-    var stemmer = new PorterStemmer();
-    var searchterms = [];
-    var excluded = [];
-    var hlterms = [];
-    var tmp = query.split(/\s+/);
-    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
-    for (var i = 0; i < tmp.length; i++) {
-      // stem the word
-      var word = stemmer.stemWord(tmp[i]).toLowerCase();
-      // select the correct list
-      if (word[0] == '-') {
-        var toAppend = excluded;
-        word = word.substr(1);
-      }
-      else {
-        var toAppend = searchterms;
-        hlterms.push(tmp[i].toLowerCase());
-      }
-      // only add if not already in the list
-      if (!$.contains(toAppend, word))
-        toAppend.push(word);
-    };
-    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
-    console.debug('SEARCH: searching for:');
-    console.info('required: ', searchterms);
-    console.info('excluded: ', excluded);
-
-    // prepare search
-    var filenames = this._index.filenames;
-    var titles = this._index.titles;
-    var terms = this._index.terms;
-    var descrefs = this._index.descrefs;
-    var modules = this._index.modules;
-    var desctypes = this._index.desctypes;
-    var fileMap = {};
-    var files = null;
-    var objectResults = [];
-    var regularResults = [];
-    $('#search-progress').empty();
-
-    // lookup as object
-    if (object != null) {
-      for (var module in modules) {
-        if (module.indexOf(object) > -1) {
-          fn = modules[module];
-          descr = _('module, in ') + titles[fn];
-          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
-        }
-      }
-      for (var prefix in descrefs) {
-        for (var name in descrefs[prefix]) {
-          if (name.toLowerCase().indexOf(object) > -1) {
-            match = descrefs[prefix][name];
-            fullname = (prefix ? prefix + '.' : '') + name;
-            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
-            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
-          }
-        }
-      }
-    }
-
-    // sort results descending
-    objectResults.sort(function(a, b) {
-      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
-    });
-
-
-    // perform the search on the required terms
-    for (var i = 0; i < searchterms.length; i++) {
-      var word = searchterms[i];
-      // no match but word was a required one
-      if ((files = terms[word]) == null)
-        break;
-      if (files.length == undefined) {
-        files = [files];
-      }
-      // create the mapping
-      for (var j = 0; j < files.length; j++) {
-        var file = files[j];
-        if (file in fileMap)
-          fileMap[file].push(word);
-        else
-          fileMap[file] = [word];
-      }
-    }
-
-    // now check if the files don't contain excluded terms
-    for (var file in fileMap) {
-      var valid = true;
-
-      // check if all requirements are matched
-      if (fileMap[file].length != searchterms.length)
-        continue;
-
-      // ensure that none of the excluded terms is in the
-      // search result.
-      for (var i = 0; i < excluded.length; i++) {
-        if (terms[excluded[i]] == file ||
-            $.contains(terms[excluded[i]] || [], file)) {
-          valid = false;
-          break;
-        }
-      }
-
-      // if we have still a valid result we can add it
-      // to the result list
-      if (valid)
-        regularResults.push([filenames[file], titles[file], '', null]);
-    }
-
-    // delete unused variables in order to not waste
-    // memory until list is retrieved completely
-    delete filenames, titles, terms;
-
-    // now sort the regular results descending by title
-    regularResults.sort(function(a, b) {
-      var left = a[1].toLowerCase();
-      var right = b[1].toLowerCase();
-      return (left > right) ? -1 : ((left < right) ? 1 : 0);
-    });
-
-    // combine both
-    var results = regularResults.concat(objectResults);
-
-    // print the results
-    var resultCount = results.length;
-    function displayNextItem() {
-      // results left, load the summary and display it
-      if (results.length) {
-        var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
-        listItem.append($('<a/>').attr(
-          'href',
-          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
-          highlightstring + item[2]).html(item[1]));
-        if (item[3]) {
-          listItem.append($('<span> (' + item[3] + ')</span>'));
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
-          $.get('_sources/' + item[0] + '.txt', function(data) {
-            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
-            Search.output.append(listItem);
-            listItem.slideDown(5, function() {
-              displayNextItem();
-            });
-          });
-        } else {
-          // no source available, just display title
-          Search.output.append(listItem);
-          listItem.slideDown(5, function() {
-            displayNextItem();
-          });
-        }
-      }
-      // search finished, update title and status message
-      else {
-        Search.stopPulse();
-        Search.title.text(_('Search Results'));
-        if (!resultCount)
-          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
-        else
-            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
-        Search.status.fadeIn(500);
-      }
-    }
-    displayNextItem();
-  }
-}
-
-$(document).ready(function() {
-  Search.init();
-});
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/sphinxdoc.css
+++ /dev/null
@@ -1,557 +0,0 @@
-/**
- * Alternate Sphinx design
- * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.
- */
-
-body {
-    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;
-    font-size: 14px;
-    letter-spacing: -0.01em;
-    line-height: 150%;
-    text-align: center;
-    /*background-color: #AFC1C4; */
-    background-color: #BFD1D4;
-    color: black;
-    padding: 0;
-    border: 1px solid #aaa;
-
-    margin: 0px 80px 0px 80px;
-    min-width: 740px;
-}
-
-a {
-    color: #CA7900;
-    text-decoration: none;
-}
-
-a:hover {
-    color: #2491CF;
-}
-
-pre {
-    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
-    font-size: 0.95em;
-    letter-spacing: 0.015em;
-    padding: 0.5em;
-    border: 1px solid #ccc;
-    background-color: #f8f8f8;
-}
-
-td.linenos pre {
-    padding: 0.5em 0;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-cite, code, tt {
-    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
-    font-size: 0.95em;
-    letter-spacing: 0.01em;
-}
-
-hr {
-    border: 1px solid #abc;
-    margin: 2em;
-}
-
-tt {
-    background-color: #f2f2f2;
-    border-bottom: 1px solid #ddd;
-    color: #333;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-    border: 0;
-}
-
-tt.descclassname {
-    background-color: transparent;
-    border: 0;
-}
-
-tt.xref {
-    background-color: transparent;
-    font-weight: bold;
-    border: 0;
-}
-
-a tt {
-    background-color: transparent;
-    font-weight: bold;
-    border: 0;
-    color: #CA7900;
-}
-
-a tt:hover {
-    color: #2491CF;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-dl {
-    margin-bottom: 15px;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-.refcount {
-    color: #060;
-}
-
-dt:target,
-.highlight {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-pre {
-    line-height: 120%;
-}
-
-pre a {
-    color: inherit;
-    text-decoration: underline;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-div.document {
-    background-color: white;
-    text-align: left;
-    background-image: url(contents.png);
-    background-repeat: repeat-x;
-}
-
-/*
-div.documentwrapper {
-    width: 100%;
-}
-*/
-
-div.clearer {
-    clear: both;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    background-image: url(navigation.png);
-    height: 2em;
-    list-style: none;
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 0;
-    padding-left: 10px;
-}
-
-div.related ul li {
-    margin: 0;
-    padding: 0;
-    height: 2em;
-    float: left;
-}
-
-div.related ul li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-div.related ul li a {
-    margin: 0;
-    padding: 0 5px 0 5px;
-    line-height: 1.75em;
-    color: #EE9816;
-}
-
-div.related ul li a:hover {
-    color: #3CA8E7;
-}
-
-div.body {
-    margin: 0;
-    padding: 0.5em 20px 20px 20px;
-}
-
-div.bodywrapper {
-    margin: 0 240px 0 0;
-    border-right: 1px solid #ccc;
-}
-
-div.body a {
-    text-decoration: underline;
-}
-
-div.sphinxsidebar {
-    margin: 0;
-    padding: 0.5em 15px 15px 0;
-    width: 210px;
-    float: right;
-    text-align: left;
-/*    margin-left: -100%; */
-}
-
-div.sphinxsidebar h4, div.sphinxsidebar h3 {
-    margin: 1em 0 0.5em 0;
-    font-size: 0.9em;
-    padding: 0.1em 0 0.1em 0.5em;
-    color: white;
-    border: 1px solid #86989B;
-    background-color: #AFC1C4;
-}
-
-div.sphinxsidebar h3 a {
-    color: white;
-}
-
-div.sphinxsidebar ul {
-    padding-left: 1.5em;
-    margin-top: 7px;
-    list-style: none;
-    padding: 0;
-    line-height: 130%;
-}
-
-div.sphinxsidebar ul ul {
-    list-style: square;
-    margin-left: 20px;
-}
-
-p {
-    margin: 0.8em 0 0.5em 0;
-}
-
-p.rubric {
-    font-weight: bold;
-}
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-div.quotebar {
-    background-color: #f8f8f8;
-    max-width: 250px;
-    float: right;
-    padding: 2px 7px;
-    border: 1px solid #ccc;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-div.topic {
-    background-color: #f8f8f8;
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-}
-
-h1 {
-    margin: 0;
-    padding: 0.7em 0 0.3em 0;
-    font-size: 1.5em;
-    color: #11557C;
-}
-
-h2 {
-    margin: 1.3em 0 0.2em 0;
-    font-size: 1.35em;
-    padding: 0;
-}
-
-h3 {
-    margin: 1em 0 -0.3em 0;
-    font-size: 1.2em;
-}
-
-div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a {
-    color: black!important;
-}
-
-h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {
-    display: none;
-    margin: 0 0 0 0.3em;
-    padding: 0 0.2em 0 0.2em;
-    color: #aaa!important;
-}
-
-h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
-h5:hover a.anchor, h6:hover a.anchor {
-    display: inline;
-}
-
-h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
-h5 a.anchor:hover, h6 a.anchor:hover {
-    color: #777;
-    background-color: #eee;
-}
-
-table {
-    border-collapse: collapse;
-    margin: 0 -0.5em 0 -0.5em;
-}
-
-table td, table th {
-    padding: 0.2em 0.5em 0.2em 0.5em;
-}
-
-div.footer {
-    background-color: #E3EFF1;
-    color: #86989B;
-    padding: 3px 8px 3px 0;
-    clear: both;
-    font-size: 0.8em;
-    text-align: right;
-}
-
-div.footer a {
-    color: #86989B;
-    text-decoration: underline;
-}
-
-div.pagination {
-    margin-top: 2em;
-    padding-top: 0.5em;
-    border-top: 1px solid black;
-    text-align: center;
-}
-
-div.sphinxsidebar ul.toc {
-    margin: 1em 0 1em 0;
-    padding: 0 0 0 0.5em;
-    list-style: none;
-}
-
-div.sphinxsidebar ul.toc li {
-    margin: 0.5em 0 0.5em 0;
-    font-size: 0.9em;
-    line-height: 130%;
-}
-
-div.sphinxsidebar ul.toc li p {
-    margin: 0;
-    padding: 0;
-}
-
-div.sphinxsidebar ul.toc ul {
-    margin: 0.2em 0 0.2em 0;
-    padding: 0 0 0 1.8em;
-}
-
-div.sphinxsidebar ul.toc ul li {
-    padding: 0;
-}
-
-div.admonition, div.warning {
-    font-size: 0.9em;
-    margin: 1em 0 0 0;
-    border: 1px solid #86989B;
-    background-color: #f7f7f7;
-}
-
-div.admonition p, div.warning p {
-    margin: 0.5em 1em 0.5em 1em;
-    padding: 0;
-}
-
-div.admonition pre, div.warning pre {
-    margin: 0.4em 1em 0.4em 1em;
-}
-
-div.admonition p.admonition-title,
-div.warning p.admonition-title {
-    margin: 0;
-    padding: 0.1em 0 0.1em 0.5em;
-    color: white;
-    border-bottom: 1px solid #86989B;
-    font-weight: bold;
-    background-color: #AFC1C4;
-}
-
-div.warning {
-    border: 1px solid #940000;
-}
-
-div.warning p.admonition-title {
-    background-color: #CF0000;
-    border-bottom-color: #940000;
-}
-
-div.admonition ul, div.admonition ol,
-div.warning ul, div.warning ol {
-    margin: 0.1em 0.5em 0.5em 3em;
-    padding: 0;
-}
-
-div.versioninfo {
-    margin: 1em 0 0 0;
-    border: 1px solid #ccc;
-    background-color: #DDEAF0;
-    padding: 8px;
-    line-height: 1.3em;
-    font-size: 0.9em;
-}
-
-
-a.headerlink {
-    color: #c60f0f!important;
-    font-size: 1em;
-    margin-left: 6px;
-    padding: 0 4px 0 4px;
-    text-decoration: none!important;
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover {
-    background-color: #ccc;
-    color: white!important;
-}
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-form.pfform {
-    margin: 10px 0 20px 0;
-}
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-img.math {
-    vertical-align: center;
-}
-
-div.math {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-img.logo {
-    border: 0;
-}
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/stickysidebar.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Sphinx Doc Design -- Sticky sidebar Overrides
- */
-
-div.sphinxsidebar {
-    top: 30px;
-    left: 0px;
-    position: fixed;
-    margin: 0;
-    float: none;
-}
-
-div.related {
-    position: fixed;
-}
-
-div.documentwrapper {
-    margin-top: 30px;
-}
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/_static/traditional.css
+++ /dev/null
@@ -1,700 +0,0 @@
-/**
- * Sphinx Doc Design -- traditional python.org style
- */
-
-body {
-    color: #000;
-    margin: 0;
-    padding: 0;
-}
-
-/* :::: LAYOUT :::: */
-
-div.documentwrapper {
-    float: left;
-    width: 100%;
-}
-
-div.bodywrapper {
-    margin: 0 230px 0 0;
-}
-
-div.body {
-    background-color: white;
-    padding: 0 20px 30px 20px;
-}
-
-div.sphinxsidebarwrapper {
-    border: 1px solid #99ccff;
-    padding: 10px;
-    margin: 10px 15px 10px 0;
-}
-
-div.sphinxsidebar {
-    float: right;
-    margin-left: -100%;
-    width: 230px;
-}
-
-div.clearer {
-    clear: both;
-}
-
-div.footer {
-    clear: both;
-    width: 100%;
-    background-color: #99ccff;
-    padding: 9px 0 9px 0;
-    text-align: center;
-}
-
-div.related {
-    background-color: #99ccff;
-    color: #333;
-    width: 100%;
-    height: 30px;
-    line-height: 30px;
-    border-bottom: 5px solid white;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-    font-weight: bold;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-/* ::: SIDEBAR :::: */
-div.sphinxsidebar h3 {
-    margin: 0;
-}
-
-div.sphinxsidebar h4 {
-    margin: 5px 0 0 0;
-}
-
-div.sphinxsidebar p.topless {
-    margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
-    margin: 10px;
-    margin-left: 15px;
-    padding: 0;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-
-/* :::: SEARCH :::: */
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* :::: COMMON FORM STYLES :::: */
-
-div.actions {
-    border-top: 1px solid #aaa;
-    background-color: #ddd;
-    margin: 10px 0 0 -20px;
-    padding: 5px 0 5px 20px;
-}
-
-form dl {
-    color: #333;
-}
-
-form dt {
-    clear: both;
-    float: left;
-    min-width: 110px;
-    margin-right: 10px;
-    padding-top: 2px;
-}
-
-input#homepage {
-    display: none;
-}
-
-div.error {
-    margin: 5px 20px 0 0;
-    padding: 5px;
-    border: 1px solid #d00;
-    /*border: 2px solid #05171e;
-    background-color: #092835;
-    color: white;*/
-    font-weight: bold;
-}
-
-/* :::: INLINE COMMENTS :::: */
-
-div.inlinecommentswrapper {
-    float: right;
-    max-width: 40%;
-}
-
-div.commentmarker {
-    float: right;
-    background-image: url(style/comment.png);
-    background-repeat: no-repeat;
-    width: 25px;
-    height: 25px;
-    text-align: center;
-    padding-top: 3px;
-}
-
-div.nocommentmarker {
-    float: right;
-    background-image: url(style/nocomment.png);
-    background-repeat: no-repeat;
-    width: 25px;
-    height: 25px;
-}
-
-div.inlinecomments {
-    margin-left: 10px;
-    margin-bottom: 5px;
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 5px;
-}
-
-div.inlinecomment {
-    border-top: 1px solid #ccc;
-    padding-top: 5px;
-    margin-top: 5px;
-}
-
-.inlinecomments p {
-    margin: 5px 0 5px 0;
-}
-
-.inlinecomments .head {
-    font-weight: bold;
-}
-
-.inlinecomments .meta {
-    font-style: italic;
-}
-
-
-/* :::: COMMENTS :::: */
-
-div#comments h3 {
-    border-top: 1px solid #aaa;
-    padding: 5px 20px 5px 20px;
-    margin: 20px -20px 20px -20px;
-    background-color: #ddd;
-}
-
-/*
-div#comments {
-    background-color: #ccc;
-    margin: 40px -20px -30px -20px;
-    padding: 0 0 1px 0;
-}
-
-div#comments h4 {
-    margin: 30px 0 20px 0;
-    background-color: #aaa;
-    border-bottom: 1px solid #09232e;
-    color: #333;
-}
-
-div#comments form {
-    display: block;
-    margin: 0 0 0 20px;
-}
-
-div#comments textarea {
-    width: 98%;
-    height: 160px;
-}
-
-div#comments div.help {
-    margin: 20px 20px 10px 0;
-    background-color: #ccc;
-    color: #333;
-}
-
-div#comments div.help p {
-    margin: 0;
-    padding: 0 0 10px 0;
-}
-
-div#comments input, div#comments textarea {
-    font-family: 'Bitstream Vera Sans', 'Arial', sans-serif;
-    font-size: 13px;
-    color: black;
-    background-color: #aaa;
-    border: 1px solid #092835;
-}
-
-div#comments input[type="reset"],
-div#comments input[type="submit"] {
-    cursor: pointer;
-    font-weight: bold;
-    padding: 2px;
-    margin: 5px 5px 5px 0;
-    background-color: #666;
-    color: white;
-}
-
-div#comments div.comment {
-    margin: 10px 10px 10px 20px;
-    padding: 10px;
-    border: 1px solid #0f3646;
-    background-color: #aaa;
-    color: #333;
-}
-
-div#comments div.comment p {
-    margin: 5px 0 5px 0;
-}
-
-div#comments div.comment p.meta {
-    font-style: italic;
-    color: #444;
-    text-align: right;
-    margin: -5px 0 -5px 0;
-}
-
-div#comments div.comment h4 {
-    margin: -10px -10px 5px -10px;
-    padding: 3px;
-    font-size: 15px;
-    background-color: #888;
-    color: white;
-    border: 0;
-}
-
-div#comments div.comment pre,
-div#comments div.comment tt {
-    background-color: #ddd;
-    color: #111;
-    border: none;
-}
-
-div#comments div.comment a {
-    color: #fff;
-    text-decoration: underline;
-}
-
-div#comments div.comment blockquote {
-    margin: 10px;
-    padding: 10px;
-    border-left: 1px solid #0f3646;
-    /*border: 1px solid #0f3646;
-    background-color: #071c25;*/
-}
-
-div#comments em.important {
-    color: #d00;
-    font-weight: bold;
-    font-style: normal;
-}*/
-
-/* :::: SUGGEST CHANGES :::: */
-div#suggest-changes-box input, div#suggest-changes-box textarea {
-    border: 1px solid #ccc;
-    background-color: white;
-    color: black;
-}
-
-div#suggest-changes-box textarea {
-    width: 99%;
-    height: 400px;
-}
-
-
-/* :::: PREVIEW :::: */
-div.preview {
-    background-image: url(style/preview.png);
-    padding: 0 20px 20px 20px;
-    margin-bottom: 30px;
-}
-
-
-/* :::: INDEX PAGE :::: */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.5em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-}
-
-/* :::: GENINDEX STYLES :::: */
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-/* :::: GLOBAL STYLES :::: */
-
-p.subhead {
-    font-weight: bold;
-    margin-top: 20px;
-}
-
-a:link:active           { color: #ff0000; }
-a:link:hover            { background-color: #bbeeff; }
-a:visited:hover         { background-color: #bbeeff; }
-a:visited               { color: #551a8b; }
-a:link                  { color: #0000bb; }
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
-    font-family: avantgarde, sans-serif;
-    font-weight: bold;
-}
-
-div.body h1 { font-size: 180%; }
-div.body h2 { font-size: 150%; }
-div.body h3 { font-size: 120%; }
-div.body h4 { font-size: 120%; }
-
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink,
-a.headerlink {
-    color: #c60f0f;
-    font-size: 0.8em;
-    padding: 0 4px 0 4px;
-    text-decoration: none;
-    visibility: hidden;
-}
-
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink,
-*:hover > a.headerlink {
-    visibility: visible;
-}
-
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover,
-a.headerlink:hover {
-    background-color: #c60f0f;
-    color: white;
-}
-
-div.body p, div.body dd, div.body li {
-    text-align: justify;
-}
-
-div.body td {
-    text-align: left;
-}
-
-ul.fakelist {
-    list-style: none;
-    margin: 10px 0 10px 20px;
-    padding: 0;
-}
-
-/* "Footnotes" heading */
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-/* "Topics" */
-
-div.topic {
-    background-color: #eee;
-    border: 1px solid #ccc;
-    padding: 0 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* Admonitions */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dd {
-    margin-bottom: 10px;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-div.admonition p {
-    display: inline;
-}
-
-div.seealso {
-    background-color: #ffc;
-    border: 1px solid #ff6;
-}
-
-div.warning {
-    background-color: #ffe4e4;
-    border: 1px solid #f66;
-}
-
-div.note {
-    background-color: #eee;
-    border: 1px solid #ccc;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-    display: inline;
-}
-
-p.admonition-title:after {
-    content: ":";
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-table.docutils {
-    border: 0;
-}
-
-table.docutils td, table.docutils th {
-    padding: 0 8px 2px 0;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-dl {
-    margin-bottom: 15px;
-    clear: both;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-.refcount {
-    color: #060;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-pre {
-    font-family: monospace;
-    padding: 5px;
-    color: #00008b;
-    border-left: none;
-    border-right: none;
-}
-
-tt {
-    font-family: monospace;
-    background-color: #ecf0f3;
-    padding: 0 1px 0 1px;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-.footnote:target  { background-color: #ffa }
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-form.comment {
-    margin: 0;
-    padding: 10px 30px 10px 30px;
-    background-color: #eee;
-}
-
-form.comment h3 {
-    background-color: #326591;
-    color: white;
-    margin: -10px -30px 10px -30px;
-    padding: 5px;
-    font-size: 1.4em;
-}
-
-form.comment input,
-form.comment textarea {
-    border: 1px solid #ccc;
-    padding: 2px;
-    font-family: sans-serif;
-    font-size: 13px;
-}
-
-form.comment input[type="text"] {
-    width: 240px;
-}
-
-form.comment textarea {
-    width: 100%;
-    height: 200px;
-    margin-bottom: 10px;
-}
-
-/* :::: PRINT :::: */
-@media print {
-    div.documentwrapper {
-        width: 100%;
-    }
-
-    div.body {
-        margin: 0;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    div#comments div.new-comment-box,
-    #top-link {
-        display: none;
-    }
-}
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/genindex.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>Index &mdash; mozmill v1.2.1a1 documentation</title>
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '1.2.1a1',
-        COLLAPSE_MODINDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="top" title="mozmill v1.2.1a1 documentation" href="index.html" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="modindex.html" title="Global Module Index"
-             accesskey="M">modules</a> |</li>
-        <li><a href="index.html">mozmill v1.2.1a1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-
-   <h1 id="index">Index</h1>
-
-   <a href="#Symbols"><strong>Symbols</strong></a> | <a href="#B"><strong>B</strong></a> | <a href="#C"><strong>C</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#J"><strong>J</strong></a> | <a href="#M"><strong>M</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#R"><strong>R</strong></a> | <a href="#S"><strong>S</strong></a> 
-
-   <hr />
-
-   
-<h2 id="Symbols">Symbols</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt>--report &lt;uri&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption--report">command line option</a></dt>
-  </dl></dd>
-<dt>--show-errors</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption--show-errors">command line option</a></dt>
-  </dl></dd>
-<dt>--showall</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption--showall">command line option</a></dt>
-  </dl></dd>
-<dt>-b &lt;binary&gt;, --binary &lt;binary&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-b">command line option</a></dt>
-  </dl></dd>
-<dt>-d &lt;defaultprofile&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-d">command line option</a></dt>
-  </dl></dd>
-<dt>-D, --debug</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-D">command line option</a></dt>
-  </dl></dd>
-<dt>-h, --help</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-h">command line option</a></dt>
-  </dl></dd>
-<dt>-l &lt;logfile&gt;, --logfile &lt;logfile&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-l">command line option</a></dt>
-  </dl></dd></dl></td><td width="33%" valign="top"><dl>
-<dt>-n, --no-new-profile</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-n">command line option</a></dt>
-  </dl></dd>
-<dt>-P &lt;port&gt;, --port &lt;port&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-P">command line option</a></dt>
-  </dl></dd>
-<dt>-p &lt;profile&gt;, --profile &lt;profile&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-p">command line option</a></dt>
-  </dl></dd>
-<dt>-s, --shell</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-s">command line option</a></dt>
-  </dl></dd>
-<dt>-t &lt;test&gt;, --test &lt;test&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-t">command line option</a></dt>
-  </dl></dd>
-<dt>-u, --usecode</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-u">command line option</a></dt>
-  </dl></dd>
-<dt>-w &lt;plugins&gt;, --plugins &lt;plugins&gt;</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption-w">command line option</a></dt>
-  </dl></dd>
-</dl></td></tr></table>
-
-<h2 id="B">B</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.back_channel">back_channel (mozmill.MozMill attribute)</a></dt>
-<dt><a href="index.html#mozmill.MozMill.bridge">bridge (mozmill.MozMill attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="C">C</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.CLI">CLI (class in mozmill)</a></dt>
-<dt>command line option</dt>
-  <dd><dl>
-    <dt><a href="index.html#cmdoption--report">--report &lt;uri&gt;</a></dt>
-    <dt><a href="index.html#cmdoption--show-errors">--show-errors</a></dt>
-    <dt><a href="index.html#cmdoption--showall">--showall</a></dt>
-    <dt><a href="index.html#cmdoption-D">-D, --debug</a></dt>
-    <dt><a href="index.html#cmdoption-P">-P &lt;port&gt;, --port &lt;port&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-b">-b &lt;binary&gt;, --binary &lt;binary&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-d">-d &lt;defaultprofile&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-h">-h, --help</a></dt>
-    <dt><a href="index.html#cmdoption-l">-l &lt;logfile&gt;, --logfile &lt;logfile&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-n">-n, --no-new-profile</a></dt>
-    <dt><a href="index.html#cmdoption-p">-p &lt;profile&gt;, --profile &lt;profile&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-s">-s, --shell</a></dt>
-    <dt><a href="index.html#cmdoption-t">-t &lt;test&gt;, --test &lt;test&gt;</a></dt>
-    <dt><a href="index.html#cmdoption-u">-u, --usecode</a></dt>
-    <dt><a href="index.html#cmdoption-w">-w &lt;plugins&gt;, --plugins &lt;plugins&gt;</a></dt>
-  </dl></dd></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="E">E</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.endRunner_listener">endRunner_listener() (mozmill.MozMill method)</a></dt>
-<dt><a href="index.html#mozmill.MozMill.endTest_listener">endTest_listener() (mozmill.MozMill method)</a></dt></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="J">J</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.jsbridge_port">jsbridge_port (mozmill.MozMill attribute)</a></dt></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="M">M</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill">MozMill (class in mozmill)</a></dt>
-<dt><a href="index.html#module-mozmill">mozmill (module)</a></dt></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="P">P</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.profile">profile (mozmill.MozMill attribute)</a></dt>
-<dt><a href="index.html#mozmill.CLI.profile_class">profile_class (mozmill.CLI attribute)</a></dt>
-  <dd><dl>
-    <dt><a href="index.html#mozmill.MozMill.profile_class">(mozmill.MozMill attribute)</a></dt>
-  </dl></dd></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="R">R</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.run_tests">run_tests() (mozmill.MozMill method)</a></dt>
-<dt><a href="index.html#mozmill.MozMill.runner">runner (mozmill.MozMill attribute)</a></dt>
-<dt><a href="index.html#mozmill.CLI.runner_class">runner_class (mozmill.CLI attribute)</a></dt>
-  <dd><dl>
-    <dt><a href="index.html#mozmill.MozMill.runner_class">(mozmill.MozMill attribute)</a></dt>
-  </dl></dd></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-<h2 id="S">S</h2>
-<table width="100%" class="indextable"><tr><td width="33%" valign="top">
-<dl>
-
-<dt><a href="index.html#mozmill.MozMill.start">start() (mozmill.MozMill method)</a></dt></dl></td><td width="33%" valign="top"><dl>
-</dl></td></tr></table>
-
-
-
-          </div>
-        </div>
-      </div>
-      <div class="sphinxsidebar">
-        <div class="sphinxsidebarwrapper">
-
-   
-
-          <h3>Quick search</h3>
-            <form class="search" action="search.html" method="get">
-              <input type="text" name="q" size="18" /> <input type="submit" value="Go" />
-              <input type="hidden" name="check_keywords" value="yes" />
-              <input type="hidden" name="area" value="default" />
-            </form>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="modindex.html" title="Global Module Index"
-             accesskey="M">modules</a> |</li>
-        <li><a href="index.html">mozmill v1.2.1a1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer">
-      &copy; Copyright 2009, Mikeal Rogers &lt;mikeal.rogers@gmail.com&gt;.
-      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.5.1.
-    </div>
-  </body>
-</html>
\ No newline at end of file
deleted file mode 100644
--- a/mail/test/resources/mozmill/docs/_build/html/index.html
+++ /dev/null
@@ -1,295 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>mozmill &#8212; Full automation of XULRunner applications. &mdash; mozmill v1.2.1a1 documentation</title>
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
-    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '',
-        VERSION:     '1.2.1a1',
-        COLLAPSE_MODINDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="_static/jquery.js"></script>
-    <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="top" title="mozmill v1.2.1a1 documentation" href="" /> 
-  </head>
-  <body>
-    <div class="related">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="right" >
-          <a href="modindex.html" title="Global Module Index"
-             accesskey="M">modules</a> |</li>
-        <li><a href="">mozmill v1.2.1a1 documentation</a> &raquo;</li> 
-      </ul>
-    </div>  
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body">
-            
-  
-  <div class="section" id="module-mozmill">
-<h1><tt class="xref docutils literal"><span class="pre">mozmill</span></tt> &#8212; Full automation of XULRunner applications.<a class="headerlink" href="#module-mozmill" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="command-line-usage">
-<h2>Command Line Usage<a class="headerlink" href="#command-line-usage" title="Permalink to this headline">¶</a></h2>
-<p>The mozmill command line is versatile and includes a fair amount of debugging options. Even though all these options are available mozmill should run by default without any arguments and find your locally installed Firefox and run with mozmill.</p>
-<p>In most modes, ctrl-c will shut down Firefox and exit out of the mozmill Python side as well.</p>
-<div class="highlight-none"><div class="highlight"><pre>$ mozmill
-</pre></div>
-</div>
-<dl class="cmdoption">
-<dt id="cmdoption-h">
-<tt class="descname">-h</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--help</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-h" title="Permalink to this definition">¶</a></dt>
-<dd>Show help message.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-b">
-<tt class="descname">-b</tt><tt class="descclassname"> &lt;binary&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--binary</tt><tt class="descclassname"> &lt;binary&gt;</tt><a class="headerlink" href="#cmdoption-b" title="Permalink to this definition">¶</a></dt>
-<dd><p>Specify application binary location.</p>
-<p>Default <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.Profile"><tt class="xref docutils literal"><span class="pre">mozrunner.Profile</span></tt></a> and <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.Runner"><tt class="xref docutils literal"><span class="pre">mozrunner.Runner</span></tt></a> are still
-<a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.FirefoxProfile"><tt class="xref docutils literal"><span class="pre">mozrunner.FirefoxProfile</span></tt></a> and <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.FirefoxRunner"><tt class="xref docutils literal"><span class="pre">mozrunner.FirefoxRunner</span></tt></a>. You can
-change this by creating your own command line utility by subclassing <a title="mozmill.CLI" class="reference internal" href="#mozmill.CLI"><tt class="xref docutils literal"><span class="pre">CLI</span></tt></a></p>
-</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-d">
-<tt class="descname">-d</tt><tt class="descclassname"> &lt;defaultprofile&gt;</tt><a class="headerlink" href="#cmdoption-d" title="Permalink to this definition">¶</a></dt>
-<dd>Specify the path to the default <strong>clean</strong> profile used to create new profiles.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-n">
-<tt class="descname">-n</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--no-new-profile</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-n" title="Permalink to this definition">¶</a></dt>
-<dd>Do not create a new fresh profile.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-p">
-<tt class="descname">-p</tt><tt class="descclassname"> &lt;profile&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--profile</tt><tt class="descclassname"> &lt;profile&gt;</tt><a class="headerlink" href="#cmdoption-p" title="Permalink to this definition">¶</a></dt>
-<dd>Specifies a profile to use. Must be used with &#8211;no-new-profile.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-w">
-<tt class="descname">-w</tt><tt class="descclassname"> &lt;plugins&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--plugins</tt><tt class="descclassname"> &lt;plugins&gt;</tt><a class="headerlink" href="#cmdoption-w" title="Permalink to this definition">¶</a></dt>
-<dd><p>Comma seperated list of additional paths to plugins to install.</p>
-<p>Plugins can be either .xpi zip compressed extensions or deflated extension directories.</p>
-</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-l">
-<tt class="descname">-l</tt><tt class="descclassname"> &lt;logfile&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--logfile</tt><tt class="descclassname"> &lt;logfile&gt;</tt><a class="headerlink" href="#cmdoption-l" title="Permalink to this definition">¶</a></dt>
-<dd>Log all events to <em>logfile</em>.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption--report">
-<tt class="descname">--report</tt><tt class="descclassname"> &lt;uri&gt;</tt><a class="headerlink" href="#cmdoption--report" title="Permalink to this definition">¶</a></dt>
-<dd><p><em>Currently in development.</em></p>
-<p>POST results to given brasstacks results server at <em>uri</em>.</p>
-</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-t">
-<tt class="descname">-t</tt><tt class="descclassname"> &lt;test&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--test</tt><tt class="descclassname"> &lt;test&gt;</tt><a class="headerlink" href="#cmdoption-t" title="Permalink to this definition">¶</a></dt>
-<dd>Run <em>test</em>. Can be either single test file or directory of tests.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption--showall">
-<tt class="descname">--showall</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption--showall" title="Permalink to this definition">¶</a></dt>
-<dd>Show all test output.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-D">
-<tt class="descname">-D</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--debug</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-D" title="Permalink to this definition">¶</a></dt>
-<dd>Install debugging extensions and run with -jsconole</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption--show-errors">
-<tt class="descname">--show-errors</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption--show-errors" title="Permalink to this definition">¶</a></dt>
-<dd>Print all logger errors to the console. When running tests only test failures and skipped
-tests are printed, this option print all other errors.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-s">
-<tt class="descname">-s</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--shell</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-s" title="Permalink to this definition">¶</a></dt>
-<dd>Starts a Python shell for debugging.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-u">
-<tt class="descname">-u</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--usecode</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-u" title="Permalink to this definition">¶</a></dt>
-<dd>By default &#8211;shell mode will use iPython if install and fall back to using the code module.
-This option forces the use of the code module instead of iPython even when installed.</dd></dl>
-
-<dl class="cmdoption">
-<dt id="cmdoption-P">
-<tt class="descname">-P</tt><tt class="descclassname"> &lt;port&gt;</tt><tt class="descclassname">, </tt><tt class="descname">--port</tt><tt class="descclassname"> &lt;port&gt;</tt><a class="headerlink" href="#cmdoption-P" title="Permalink to this definition">¶</a></dt>
-<dd>Specify port for jsbridge.</dd></dl>
-
-</div>
-<div class="section" id="command-line-class">
-<h2>Command Line Class<a class="headerlink" href="#command-line-class" title="Permalink to this headline">¶</a></h2>
-<dl class="class">
-<dt id="mozmill.CLI">
-<!--[mozmill.CLI]-->class <tt class="descclassname">mozmill.</tt><tt class="descname">CLI</tt><a class="headerlink" href="#mozmill.CLI" title="Permalink to this definition">¶</a></dt>
-<dd><p>Inherits from <a title="(in jsbridge v2.0a1)" class="reference external" href="http://jsbridge.googlecode.com/svn/trunk/docs/_build/html/index.html#jsbridge.CLI"><tt class="xref docutils literal"><span class="pre">jsbridge.CLI</span></tt></a> which inherits from <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.CLI"><tt class="xref docutils literal"><span class="pre">mozrunner.CLI</span></tt></a>.</p>
-<p>All the heavy lifting is handled by jsbridge and mozrunner. If you are subclassing
-this in order to creat a new command line interface be sure to call <a title="(in Python v2.7)" class="reference external" href="http://docs.python.org/dev/library/functions.html#super"><tt class="xref docutils literal"><span class="pre">super()</span></tt></a> on all
-related methods.</p>
-<dl class="attribute">
-<dt id="mozmill.CLI.runner_class">
-<!--[mozmill.CLI.runner_class]--><tt class="descname">runner_class</tt><a class="headerlink" href="#mozmill.CLI.runner_class" title="Permalink to this definition">¶</a></dt>
-<dd>Default runner class. Should be subclass of <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.Runner"><tt class="xref docutils literal"><span class="pre">mozrunner.Runner</span></tt></a>.
-Defaults to <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.FirefoxRunner"><tt class="xref docutils literal"><span class="pre">mozrunner.FirefoxRunner</span></tt></a>.</dd></dl>
-
-<dl class="attribute">
-<dt id="mozmill.CLI.profile_class">
-<!--[mozmill.CLI.profile_class]--><tt class="descname">profile_class</tt><a class="headerlink" href="#mozmill.CLI.profile_class" title="Permalink to this definition">¶</a></dt>
-<dd>Default profile class. Should be subclass of <tt class="xref docutils literal"><span class="pre">mozruner.Profile</span></tt>.
-Defaults to <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.FirefoxProfile"><tt class="xref docutils literal"><span class="pre">mozrunner.FirefoxProfile</span></tt></a>.</dd></dl>
-
-</dd></dl>
-
-</div>
-<div class="section" id="running-mozmill-from-python">
-<h2>Running MozMill from Python<a class="headerlink" href="#running-mozmill-from-python" title="Permalink to this headline">¶</a></h2>
-<dl class="class">
-<dt id="mozmill.MozMill">
-<!--[mozmill.MozMill]-->class <tt class="descclassname">mozmill.</tt><tt class="descname">MozMill</tt><big>(</big><span class="optional">[</span><em>runner_class</em><span class="optional">[</span>, <em>profile_class</em><span class="optional">[</span>, <em>jsbridge_port</em><span class="optional">]</span><span class="optional">]</span><span class="optional">]</span><big>)</big><a class="headerlink" href="#mozmill.MozMill" title="Permalink to this definition">¶</a></dt>
-<dd><p>Manages an instance of Firefox w/ jsbridge and provides facilities for running tests and
-keeping track of results with callback methods.</p>
-<p>Default <em>runner_class</em> is <a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.FirefoxRunner"><tt class="xref docutils literal"><span class="pre">mozrunner.FirefoxRunner</span></tt></a>. Value should be a subclass of
-<a title="(in mozrunner v2.0a1)" class="reference external" href="http://mozrunner.googlecode.com/svn/trunk/docs/_build/html/index.html#mozrunner.Runner"><tt class="xref docutils literal