[xmds2] 01/08: New upstream version 2.2.3+dfsg

Rafael Laboissiere rafael at debian.org
Fri Feb 3 22:46:51 UTC 2017


This is an automated email from the git hooks/post-receive script.

rafael pushed a commit to branch master
in repository xmds2.

commit 9b445c42c8f26587a6479c1da2d1a2c4f1a29605
Author: Rafael Laboissiere <rafael at debian.org>
Date:   Fri Feb 3 16:04:54 2017 -0200

    New upstream version 2.2.3+dfsg
---
 ReleaseNotes                                       |    31 +
 documentation/.buildinfo                           |     4 +-
 documentation/_static/basic.css                    |    79 +-
 documentation/_static/{default.css => classic.css} |    15 +-
 documentation/_static/doctools.js                  |    32 +-
 documentation/_static/down-pressed.png             |   Bin 368 -> 347 bytes
 documentation/_static/down.png                     |   Bin 363 -> 347 bytes
 documentation/_static/file.png                     |   Bin 392 -> 358 bytes
 documentation/_static/jquery.js                    | 10355 ++++++++++++++++++-
 documentation/_static/minus.png                    |   Bin 199 -> 173 bytes
 documentation/_static/plus.png                     |   Bin 199 -> 173 bytes
 documentation/_static/pygments.css                 |     3 +
 documentation/_static/searchtools.js               |    53 +-
 documentation/_static/sidebar.js                   |     4 +-
 documentation/_static/underscore.js                |  1446 ++-
 documentation/_static/up-pressed.png               |   Bin 372 -> 345 bytes
 documentation/_static/up.png                       |   Bin 363 -> 345 bytes
 documentation/_static/websupport.js                |    30 +-
 documentation/advanced_topics.html                 |    52 +-
 documentation/bulirschStoer.html                   |    34 +-
 documentation/developer.html                       |   148 +-
 documentation/doctrees/advanced_topics.doctree     |   Bin 52291 -> 52173 bytes
 documentation/doctrees/bulirschStoer.doctree       |   Bin 20734 -> 20572 bytes
 documentation/doctrees/developer.doctree           |   Bin 92938 -> 92827 bytes
 documentation/doctrees/documentation_toc.doctree   |   Bin 3907 -> 3765 bytes
 documentation/doctrees/environment.pickle          |   Bin 97684 -> 100897 bytes
 documentation/doctrees/faq.doctree                 |   Bin 30171 -> 29989 bytes
 documentation/doctrees/index.doctree               |   Bin 52597 -> 56148 bytes
 documentation/doctrees/installation.doctree        |   Bin 110258 -> 111424 bytes
 documentation/doctrees/introduction.doctree        |   Bin 24126 -> 23961 bytes
 documentation/doctrees/licensing.doctree           |   Bin 114131 -> 114497 bytes
 documentation/doctrees/news.doctree                |   Bin 47188 -> 50801 bytes
 documentation/doctrees/news_content.doctree        |   Bin 45599 -> 49128 bytes
 documentation/doctrees/optimisation_hints.doctree  |   Bin 57194 -> 57134 bytes
 documentation/doctrees/reference_elements.doctree  |   Bin 461656 -> 463397 bytes
 documentation/doctrees/reference_index.doctree     |   Bin 3269 -> 3129 bytes
 ...eference_installation_and_configuration.doctree |   Bin 12706 -> 12545 bytes
 documentation/doctrees/reference_schema.doctree    |   Bin 67572 -> 71274 bytes
 .../doctrees/reference_usefulXMLSyntax.doctree     |   Bin 4601 -> 4458 bytes
 documentation/doctrees/tutorial.doctree            |   Bin 49021 -> 48895 bytes
 documentation/doctrees/upgrade.doctree             |   Bin 6081 -> 5921 bytes
 documentation/doctrees/worked_examples.doctree     |   Bin 197015 -> 197314 bytes
 documentation/doctrees/xsil2graphics2.doctree      |   Bin 6017 -> 5891 bytes
 documentation/documentation_toc.html               |    36 +-
 documentation/faq.html                             |    42 +-
 documentation/genindex.html                        |    34 +-
 documentation/index.html                           |    64 +-
 documentation/installation.html                    |   113 +-
 documentation/introduction.html                    |    40 +-
 documentation/latex/Makefile                       |    28 +-
 documentation/latex/xmds2.aux                      |   177 +-
 documentation/latex/xmds2.idx                      |    70 +-
 documentation/latex/xmds2.ilg                      |     4 +-
 documentation/latex/xmds2.ind                      |    66 +-
 documentation/latex/xmds2.log                      |   993 +-
 documentation/latex/xmds2.out                      |    18 +-
 documentation/latex/xmds2.pdf                      |   Bin 7007925 -> 7020428 bytes
 documentation/latex/xmds2.tex                      |   615 +-
 documentation/latex/xmds2.toc                      |    46 +-
 documentation/licensing.html                       |    30 +-
 documentation/news.html                            |    56 +-
 documentation/news_content.html                    |    56 +-
 documentation/objects.inv                          |   Bin 1920 -> 2053 bytes
 documentation/optimisation_hints.html              |    67 +-
 documentation/reference_elements.html              |   319 +-
 documentation/reference_index.html                 |    30 +-
 .../reference_installation_and_configuration.html  |    48 +-
 documentation/reference_schema.html                |   250 +-
 documentation/reference_usefulXMLSyntax.html       |    34 +-
 documentation/search.html                          |    28 +-
 documentation/searchindex.js                       |     2 +-
 documentation/tutorial.html                        |    62 +-
 documentation/upgrade.html                         |    32 +-
 documentation/worked_examples.html                 |   160 +-
 documentation/xsil2graphics2.html                  |    32 +-
 examples/groundstate_gaussian.xmds                 |    17 +-
 examples/lubrication_equation.xmds                 |    94 +
 man/xmds2.1                                        |     2 +-
 setup.py                                           |     2 +-
 testsuite/fast/bessel_cosine_evolution.xmds        |     2 +-
 testsuite/fast/bessel_cosine_evolution_expected.h5 |   Bin 91864 -> 92960 bytes
 .../fast/bessel_cosine_evolution_expected.xsil     |    27 +-
 .../nonlocal_access_multiple_components.xmds       |    73 +
 ...nonlocal_access_multiple_components_expected.h5 |   Bin 0 -> 56096 bytes
 ...nlocal_access_multiple_components_expected.xsil |    96 +
 xpdeint/CodeParser.py                              |    27 +-
 xpdeint/Features/Arguments.py                      |     6 +-
 xpdeint/Features/AsciiFormat.py                    |     6 +-
 xpdeint/Features/AutoVectorise.py                  |     6 +-
 xpdeint/Features/Benchmark.py                      |     6 +-
 xpdeint/Features/BinaryFormat.py                   |     6 +-
 xpdeint/Features/Bing.py                           |     6 +-
 xpdeint/Features/CFlags.py                         |     6 +-
 xpdeint/Features/ChunkedOutput.py                  |     6 +-
 xpdeint/Features/Diagnostics.py                    |     6 +-
 xpdeint/Features/ErrorCheck.py                     |     6 +-
 xpdeint/Features/Globals.py                        |     6 +-
 xpdeint/Features/HDF5Format.py                     |     6 +-
 xpdeint/Features/HaltNonFinite.py                  |     6 +-
 xpdeint/Features/MaxIterations.py                  |     6 +-
 xpdeint/Features/OpenMP.py                         |     6 +-
 xpdeint/Features/Output.py                         |     6 +-
 xpdeint/Features/OutputFormat.py                   |    10 +-
 xpdeint/Features/Stochastic.py                     |     6 +-
 xpdeint/Features/Transforms/Basis.py               |     6 +-
 xpdeint/Features/Transforms/BesselBasis.py         |     6 +-
 .../Features/Transforms/BesselNeumannTransform.py  |     6 +-
 xpdeint/Features/Transforms/BesselTransform.py     |     6 +-
 xpdeint/Features/Transforms/EPBasis.py             |     6 +-
 .../Features/Transforms/FourierTransformFFTW3.py   |     6 +-
 .../Transforms/FourierTransformFFTW3MPI.py         |     6 +-
 .../Transforms/FourierTransformFFTW3Threads.py     |     6 +-
 xpdeint/Features/Transforms/HermiteGaussEPBasis.py |     6 +-
 .../Transforms/HermiteGaussFourierEPBasis.py       |     6 +-
 .../Features/Transforms/HermiteGaussTransform.py   |     6 +-
 .../Transforms/HermiteGaussTwiddleBasis.py         |     6 +-
 xpdeint/Features/Transforms/MMT.py                 |     6 +-
 xpdeint/Features/Transforms/NoTransformMPI.py      |     6 +-
 .../Features/Transforms/TransformMultiplexer.py    |     6 +-
 xpdeint/Features/Validation.py                     |     6 +-
 xpdeint/Geometry/BesselDimensionRepresentation.py  |     6 +-
 .../BesselNeumannDimensionRepresentation.py        |     6 +-
 xpdeint/Geometry/DimensionRepresentation.py        |     6 +-
 xpdeint/Geometry/FieldElement.py                   |     6 +-
 xpdeint/Geometry/GeometryElement.py                |     6 +-
 .../HermiteGaussDimensionRepresentation.py         |     6 +-
 .../Geometry/NonUniformDimensionRepresentation.py  |     6 +-
 .../SphericalBesselDimensionRepresentation.py      |     6 +-
 .../SplitUniformDimensionRepresentation.py         |     6 +-
 xpdeint/Geometry/UniformDimensionRepresentation.py |     6 +-
 xpdeint/HDF5.py                                    |    28 +-
 xpdeint/MomentGroupElement.py                      |     6 +-
 xpdeint/Operators/ConstantEXOperator.py            |     6 +-
 xpdeint/Operators/ConstantIPOperator.py            |     6 +-
 xpdeint/Operators/CrossPropagationOperator.py      |     6 +-
 xpdeint/Operators/DeltaAOperator.py                |     6 +-
 xpdeint/Operators/FilterOperator.py                |     6 +-
 xpdeint/Operators/FunctionsOperator.py             |     6 +-
 xpdeint/Operators/NonConstantEXOperator.py         |     6 +-
 xpdeint/Operators/NonConstantIPOperator.py         |     6 +-
 xpdeint/Operators/Operator.py                      |     6 +-
 xpdeint/Operators/OperatorContainer.py             |    28 +-
 xpdeint/Operators/SICDeltaAOperator.py             |     6 +-
 xpdeint/Preferences.py                             |     2 +-
 xpdeint/ScriptElement.py                           |   273 +-
 xpdeint/ScriptElement.tmpl                         |     5 +-
 xpdeint/Segments/BreakpointSegment.py              |     6 +-
 xpdeint/Segments/FilterSegment.py                  |    28 +-
 xpdeint/Segments/FilterSegment.tmpl                |     4 +
 xpdeint/Segments/Integrators/AdaptiveStep.py       |     6 +-
 xpdeint/Segments/Integrators/FixedStep.py          |    28 +-
 xpdeint/Segments/Integrators/FixedStepWithCross.py |     6 +-
 xpdeint/Segments/Integrators/Integrator.py         |     6 +-
 xpdeint/Segments/Integrators/MMStepper.py          |     6 +-
 xpdeint/Segments/Integrators/RK45Stepper.py        |     6 +-
 xpdeint/Segments/Integrators/RK4Stepper.py         |     6 +-
 xpdeint/Segments/Integrators/RK89Stepper.py        |     6 +-
 xpdeint/Segments/Integrators/RK9Stepper.py         |     6 +-
 .../Segments/Integrators/RichardsonFixedStep.py    |     6 +-
 xpdeint/Segments/Integrators/SICStepper.py         |     6 +-
 xpdeint/Segments/Integrators/SIStepper.py          |     6 +-
 xpdeint/Segments/Integrators/_Integrator.py        |     3 +-
 xpdeint/Segments/SequenceSegment.py                |     6 +-
 xpdeint/Segments/TopLevelSequenceElement.py        |     6 +-
 xpdeint/Segments/_FilterSegment.py                 |     2 +
 xpdeint/Simulation.py                              |     6 +-
 .../AdaptiveMPIMultiPathDriver.py                  |     6 +-
 xpdeint/SimulationDrivers/DistributedMPIDriver.py  |    28 +-
 xpdeint/SimulationDrivers/MPI.py                   |     6 +-
 xpdeint/SimulationDrivers/MPIMultiPathDriver.py    |     6 +-
 xpdeint/SimulationDrivers/MultiPathDriver.py       |    28 +-
 xpdeint/SimulationDrivers/SimulationDriver.py      |     6 +-
 xpdeint/SimulationElement.py                       |     6 +-
 xpdeint/Stochastic/Generators/DSFMTGenerator.py    |     6 +-
 xpdeint/Stochastic/Generators/Generator.py         |   149 +-
 xpdeint/Stochastic/Generators/Generator.tmpl       |    43 +-
 xpdeint/Stochastic/Generators/MKLGenerator.py      |     6 +-
 xpdeint/Stochastic/Generators/POSIXGenerator.py    |     6 +-
 xpdeint/Stochastic/Generators/SolirteGenerator.py  |     6 +-
 .../GaussianBoxMuellerRandomVariable.py            |     6 +-
 .../RandomVariables/GaussianMKLRandomVariable.py   |     6 +-
 .../RandomVariables/GaussianRandomVariable.py      |    28 +-
 .../GaussianSolirteRandomVariable.py               |     6 +-
 .../RandomVariables/PoissonianRandomVariable.py    |    50 +-
 .../RandomVariables/UniformRandomVariable.py       |     6 +-
 xpdeint/Vectors/ComputedVector.py                  |     6 +-
 xpdeint/Vectors/NoiseVector.py                     |     6 +-
 xpdeint/Vectors/VectorElement.py                   |    28 +-
 xpdeint/Vectors/VectorInitialisation.py            |     6 +-
 xpdeint/Vectors/VectorInitialisationFromCDATA.py   |     6 +-
 xpdeint/Vectors/VectorInitialisationFromHDF5.py    |     6 +-
 xpdeint/Vectors/VectorInitialisationFromXSIL.tmpl  |     4 +-
 xpdeint/Version.py                                 |     2 +-
 xpdeint/XMDS2Parser.py                             |    64 +-
 xpdeint/XSILFile.py                                |     2 +-
 xpdeint/includes/xpdeint.h                         |     4 +-
 xpdeint/support/wscript                            |     1 -
 xpdeint/support/xpdeint.rnc                        |     8 +-
 xpdeint/support/xpdeint.rng                        |    22 +-
 xpdeint/xsil2graphics2/MathematicaImport.py        |     6 +-
 xpdeint/xsil2graphics2/MatlabOctaveImport.py       |     6 +-
 xpdeint/xsil2graphics2/PythonImport.py             |     6 +-
 xpdeint/xsil2graphics2/RImport.py                  |     6 +-
 203 files changed, 15036 insertions(+), 2560 deletions(-)

diff --git a/ReleaseNotes b/ReleaseNotes
index 0a5644b..2ecdb39 100644
--- a/ReleaseNotes
+++ b/ReleaseNotes
@@ -1,3 +1,34 @@
+
+**** XMDS 2.2.3 "It came from the deep" ****
+
+Released 2017-01-20
+
+* Fix loop index overrides when a vector had more than one component
+* Fix crash when using the MPI driver, noise vectors and not specifying random seeds
+* Fix breakage when using newer versions of PyParsing
+* Fix a possible data import crash
+* Improve string -> character conversion safety on Mac
+* Remove requirement that samples must divide into steps when using an adaptive stepper
+* Make initial step size more robust when using adaptive stepper
+* Improved debug mode
+* Added extra examples
+* Documentation improvements
+
+
+**** XMDS 2.2.2 "XMDS is a game of two halves" ****
+
+Released 2014-10-13
+
+* Bug fixes and documentation improvements
+
+
+
+**** XMDS 2.2.1 "XMDS is a game of two halves" ****
+
+* Bug fixes and documentation improvements
+
+
+
 **** XMDS 2.2.0 "Out of cheese error" ****
 
 XMDS 2.2.0 contains a number of new features, as well as bugfixes and updates. Specifically
diff --git a/documentation/.buildinfo b/documentation/.buildinfo
index fc1925f..c919dff 100644
--- a/documentation/.buildinfo
+++ b/documentation/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 1bcdffa41cc21029cf4bff7a589f061d
-tags: a205e9ed8462ae86fdd2f73488852ba9
+config: 9c9cc22fef884425792921c3f6fafdb8
+tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/documentation/_static/basic.css b/documentation/_static/basic.css
index a04c8e1..c89fc7e 100644
--- a/documentation/_static/basic.css
+++ b/documentation/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -89,6 +89,7 @@ div.sphinxsidebar #searchbox input[type="submit"] {
 
 img {
     border: 0;
+    max-width: 100%;
 }
 
 /* -- search page ----------------------------------------------------------- */
@@ -196,7 +197,10 @@ h3:hover > a.headerlink,
 h4:hover > a.headerlink,
 h5:hover > a.headerlink,
 h6:hover > a.headerlink,
-dt:hover > a.headerlink {
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
     visibility: visible;
 }
 
@@ -313,6 +317,13 @@ table.docutils {
     border-collapse: collapse;
 }
 
+table caption span.caption-number {
+    font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
 table.docutils td, table.docutils th {
     padding: 1px 8px 1px 5px;
     border-top: 0;
@@ -343,6 +354,25 @@ table.citation td {
     border-bottom: none;
 }
 
+/* -- figures --------------------------------------------------------------- */
+
+div.figure {
+    margin: 0.5em;
+    padding: 0.5em;
+}
+
+div.figure p.caption {
+    padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number {
+    font-style: italic;
+}
+
+div.figure p.caption span.caption-text {
+}
+
+
 /* -- other body styles ----------------------------------------------------- */
 
 ol.arabic {
@@ -401,14 +431,14 @@ dl.glossary dt {
     margin: 0;
 }
 
-.refcount {
-    color: #060;
-}
-
 .optional {
     font-size: 1.3em;
 }
 
+.sig-paren {
+    font-size: larger;
+}
+
 .versionmodified {
     font-style: italic;
 }
@@ -474,22 +504,51 @@ table.highlighttable td {
     padding: 0 0.5em 0 0.5em;
 }
 
-tt.descname {
+div.code-block-caption {
+    padding: 2px 5px;
+    font-size: small;
+}
+
+div.code-block-caption code {
+    background-color: transparent;
+}
+
+div.code-block-caption + div > div.highlight > pre {
+    margin-top: 0;
+}
+
+div.code-block-caption span.caption-number {
+    padding: 0.1em 0.3em;
+    font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+    padding: 1em 1em 0;
+}
+
+div.literal-block-wrapper div.highlight {
+    margin: 0;
+}
+
+code.descname {
     background-color: transparent;
     font-weight: bold;
     font-size: 1.2em;
 }
 
-tt.descclassname {
+code.descclassname {
     background-color: transparent;
 }
 
-tt.xref, a tt {
+code.xref, a code {
     background-color: transparent;
     font-weight: bold;
 }
 
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
     background-color: transparent;
 }
 
diff --git a/documentation/_static/default.css b/documentation/_static/classic.css
similarity index 94%
rename from documentation/_static/default.css
rename to documentation/_static/classic.css
index e534a07..d98894b 100644
--- a/documentation/_static/default.css
+++ b/documentation/_static/classic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- default theme.
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -169,7 +169,7 @@ a.headerlink:hover {
     color: white;
 }
 
-div.body p, div.body dd, div.body li {
+div.body p, div.body dd, div.body li, div.body blockquote {
     text-align: justify;
     line-height: 130%;
 }
@@ -227,7 +227,7 @@ pre {
     border-right: none;
 }
 
-tt {
+code {
     background-color: #ecf0f3;
     padding: 0 1px 0 1px;
     font-size: 0.95em;
@@ -237,11 +237,11 @@ th {
     background-color: #ede;
 }
 
-.warning tt {
+.warning code {
     background: #efc2c2;
 }
 
-.note tt {
+.note code {
     background: #d6d6d6;
 }
 
@@ -253,4 +253,9 @@ div.viewcode-block:target {
     background-color: #f4debf;
     border-top: 1px solid #ac9;
     border-bottom: 1px solid #ac9;
+}
+
+div.code-block-caption {
+    color: #efefef;
+    background-color: #1c4e63;
 }
\ No newline at end of file
diff --git a/documentation/_static/doctools.js b/documentation/_static/doctools.js
index 8614442..e2e70cc 100644
--- a/documentation/_static/doctools.js
+++ b/documentation/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for all documentation.
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -91,6 +91,30 @@ jQuery.fn.highlightText = function(text, className) {
   });
 };
 
+/*
+ * backward compatibility for jQuery.browser
+ * This will be supported until firefox bug is fixed.
+ */
+if (!jQuery.browser) {
+  jQuery.uaMatch = function(ua) {
+    ua = ua.toLowerCase();
+
+    var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+      /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+      /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+      /(msie) ([\w.]+)/.exec(ua) ||
+      ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+      [];
+
+    return {
+      browser: match[ 1 ] || "",
+      version: match[ 2 ] || "0"
+    };
+  };
+  jQuery.browser = {};
+  jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
+}
+
 /**
  * Small JavaScript module for the documentation.
  */
@@ -152,9 +176,10 @@ var Documentation = {
 
   /**
    * workaround a firefox stupidity
+   * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
    */
   fixFirefoxAnchorBug : function() {
-    if (document.location.hash && $.browser.mozilla)
+    if (document.location.hash)
       window.setTimeout(function() {
         document.location.href += '';
       }, 10);
@@ -168,6 +193,9 @@ var Documentation = {
     var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
     if (terms.length) {
       var body = $('div.body');
+      if (!body.length) {
+        body = $('body');
+      }
       window.setTimeout(function() {
         $.each(terms, function() {
           body.highlightText(this.toLowerCase(), 'highlighted');
diff --git a/documentation/_static/down-pressed.png b/documentation/_static/down-pressed.png
index 6f7ad78..7c30d00 100644
Binary files a/documentation/_static/down-pressed.png and b/documentation/_static/down-pressed.png differ
diff --git a/documentation/_static/down.png b/documentation/_static/down.png
index 3003a88..f48098a 100644
Binary files a/documentation/_static/down.png and b/documentation/_static/down.png differ
diff --git a/documentation/_static/file.png b/documentation/_static/file.png
index d18082e..254c60b 100644
Binary files a/documentation/_static/file.png and b/documentation/_static/file.png differ
diff --git a/documentation/_static/jquery.js b/documentation/_static/jquery.js
index 198b3ff..415ff51 100644
--- a/documentation/_static/jquery.js
+++ b/documentation/_static/jquery.js
@@ -1,4 +1,10351 @@
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement( [...]
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]| [...]
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replac [...]
\ No newline at end of file
+/*!
+ * jQuery JavaScript Library v1.11.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-09-23T12:31Z
+ */
+
+(function( global, factory ) {
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+		// For CommonJS and CommonJS-like environments where a proper window is present,
+		// execute the factory and get jQuery
+		// For environments that do not inherently posses a window with a document
+		// (such as Node.js), expose a jQuery-making factory as module.exports
+		// This accentuates the need for the creation of a real window
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+var deletedIds = [];
+
+var slice = deletedIds.slice;
+
+var concat = deletedIds.concat;
+
+var push = deletedIds.push;
+
+var indexOf = deletedIds.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+	version = "1.11.3",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android<4.1, IE<9
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num != null ?
+
+			// Return just the one element from the set
+			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+			// Return all the elements in a clean array
+			slice.call( this );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: deletedIds.sort,
+	splice: deletedIds.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		/* jshint eqeqeq: false */
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		// adding 1 corrects loss of precision from parseFloat (#15100)
+		return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	isPlainObject: function( obj ) {
+		var key;
+
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Support: IE<9
+		// Handle iteration over inherited properties before own properties.
+		if ( support.ownLast ) {
+			for ( key in obj ) {
+				return hasOwn.call( obj, key );
+			}
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android<4.1, IE<9
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArraylike( Object(arr) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( indexOf ) {
+				return indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		while ( j < len ) {
+			first[ i++ ] = second[ j++ ];
+		}
+
+		// Support: IE<9
+		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+		if ( len !== len ) {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: function() {
+		return +( new Date() );
+	},
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+
+	// Support: iOS 8.2 (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-12-16
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// http://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + characterEncoding + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+	rescape = /'|\\/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	};
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+	nodeType = context.nodeType;
+
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	if ( !seed && documentIsHTML ) {
+
+		// Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+		if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document (jQuery #6963)
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, context.getElementsByTagName( selector ) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getElementsByClassName ) {
+				push.apply( results, context.getElementsByClassName( m ) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+			nid = old = expando;
+			newContext = context;
+			newSelector = nodeType !== 1 && selector;
+
+			// qSA works strangely on Element-rooted queries
+			// We can work around this by specifying an extra ID on the root
+			// and working up from there (Thanks to Andrew Dupont for the technique)
+			// IE 8 doesn't work on object elements
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						context.removeAttribute("id");
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = attrs.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, parent,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+	parent = doc.defaultView;
+
+	// Support: IE>8
+	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
+	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+	// IE6-8 do not support the defaultView property so parent will be undefined
+	if ( parent && parent !== parent.top ) {
+		// IE11 does not have attachEvent, so all must suffer
+		if ( parent.addEventListener ) {
+			parent.addEventListener( "unload", unloadHandler, false );
+		} else if ( parent.attachEvent ) {
+			parent.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Support tests
+	---------------------------------------------------------------------- */
+	documentIsHTML = !isXML( doc );
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [ m ] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\f]' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibing-combinator selector` fails
+			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( div ) {
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = doc.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( div.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+							// Seek `elem` from a previously-cached index
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && cache[2];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// Use the same loop as above to seek `elem` from the start
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+									// Cache the index of each encountered element
+									if ( useCache ) {
+										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+									}
+
+									if ( node === elem ) {
+										break;
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+						if ( (oldCache = outerCache[ dir ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							outerCache[ dir ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is no seed and only one group
+	if ( match.length === 1 ) {
+
+		// Take a shortcut and set the context if the root selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				support.getById && context.nodeType === 9 && documentIsHTML &&
+				Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		});
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		});
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( risSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+	});
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	return elems.length === 1 && elem.nodeType === 1 ?
+		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+			return elem.nodeType === 1;
+		}));
+};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter(function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			}) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], false) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], true) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	init = jQuery.fn.init = function( selector, context ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+
+					// scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[1],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return typeof rootjQuery.ready !== "undefined" ?
+				rootjQuery.ready( selector ) :
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.extend({
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+jQuery.fn.extend({
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && (pos ?
+					pos.index(cur) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector(cur, selectors)) ) {
+
+					matched.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.unique(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	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.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		if ( this.length > 1 ) {
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				ret = jQuery.unique( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				firingLength = 0;
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( list && ( !fired || stack ) ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ](function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+								}
+							});
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[0] ] = function() {
+				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+
+					} else if ( !(--remaining) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+	// Add the callback
+	jQuery.ready.promise().done( fn );
+
+	return this;
+};
+
+jQuery.extend({
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.triggerHandler ) {
+			jQuery( document ).triggerHandler( "ready" );
+			jQuery( document ).off( "ready" );
+		}
+	}
+});
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+	if ( document.addEventListener ) {
+		document.removeEventListener( "DOMContentLoaded", completed, false );
+		window.removeEventListener( "load", completed, false );
+
+	} else {
+		document.detachEvent( "onreadystatechange", completed );
+		window.detachEvent( "onload", completed );
+	}
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+	// readyState === "complete" is good enough for us to call the dom ready in oldIE
+	if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+		detach();
+		jQuery.ready();
+	}
+}
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+
+var strundefined = typeof undefined;
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+	break;
+}
+support.ownLast = i !== "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery(function() {
+	// Minified: var a,b,c,d
+	var val, div, body, container;
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	if ( !body || !body.style ) {
+		// Return for frameset docs that don't have a body
+		return;
+	}
+
+	// Setup
+	div = document.createElement( "div" );
+	container = document.createElement( "div" );
+	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+	body.appendChild( container ).appendChild( div );
+
+	if ( typeof div.style.zoom !== strundefined ) {
+		// Support: IE<8
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+		if ( val ) {
+			// Prevent IE 6 from affecting layout for positioned elements #11048
+			// Prevent IE from shrinking the body in IE 7 mode #12869
+			// Support: IE<8
+			body.style.zoom = 1;
+		}
+	}
+
+	body.removeChild( container );
+});
+
+
+
+
+(function() {
+	var div = document.createElement( "div" );
+
+	// Execute the test only if not already executed in another module.
+	if (support.deleteExpando == null) {
+		// Support: IE<9
+		support.deleteExpando = true;
+		try {
+			delete div.test;
+		} catch( e ) {
+			support.deleteExpando = false;
+		}
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+})();
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( elem ) {
+	var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
+		nodeType = +elem.nodeType || 1;
+
+	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+	return nodeType !== 1 && nodeType !== 9 ?
+		false :
+
+		// Nodes accept data unless otherwise specified; rejection can be conditional
+		!noData || noData !== true && elem.getAttribute("classid") === noData;
+};
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var ret, thisCache,
+		internalKey = jQuery.expando,
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+		return;
+	}
+
+	if ( !id ) {
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+		// Avoid exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( typeof name === "string" ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, i,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split(" ");
+					}
+				}
+			} else {
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete thisCache[ name[i] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	/* jshint eqeqeq: false */
+	} else if ( support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// The following elements (space-suffixed to avoid Object.prototype collisions)
+	// throw uncatchable exceptions if you attempt to set expando properties
+	noData: {
+		"applet ": true,
+		"embed ": true,
+		// ...but Flash objects (which have this classid) *can* handle expandos
+		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[0],
+			attrs = elem && elem.attributes;
+
+		// Special expections of .data basically thwart jQuery.access,
+		// so implement the relevant behavior ourselves
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE11+
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = jQuery.camelCase( name.slice(5) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		return arguments.length > 1 ?
+
+			// Sets one value
+			this.each(function() {
+				jQuery.data( this, key, value );
+			}) :
+
+			// Gets one value
+			// Try to fetch any internally stored data first
+			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, key );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+		// isHidden might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+		return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+	};
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		length = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( jQuery.type( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !jQuery.isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < length; i++ ) {
+				fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+			}
+		}
+	}
+
+	return chainable ?
+		elems :
+
+		// Gets
+		bulk ?
+			fn.call( elems ) :
+			length ? fn( elems[0], key ) : emptyGet;
+};
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+	// Minified: var a,b,c
+	var input = document.createElement( "input" ),
+		div = document.createElement( "div" ),
+		fragment = document.createDocumentFragment();
+
+	// Setup
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// IE strips leading whitespace when .innerHTML is used
+	support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+	// Make sure that tbody elements aren't automatically inserted
+	// IE will insert them into empty tables
+	support.tbody = !div.getElementsByTagName( "tbody" ).length;
+
+	// Make sure that link elements get serialized correctly by innerHTML
+	// This requires a wrapper element in IE
+	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
+
+	// Makes sure cloning an html5 element does not cause problems
+	// Where outerHTML is undefined, this still works
+	support.html5Clone =
+		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	input.type = "checkbox";
+	input.checked = true;
+	fragment.appendChild( input );
+	support.appendChecked = input.checked;
+
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	// Support: IE6-IE11+
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	fragment.appendChild( div );
+	div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
+
+	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+	// old WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	support.noCloneEvent = true;
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Execute the test only if not already executed in another module.
+	if (support.deleteExpando == null) {
+		// Support: IE<9
+		support.deleteExpando = true;
+		try {
+			delete div.test;
+		} catch( e ) {
+			support.deleteExpando = false;
+		}
+	}
+})();
+
+
+(function() {
+	var i, eventName,
+		div = document.createElement( "div" );
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
+	for ( i in { submit: true, change: true, focusin: true }) {
+		eventName = "on" + i;
+
+		if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
+			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+			div.setAttribute( eventName, "t" );
+			support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
+		}
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+})();
+
+
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+		var tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !(events = elemData.events) ) {
+			events = elemData.events = {};
+		}
+		if ( !(eventHandle = elemData.handle) ) {
+			eventHandle = elemData.handle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !(handlers = events[ type ]) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf(":") < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === (elem.ownerDocument || document) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+				jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = slice.call( arguments ),
+			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( (event.result = ret) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var sel, handleObj, matches, i,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			/* jshint eqeqeq: false */
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+				/* jshint eqeqeq: true */
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, handlers: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Chrome 23+, Safari?
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === strundefined ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+				// Support: IE < 9, Android < 4.0
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+		if ( !e ) {
+			return;
+		}
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && e.stopImmediatePropagation ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					jQuery._removeData( doc, fix );
+				} else {
+					jQuery._data( doc, fix, attaches );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var type, origFn;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) {
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[0];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+});
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		area: [ 1, "<map>", "</map>" ],
+		param: [ 1, "<object>", "</object>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+		// unless wrapped in a div with non-breaking characters in front of it.
+		_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
+			undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName("tbody")[0] ||
+			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[1];
+	} else {
+		elem.removeAttribute("type");
+	}
+	return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; (elem = elems[i]) != null; i++ ) {
+		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!support.noCloneEvent || !support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					fixCloneNodeIssues( node, destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+					cloneCopyEvent( node, destElements[i] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var j, elem, contains,
+			tmp, tag, tbody, wrap,
+			l = elems.length,
+
+			// Ensure a safe fragment
+			safe = createSafeFragment( context ),
+
+			nodes = [],
+			i = 0;
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+				// Convert non-html into a text node
+				} else if ( !rhtml.test( elem ) ) {
+					nodes.push( context.createTextNode( elem ) );
+
+				// Convert html into DOM nodes
+				} else {
+					tmp = tmp || safe.appendChild( context.createElement("div") );
+
+					// Deserialize a standard representation
+					tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+
+					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+					// Descend through wrappers to the right content
+					j = wrap[0];
+					while ( j-- ) {
+						tmp = tmp.lastChild;
+					}
+
+					// Manually add leading whitespace removed by IE
+					if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						elem = tag === "table" && !rtbody.test( elem ) ?
+							tmp.firstChild :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !rtbody.test( elem ) ?
+								tmp :
+								0;
+
+						j = elem && elem.childNodes.length;
+						while ( j-- ) {
+							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+								elem.removeChild( tbody );
+							}
+						}
+					}
+
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Fix #12392 for WebKit and IE > 9
+					tmp.textContent = "";
+
+					// Fix #12392 for oldIE
+					while ( tmp.firstChild ) {
+						tmp.removeChild( tmp.firstChild );
+					}
+
+					// Remember the top-level container for proper cleanup
+					tmp = safe.lastChild;
+				}
+			}
+		}
+
+		// Fix #11356: Clear elements from fragment
+		if ( tmp ) {
+			safe.removeChild( tmp );
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				continue;
+			}
+
+			contains = jQuery.contains( elem.ownerDocument, elem );
+
+			// Append to fragment
+			tmp = getAll( safe.appendChild( elem ), "script" );
+
+			// Preserve script evaluation history
+			if ( contains ) {
+				setGlobalEval( tmp );
+			}
+
+			// Capture executables
+			if ( scripts ) {
+				j = 0;
+				while ( (elem = tmp[ j++ ]) ) {
+					if ( rscriptType.test( elem.type || "" ) ) {
+						scripts.push( elem );
+					}
+				}
+			}
+		}
+
+		tmp = null;
+
+		return safe;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	remove: function( selector, keepData /* Internal Use Only */ ) {
+		var elem,
+			elems = selector ? jQuery.filter( selector, this ) : this,
+			i = 0;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( !keepData && elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem ) );
+			}
+
+			if ( elem.parentNode ) {
+				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+					setGlobalEval( getAll( elem, "script" ) );
+				}
+				elem.parentNode.removeChild( elem );
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map(function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var arg = arguments[ 0 ];
+
+		// Make the changes, replacing each context element with the new content
+		this.domManip( arguments, function( elem ) {
+			arg = this.parentNode;
+
+			jQuery.cleanData( getAll( this ) );
+
+			if ( arg ) {
+				arg.replaceChild( elem, this );
+			}
+		});
+
+		// Force removal if there was no new content (e.g., from empty arguments)
+		return arg && (arg.length || arg.nodeType) ? this : this.remove();
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, callback ) {
+
+		// Flatten any nested arrays
+		args = concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			i = 0,
+			l = this.length,
+			set = this,
+			iNoClone = l - 1,
+			value = args[0],
+			isFunction = jQuery.isFunction( value );
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( isFunction ||
+				( l > 1 && typeof value === "string" &&
+					!support.checkClone && rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[0] = value.call( this, index, self.html() );
+				}
+				self.domManip( args, callback );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+				hasScripts = scripts.length;
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				for ( ; i < l; i++ ) {
+					node = fragment;
+
+					if ( i !== iNoClone ) {
+						node = jQuery.clone( node, true, true );
+
+						// Keep references to cloned scripts for later restoration
+						if ( hasScripts ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call( this[i], node, i );
+				}
+
+				if ( hasScripts ) {
+					doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+					// Reenable scripts
+					jQuery.map( scripts, restoreScript );
+
+					// Evaluate executable scripts on first document insertion
+					for ( i = 0; i < hasScripts; i++ ) {
+						node = scripts[ i ];
+						if ( rscriptType.test( node.type || "" ) &&
+							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Optional AJAX dependency, but won't run scripts if not present
+								if ( jQuery._evalUrl ) {
+									jQuery._evalUrl( node.src );
+								}
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone(true);
+			jQuery( insert[i] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+
+var iframe,
+	elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+	var style,
+		elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+		// getDefaultComputedStyle might be reliably used only on attached element
+		display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+			// Use of this method is a temporary fix (more like optmization) until something better comes along,
+			// since it was removed from specification and supported only in FF
+			style.display : jQuery.css( elem[ 0 ], "display" );
+
+	// We don't have any data stored on the element,
+	// so use "detach" method as fast way to get rid of the element
+	elem.detach();
+
+	return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+
+			// Use the already-created iframe if possible
+			iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
+
+			// Support: IE
+			doc.write();
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+
+(function() {
+	var shrinkWrapBlocksVal;
+
+	support.shrinkWrapBlocks = function() {
+		if ( shrinkWrapBlocksVal != null ) {
+			return shrinkWrapBlocksVal;
+		}
+
+		// Will be changed later if needed.
+		shrinkWrapBlocksVal = false;
+
+		// Minified: var b,c,d
+		var div, body, container;
+
+		body = document.getElementsByTagName( "body" )[ 0 ];
+		if ( !body || !body.style ) {
+			// Test fired too early or in an unsupported environment, exit.
+			return;
+		}
+
+		// Setup
+		div = document.createElement( "div" );
+		container = document.createElement( "div" );
+		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE6
+		// Check if elements with layout shrink-wrap their children
+		if ( typeof div.style.zoom !== strundefined ) {
+			// Reset CSS: box-sizing; display; margin; border
+			div.style.cssText =
+				// Support: Firefox<29, Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;" +
+				"padding:1px;width:1px;zoom:1";
+			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+			shrinkWrapBlocksVal = div.offsetWidth !== 3;
+		}
+
+		body.removeChild( container );
+
+		return shrinkWrapBlocksVal;
+	};
+
+})();
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+
+
+var getStyles, curCSS,
+	rposition = /^(top|right|bottom|left)$/;
+
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		if ( elem.ownerDocument.defaultView.opener ) {
+			return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+		}
+
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var width, minWidth, maxWidth, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+
+		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
+
+		if ( computed ) {
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+				// Remember the original values
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				// Put in the new values to get a computed value out
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				// Revert the changed values
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "";
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var left, rs, rsLeft, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+		ret = computed ? computed[ name ] : undefined;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "" || "auto";
+	};
+}
+
+
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			var condition = conditionFn();
+
+			if ( condition == null ) {
+				// The test was not ready at this point; screw the hook this time
+				// but check again when needed next time.
+				return;
+			}
+
+			if ( condition ) {
+				// Hook not needed (or it's not possible to use it due to missing dependency),
+				// remove it.
+				// Since there are no other hooks for marginRight, remove the whole object.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+
+			return (this.get = hookFn).apply( this, arguments );
+		}
+	};
+}
+
+
+(function() {
+	// Minified: var b,c,d,e,f,g, h,i
+	var div, style, a, pixelPositionVal, boxSizingReliableVal,
+		reliableHiddenOffsetsVal, reliableMarginRightVal;
+
+	// Setup
+	div = document.createElement( "div" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+	a = div.getElementsByTagName( "a" )[ 0 ];
+	style = a && a.style;
+
+	// Finish early in limited (non-browser) environments
+	if ( !style ) {
+		return;
+	}
+
+	style.cssText = "float:left;opacity:.5";
+
+	// Support: IE<9
+	// Make sure that element opacity exists (as opposed to filter)
+	support.opacity = style.opacity === "0.5";
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!style.cssFloat;
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Support: Firefox<29, Android 2.3
+	// Vendor-prefix box-sizing
+	support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
+		style.WebkitBoxSizing === "";
+
+	jQuery.extend(support, {
+		reliableHiddenOffsets: function() {
+			if ( reliableHiddenOffsetsVal == null ) {
+				computeStyleTests();
+			}
+			return reliableHiddenOffsetsVal;
+		},
+
+		boxSizingReliable: function() {
+			if ( boxSizingReliableVal == null ) {
+				computeStyleTests();
+			}
+			return boxSizingReliableVal;
+		},
+
+		pixelPosition: function() {
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return pixelPositionVal;
+		},
+
+		// Support: Android 2.3
+		reliableMarginRight: function() {
+			if ( reliableMarginRightVal == null ) {
+				computeStyleTests();
+			}
+			return reliableMarginRightVal;
+		}
+	});
+
+	function computeStyleTests() {
+		// Minified: var b,c,d,j
+		var div, body, container, contents;
+
+		body = document.getElementsByTagName( "body" )[ 0 ];
+		if ( !body || !body.style ) {
+			// Test fired too early or in an unsupported environment, exit.
+			return;
+		}
+
+		// Setup
+		div = document.createElement( "div" );
+		container = document.createElement( "div" );
+		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+		body.appendChild( container ).appendChild( div );
+
+		div.style.cssText =
+			// Support: Firefox<29, Android 2.3
+			// Vendor-prefix box-sizing
+			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+			"box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+			"border:1px;padding:1px;width:4px;position:absolute";
+
+		// Support: IE<9
+		// Assume reasonable values in the absence of getComputedStyle
+		pixelPositionVal = boxSizingReliableVal = false;
+		reliableMarginRightVal = true;
+
+		// Check for getComputedStyle so that this code is not run in IE<9.
+		if ( window.getComputedStyle ) {
+			pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			boxSizingReliableVal =
+				( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Support: Android 2.3
+			// Div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container (#3333)
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			contents = div.appendChild( document.createElement( "div" ) );
+
+			// Reset CSS: box-sizing; display; margin; border; padding
+			contents.style.cssText = div.style.cssText =
+				// Support: Firefox<29, Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+			contents.style.marginRight = contents.style.width = "0";
+			div.style.width = "1px";
+
+			reliableMarginRightVal =
+				!parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
+
+			div.removeChild( contents );
+		}
+
+		// Support: IE8
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		contents = div.getElementsByTagName( "td" );
+		contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
+		reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+		if ( reliableHiddenOffsetsVal ) {
+			contents[ 0 ].style.display = "";
+			contents[ 1 ].style.display = "none";
+			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+		}
+
+		body.removeChild( container );
+	}
+
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var
+		ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	},
+
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			hidden = isHidden( elem );
+
+			if ( display && display !== "none" || !hidden ) {
+				jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set. See: #7116
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight (for every problematic property) identical functions
+			if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+				// Support: IE
+				// Swallow errors from 'invalid' CSS values (#5509)
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+					jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					}) :
+					getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+	function( elem, computed ) {
+		if ( computed ) {
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			// Work around by temporarily setting element display to inline-block
+			return jQuery.swap( elem, { "display": "inline-block" },
+				curCSS, [ elem, "marginRight" ] );
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( jQuery.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each(function() {
+			if ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	}
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value ),
+				target = tween.cur(),
+				parts = rfxnum.exec( value ),
+				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+				// Starting value computation is required for potential unit mismatches
+				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+				scale = 1,
+				maxIterations = 20;
+
+			if ( start && start[ 3 ] !== unit ) {
+				// Trust units reported by jQuery.css
+				unit = unit || start[ 3 ];
+
+				// Make sure we update the tween properties later on
+				parts = parts || [];
+
+				// Iteratively approximate from a nonzero starting point
+				start = +target || 1;
+
+				do {
+					// If previous iteration zeroed out, double until we get *something*
+					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+					scale = scale || ".5";
+
+					// Adjust and apply
+					start = start / scale;
+					jQuery.style( tween.elem, prop, start + unit );
+
+				// Update scale, tolerating zero or NaN from tween.cur()
+				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+			}
+
+			// Update tween properties
+			if ( parts ) {
+				start = tween.start = +start || +target || 0;
+				tween.unit = unit;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[ 1 ] ?
+					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+					+parts[ 2 ];
+			}
+
+			return tween;
+		} ]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+			// we're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = jQuery._data( elem, "fxshow" );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		display = jQuery.css( elem, "display" );
+
+		// Test default display if display is currently "none"
+		checkDisplay = display === "none" ?
+			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !support.shrinkWrapBlocks() ) {
+			anim.always(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+		// Any non-fx value stops us from restoring the original display value
+		} else {
+			display = undefined;
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = jQuery._data( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+
+	// If this is a noop like .hide().hide(), restore an overwritten display value
+	} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+		style.display = display;
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || jQuery._data( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each(function() {
+			var index,
+				data = jQuery._data( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// enable finishing flag on private data
+			data.finish = true;
+
+			// empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// turn off finishing flag
+			delete data.finish;
+		});
+	}
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	if ( timer() ) {
+		jQuery.fx.start();
+	} else {
+		jQuery.timers.pop();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = setTimeout( next, time );
+		hooks.stop = function() {
+			clearTimeout( timeout );
+		};
+	});
+};
+
+
+(function() {
+	// Minified: var a,b,c,d,e
+	var input, div, select, a, opt;
+
+	// Setup
+	div = document.createElement( "div" );
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+	a = div.getElementsByTagName("a")[ 0 ];
+
+	// First batch of tests.
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px";
+
+	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// Get the style information from getAttribute
+	// (IE uses .cssText instead)
+	support.style = /top/.test( a.getAttribute("style") );
+
+	// Make sure that URLs aren't manipulated
+	// (IE normalizes it by default)
+	support.hrefNormalized = a.getAttribute("href") === "/a";
+
+	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+	support.checkOn = !!input.value;
+
+	// Make sure that a selected-by-default option has a working selected property.
+	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+	support.optSelected = opt.selected;
+
+	// Tests for enctype support on a form (#6743)
+	support.enctype = !!document.createElement("form").enctype;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE8 only
+	// Check if we can trust getAttribute("value")
+	input = document.createElement( "input" );
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+})();
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+					// Support: IE10-11+
+					// option.text throws exceptions (#14686, #14858)
+					jQuery.trim( jQuery.text( elem ) );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+							// Don't return options that are disabled or in a disabled optgroup
+							( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
+
+						// Support: IE6
+						// When new option element is added to select box we need to
+						// force reflow of newly added node in order to workaround delay
+						// of initialization properties
+						try {
+							option.selected = optionSet = true;
+
+						} catch ( _ ) {
+
+							// Will be executed only in IE6
+							option.scrollHeight;
+						}
+
+					} else {
+						option.selected = false;
+					}
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+
+				return options;
+			}
+		}
+	}
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			// Support: Webkit
+			// "" is returned instead of "on" if a value isn't specified
+			return elem.getAttribute("value") === null ? "on" : elem.value;
+		};
+	}
+});
+
+
+
+
+var nodeHook, boolHook,
+	attrHandle = jQuery.expr.attrHandle,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = support.getSetAttribute,
+	getSetInput = support.input;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	}
+});
+
+jQuery.extend({
+	attr: function( elem, name, value ) {
+		var hooks, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === strundefined ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+			ret = jQuery.find.attr( elem, name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( (name = attrNames[i++]) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+					// Set corresponding property to false
+					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+						elem[ propName ] = false;
+					// Support: IE<9
+					// Also clear defaultChecked/defaultSelected (if appropriate)
+					} else {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+
+		return name;
+	}
+};
+
+// Retrieve booleans specially
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+		function( elem, name, isXML ) {
+			var ret, handle;
+			if ( !isXML ) {
+				// Avoid an infinite loop by temporarily removing this function from the getter
+				handle = attrHandle[ name ];
+				attrHandle[ name ] = ret;
+				ret = getter( elem, name, isXML ) != null ?
+					name.toLowerCase() :
+					null;
+				attrHandle[ name ] = handle;
+			}
+			return ret;
+		} :
+		function( elem, name, isXML ) {
+			if ( !isXML ) {
+				return elem[ jQuery.camelCase( "default-" + name ) ] ?
+					name.toLowerCase() :
+					null;
+			}
+		};
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = {
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					(ret = elem.ownerDocument.createAttribute( name ))
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			if ( name === "value" || value === elem.getAttribute( name ) ) {
+				return value;
+			}
+		}
+	};
+
+	// Some attributes are constructed with empty-string values when not defined
+	attrHandle.id = attrHandle.name = attrHandle.coords =
+		function( elem, name, isXML ) {
+			var ret;
+			if ( !isXML ) {
+				return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+					ret.value :
+					null;
+			}
+		};
+
+	// Fixing value retrieval on a button requires this module
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			if ( ret && ret.specified ) {
+				return ret.value;
+			}
+		},
+		set: nodeHook.set
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		};
+	});
+}
+
+if ( !support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case senstitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend({
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	}
+});
+
+jQuery.extend({
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+				ret :
+				( elem[ name ] = value );
+
+		} else {
+			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+				ret :
+				elem[ name ];
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				return tabindex ?
+					parseInt( tabindex, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						-1;
+			}
+		}
+	}
+});
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !support.hrefNormalized ) {
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each([ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	});
+}
+
+// Support: Safari, IE9+
+// mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	};
+}
+
+jQuery.each([
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j, finalValue,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// only assign if different to avoid unneeded rendering.
+					finalValue = jQuery.trim( cur );
+					if ( elem.className !== finalValue ) {
+						elem.className = finalValue;
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j, finalValue,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// only assign if different to avoid unneeded rendering.
+					finalValue = value ? jQuery.trim( cur ) : "";
+					if ( elem.className !== finalValue ) {
+						elem.className = finalValue;
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					classNames = value.match( rnotwhite ) || [];
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( type === strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// If the element has a class name or if we're passed "false",
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+});
+
+jQuery.fn.extend({
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	}
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
+
+jQuery.parseJSON = function( data ) {
+	// Attempt to parse using the native JSON parser first
+	if ( window.JSON && window.JSON.parse ) {
+		// Support: Android 2.3
+		// Workaround failure to string-cast null input
+		return window.JSON.parse( data + "" );
+	}
+
+	var requireNonComma,
+		depth = null,
+		str = jQuery.trim( data + "" );
+
+	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
+	// after removing valid tokens
+	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
+
+		// Force termination if we see a misplaced comma
+		if ( requireNonComma && comma ) {
+			depth = 0;
+		}
+
+		// Perform no more replacements after returning to outermost depth
+		if ( depth === 0 ) {
+			return token;
+		}
+
+		// Commas must not follow "[", "{", or ","
+		requireNonComma = open || comma;
+
+		// Determine new depth
+		// array/object open ("[" or "{"): depth += true - false (increment)
+		// array/object close ("]" or "}"): depth += false - true (decrement)
+		// other cases ("," or primitive): depth += true - true (numeric cast)
+		depth += !close - !open;
+
+		// Remove this token
+		return "";
+	}) ) ?
+		( Function( "return " + str ) )() :
+		jQuery.error( "Invalid JSON: " + data );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, tmp;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	try {
+		if ( window.DOMParser ) { // Standard
+			tmp = new DOMParser();
+			xml = tmp.parseFromString( data, "text/xml" );
+		} else { // IE
+			xml = new ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+	} catch( e ) {
+		xml = undefined;
+	}
+	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+		jQuery.error( "Invalid XML: " + data );
+	}
+	return xml;
+};
+
+
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			while ( (dataType = dataTypes[i++]) ) {
+				// Prepend if requested
+				if ( dataType.charAt( 0 ) === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+				// Otherwise append
+				} else {
+					(structure[ dataType ] = structure[ dataType ] || []).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		});
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var deep, key,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+	var firstDataType, ct, finalDataType, type,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s[ "throws" ] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Cross-domain detection vars
+			parts,
+			// Loop variable
+			i,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers as string
+			responseHeadersString,
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+			// Response headers
+			responseHeaders,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks("once memory"),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( (match = rheaders.exec( responseHeadersString )) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger("ajaxStart");
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+			}
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout(function() {
+					jqXHR.abort("timeout");
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("etag");
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger("ajaxStop");
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+
+jQuery._evalUrl = function( url ) {
+	return jQuery.ajax({
+		url: url,
+		type: "GET",
+		dataType: "script",
+		async: false,
+		global: false,
+		"throws": true
+	});
+};
+
+
+jQuery.fn.extend({
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	}
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+	// Support: Opera <= 12.12
+	// Opera reports offsetWidths and offsetHeights less than zero on some elements
+	return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+		(!support.reliableHiddenOffsets() &&
+			((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+};
+
+jQuery.expr.filters.visible = function( elem ) {
+	return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function() {
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		})
+		.filter(function() {
+			var type = this.type;
+			// Use .is(":disabled") so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		})
+		.map(function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ) {
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
+	// Support: IE6+
+	function() {
+
+		// XHR cannot access local files, always use ActiveX for that case
+		return !this.isLocal &&
+
+			// Support: IE7-8
+			// oldIE XHR does not support non-RFC2616 methods (#13240)
+			// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
+			// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
+			// Although this check for six methods instead of eight
+			// since IE also does not support "trace" and "connect"
+			/^(get|post|head|put|delete|options)$/i.test( this.type ) &&
+
+			createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+var xhrId = 0,
+	xhrCallbacks = {},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE<10
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+	window.attachEvent( "onunload", function() {
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	});
+}
+
+// Determine support properties
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport(function( options ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !options.crossDomain || support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+					var i,
+						xhr = options.xhr(),
+						id = ++xhrId;
+
+					// Open the socket
+					xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+					// Apply custom fields if provided
+					if ( options.xhrFields ) {
+						for ( i in options.xhrFields ) {
+							xhr[ i ] = options.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( options.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( options.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+						headers["X-Requested-With"] = "XMLHttpRequest";
+					}
+
+					// Set headers
+					for ( i in headers ) {
+						// Support: IE<9
+						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
+						// request header to a null-value.
+						//
+						// To keep consistent with other XHR implementations, cast the value
+						// to string and ignore `undefined`.
+						if ( headers[ i ] !== undefined ) {
+							xhr.setRequestHeader( i, headers[ i ] + "" );
+						}
+					}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( options.hasContent && options.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, statusText, responses;
+
+						// Was never called and is aborted or complete
+						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+							// Clean up
+							delete xhrCallbacks[ id ];
+							callback = undefined;
+							xhr.onreadystatechange = jQuery.noop;
+
+							// Abort manually if needed
+							if ( isAbort ) {
+								if ( xhr.readyState !== 4 ) {
+									xhr.abort();
+								}
+							} else {
+								responses = {};
+								status = xhr.status;
+
+								// Support: IE<10
+								// Accessing binary-data responseText throws an exception
+								// (#11426)
+								if ( typeof xhr.responseText === "string" ) {
+									responses.text = xhr.responseText;
+								}
+
+								// Firefox throws an exception when accessing
+								// statusText for faulty cross-domain requests
+								try {
+									statusText = xhr.statusText;
+								} catch( e ) {
+									// We normalize with Webkit giving an empty statusText
+									statusText = "";
+								}
+
+								// Filter status for non standard behaviors
+
+								// If the request is local and we have data: assume a success
+								// (success with no data won't get notified, that's the best we
+								// can do given current implementations)
+								if ( !status && options.isLocal && !options.crossDomain ) {
+									status = responses.text ? 200 : 404;
+								// IE - #1450: sometimes returns 1223 when it should be 204
+								} else if ( status === 1223 ) {
+									status = 204;
+								}
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
+						}
+					};
+
+					if ( !options.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback );
+					} else {
+						// Add to the list of active xhr callbacks
+						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery("head")[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement("script");
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+	context = context || document;
+
+	var parsed = rsingleTag.exec( data ),
+		scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[1] ) ];
+	}
+
+	parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = jQuery.trim( url.slice( off, url.length ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax({
+			url: url,
+
+			// if "type" variable is undefined, then "GET" method will be used
+			type: type,
+			dataType: "html",
+			data: params
+		}).done(function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+		});
+	}
+
+	return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+});
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+	return jQuery.grep(jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	}).length;
+};
+
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend({
+	offset: function( options ) {
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each(function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				});
+		}
+
+		var docElem, win,
+			box = { top: 0, left: 0 },
+			elem = this[ 0 ],
+			doc = elem && elem.ownerDocument;
+
+		if ( !doc ) {
+			return;
+		}
+
+		docElem = doc.documentElement;
+
+		// Make sure it's not a disconnected DOM node
+		if ( !jQuery.contains( docElem, elem ) ) {
+			return box;
+		}
+
+		// If we don't have gBCR, just use 0,0 rather than error
+		// BlackBerry 5, iOS 3 (original iPhone)
+		if ( typeof elem.getBoundingClientRect !== strundefined ) {
+			box = elem.getBoundingClientRect();
+		}
+		win = getWindow( doc );
+		return {
+			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+		};
+	},
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || docElem;
+
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || docElem;
+		});
+	}
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+				// if curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	});
+}
+
+
+
+
+var
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+
+}));
diff --git a/documentation/_static/minus.png b/documentation/_static/minus.png
index da1c562..0f22b16 100644
Binary files a/documentation/_static/minus.png and b/documentation/_static/minus.png differ
diff --git a/documentation/_static/plus.png b/documentation/_static/plus.png
index b3cb374..0cfe084 100644
Binary files a/documentation/_static/plus.png and b/documentation/_static/plus.png differ
diff --git a/documentation/_static/pygments.css b/documentation/_static/pygments.css
index ed79e79..b4a1333 100644
--- a/documentation/_static/pygments.css
+++ b/documentation/_static/pygments.css
@@ -4,8 +4,10 @@
 .highlight .err { border: 1px solid #FF0000 } /* Error */
 .highlight .k { color: #007020; font-weight: bold } /* Keyword */
 .highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
 .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
 .highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
 .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
 .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
 .highlight .gd { color: #A00000 } /* Generic.Deleted */
@@ -40,6 +42,7 @@
 .highlight .nv { color: #bb60d5 } /* Name.Variable */
 .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
 .highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #208050 } /* Literal.Number.Bin */
 .highlight .mf { color: #208050 } /* Literal.Number.Float */
 .highlight .mh { color: #208050 } /* Literal.Number.Hex */
 .highlight .mi { color: #208050 } /* Literal.Number.Integer */
diff --git a/documentation/_static/searchtools.js b/documentation/_static/searchtools.js
index 56676b2..cb74467 100644
--- a/documentation/_static/searchtools.js
+++ b/documentation/_static/searchtools.js
@@ -4,12 +4,13 @@
  *
  * Sphinx JavaScript utilties for the full-text search.
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
 
 
+/* Non-minified version JS is _stemmer.js if file is provided */ 
 /**
  * Porter Stemmer
  */
@@ -330,13 +331,13 @@ var Search = {
           objectterms.push(tmp[i].toLowerCase());
       }
 
-      if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
+      if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
           tmp[i] === "") {
         // skip this "word"
         continue;
       }
       // stem the word
-      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      var word = stemmer.stemWord(tmp[i].toLowerCase());
       var toAppend;
       // select the correct list
       if (word[0] == '-') {
@@ -373,8 +374,7 @@ var Search = {
     }
 
     // lookup as search terms in fulltext
-    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
-                     .concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
+    results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
 
     // let the scorer override scores with a custom scoring function
     if (Scorer.score) {
@@ -439,7 +439,7 @@ var Search = {
                   dataType: "text",
                   complete: function(jqxhr, textstatus) {
                     var data = jqxhr.responseText;
-                    if (data !== '') {
+                    if (data !== '' && data !== undefined) {
                       listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
                     }
                     Search.output.append(listItem);
@@ -538,23 +538,47 @@ var Search = {
   /**
    * search for full-text terms in the index
    */
-  performTermsSearch : function(searchterms, excluded, terms, score) {
+  performTermsSearch : function(searchterms, excluded, terms, titleterms) {
     var filenames = this._index.filenames;
     var titles = this._index.titles;
 
-    var i, j, file, files;
+    var i, j, file;
     var fileMap = {};
+    var scoreMap = {};
     var results = [];
 
     // perform the search on the required terms
     for (i = 0; i < searchterms.length; i++) {
       var word = searchterms[i];
+      var files = [];
+      var _o = [
+        {files: terms[word], score: Scorer.term},
+        {files: titleterms[word], score: Scorer.title}
+      ];
+
       // no match but word was a required one
-      if (!(files = terms[word]))
+      if ($u.every(_o, function(o){return o.files === undefined;})) {
         break;
-      if (files.length === undefined) {
-        files = [files];
       }
+      // found search word in contents
+      $u.each(_o, function(o) {
+        var _files = o.files;
+        if (_files === undefined)
+          return
+
+        if (_files.length === undefined)
+          _files = [_files];
+        files = files.concat(_files);
+
+        // set score for the word in each file to Scorer.term
+        for (j = 0; j < _files.length; j++) {
+          file = _files[j];
+          if (!(file in scoreMap))
+            scoreMap[file] = {}
+          scoreMap[file][word] = o.score;
+        }
+      });
+
       // create the mapping
       for (j = 0; j < files.length; j++) {
         file = files[j];
@@ -576,7 +600,9 @@ var Search = {
       // ensure that none of the excluded terms is in the search result
       for (i = 0; i < excluded.length; i++) {
         if (terms[excluded[i]] == file ||
-          $u.contains(terms[excluded[i]] || [], file)) {
+            titleterms[excluded[i]] == file ||
+            $u.contains(terms[excluded[i]] || [], file) ||
+            $u.contains(titleterms[excluded[i]] || [], file)) {
           valid = false;
           break;
         }
@@ -584,6 +610,9 @@ var Search = {
 
       // if we have still a valid result we can add it to the result list
       if (valid) {
+        // select one (max) score for the file.
+        // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
+        var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
         results.push([filenames[file], titles[file], '', null, score]);
       }
     }
diff --git a/documentation/_static/sidebar.js b/documentation/_static/sidebar.js
index 5adf895..4282fe9 100644
--- a/documentation/_static/sidebar.js
+++ b/documentation/_static/sidebar.js
@@ -16,7 +16,7 @@
  * Once the browser is closed the cookie is deleted and the position
  * reset to the default (expanded).
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -142,7 +142,7 @@ $(function() {
     var items = document.cookie.split(';');
     for(var k=0; k<items.length; k++) {
       var key_val = items[k].split('=');
-      var key = key_val[0];
+      var key = key_val[0].replace(/ /, "");  // strip leading spaces
       if (key == 'sidebar') {
         var value = key_val[1];
         if ((value == 'collapsed') && (!sidebar_is_collapsed()))
diff --git a/documentation/_static/underscore.js b/documentation/_static/underscore.js
index 5b55f32..b4f49a0 100644
--- a/documentation/_static/underscore.js
+++ b/documentation/_static/underscore.js
@@ -1,31 +1,1415 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object [...]
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h i [...]
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var [...]
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.l [...]
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.f [...]
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g, [...]
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d) [...]
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a [...]
-return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedInd [...]
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length- [...]
-b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];retur [...]
-return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=func [...]
-d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d; [...]
-var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.mem [...]
-c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c)) [...]
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)] [...]
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function( [...]
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){ret [...]
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a) [...]
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin [...]
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return [...]
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=func [...]
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.ch [...]
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
+//     Underscore.js 1.7.0
+//     http://underscorejs.org
+//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `exports` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var
+    push             = ArrayProto.push,
+    slice            = ArrayProto.slice,
+    concat           = ArrayProto.concat,
+    toString         = ObjProto.toString,
+    hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind;
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) {
+    if (obj instanceof _) return obj;
+    if (!(this instanceof _)) return new _(obj);
+    this._wrapped = obj;
+  };
+
+  // Export the Underscore object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, add `_` as a global object.
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      exports = module.exports = _;
+    }
+    exports._ = _;
+  } else {
+    root._ = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.7.0';
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  var createCallback = function(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      case 2: return function(value, other) {
+        return func.call(context, value, other);
+      };
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  };
+
+  // A mostly-internal function to generate callbacks that can be applied
+  // to each element in a collection, returning the desired result — either
+  // identity, an arbitrary callback, a property matcher, or a property accessor.
+  _.iteratee = function(value, context, argCount) {
+    if (value == null) return _.identity;
+    if (_.isFunction(value)) return createCallback(value, context, argCount);
+    if (_.isObject(value)) return _.matches(value);
+    return _.property(value);
+  };
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  _.each = _.forEach = function(obj, iteratee, context) {
+    if (obj == null) return obj;
+    iteratee = createCallback(iteratee, context);
+    var i, length = obj.length;
+    if (length === +length) {
+      for (i = 0; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var keys = _.keys(obj);
+      for (i = 0, length = keys.length; i < length; i++) {
+        iteratee(obj[keys[i]], keys[i], obj);
+      }
+    }
+    return obj;
+  };
+
+  // Return the results of applying the iteratee to each element.
+  _.map = _.collect = function(obj, iteratee, context) {
+    if (obj == null) return [];
+    iteratee = _.iteratee(iteratee, context);
+    var keys = obj.length !== +obj.length && _.keys(obj),
+        length = (keys || obj).length,
+        results = Array(length),
+        currentKey;
+    for (var index = 0; index < length; index++) {
+      currentKey = keys ? keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  };
+
+  var reduceError = 'Reduce of empty array with no initial value';
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
+    if (obj == null) obj = [];
+    iteratee = createCallback(iteratee, context, 4);
+    var keys = obj.length !== +obj.length && _.keys(obj),
+        length = (keys || obj).length,
+        index = 0, currentKey;
+    if (arguments.length < 3) {
+      if (!length) throw new TypeError(reduceError);
+      memo = obj[keys ? keys[index++] : index++];
+    }
+    for (; index < length; index++) {
+      currentKey = keys ? keys[index] : index;
+      memo = iteratee(memo, obj[currentKey], currentKey, obj);
+    }
+    return memo;
+  };
+
+  // The right-associative version of reduce, also known as `foldr`.
+  _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
+    if (obj == null) obj = [];
+    iteratee = createCallback(iteratee, context, 4);
+    var keys = obj.length !== + obj.length && _.keys(obj),
+        index = (keys || obj).length,
+        currentKey;
+    if (arguments.length < 3) {
+      if (!index) throw new TypeError(reduceError);
+      memo = obj[keys ? keys[--index] : --index];
+    }
+    while (index--) {
+      currentKey = keys ? keys[index] : index;
+      memo = iteratee(memo, obj[currentKey], currentKey, obj);
+    }
+    return memo;
+  };
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, predicate, context) {
+    var result;
+    predicate = _.iteratee(predicate, context);
+    _.some(obj, function(value, index, list) {
+      if (predicate(value, index, list)) {
+        result = value;
+        return true;
+      }
+    });
+    return result;
+  };
+
+  // Return all the elements that pass a truth test.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, predicate, context) {
+    var results = [];
+    if (obj == null) return results;
+    predicate = _.iteratee(predicate, context);
+    _.each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, predicate, context) {
+    return _.filter(obj, _.negate(_.iteratee(predicate)), context);
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, predicate, context) {
+    if (obj == null) return true;
+    predicate = _.iteratee(predicate, context);
+    var keys = obj.length !== +obj.length && _.keys(obj),
+        length = (keys || obj).length,
+        index, currentKey;
+    for (index = 0; index < length; index++) {
+      currentKey = keys ? keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Aliased as `any`.
+  _.some = _.any = function(obj, predicate, context) {
+    if (obj == null) return false;
+    predicate = _.iteratee(predicate, context);
+    var keys = obj.length !== +obj.length && _.keys(obj),
+        length = (keys || obj).length,
+        index, currentKey;
+    for (index = 0; index < length; index++) {
+      currentKey = keys ? keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  };
+
+  // Determine if the array or object contains a given value (using `===`).
+  // Aliased as `include`.
+  _.contains = _.include = function(obj, target) {
+    if (obj == null) return false;
+    if (obj.length !== +obj.length) obj = _.values(obj);
+    return _.indexOf(obj, target) >= 0;
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    var isFunc = _.isFunction(method);
+    return _.map(obj, function(value) {
+      return (isFunc ? method : value[method]).apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, _.property(key));
+  };
+
+  // Convenience version of a common use case of `filter`: selecting only objects
+  // containing specific `key:value` pairs.
+  _.where = function(obj, attrs) {
+    return _.filter(obj, _.matches(attrs));
+  };
+
+  // Convenience version of a common use case of `find`: getting the first object
+  // containing specific `key:value` pairs.
+  _.findWhere = function(obj, attrs) {
+    return _.find(obj, _.matches(attrs));
+  };
+
+  // Return the maximum element (or element-based computation).
+  _.max = function(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null && obj != null) {
+      obj = obj.length === +obj.length ? obj : _.values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = _.iteratee(iteratee, context);
+      _.each(obj, function(value, index, list) {
+        computed = iteratee(value, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = value;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null && obj != null) {
+      obj = obj.length === +obj.length ? obj : _.values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = _.iteratee(iteratee, context);
+      _.each(obj, function(value, index, list) {
+        computed = iteratee(value, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = value;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  };
+
+  // Shuffle a collection, using the modern version of the
+  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  _.shuffle = function(obj) {
+    var set = obj && obj.length === +obj.length ? obj : _.values(obj);
+    var length = set.length;
+    var shuffled = Array(length);
+    for (var index = 0, rand; index < length; index++) {
+      rand = _.random(0, index);
+      if (rand !== index) shuffled[index] = shuffled[rand];
+      shuffled[rand] = set[index];
+    }
+    return shuffled;
+  };
+
+  // Sample **n** random values from a collection.
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `map`.
+  _.sample = function(obj, n, guard) {
+    if (n == null || guard) {
+      if (obj.length !== +obj.length) obj = _.values(obj);
+      return obj[_.random(obj.length - 1)];
+    }
+    return _.shuffle(obj).slice(0, Math.max(0, n));
+  };
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  _.sortBy = function(obj, iteratee, context) {
+    iteratee = _.iteratee(iteratee, context);
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value: value,
+        index: index,
+        criteria: iteratee(value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  };
+
+  // An internal function used for aggregate "group by" operations.
+  var group = function(behavior) {
+    return function(obj, iteratee, context) {
+      var result = {};
+      iteratee = _.iteratee(iteratee, context);
+      _.each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  };
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  _.groupBy = group(function(result, value, key) {
+    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `groupBy`, but for
+  // when you know that your index values will be unique.
+  _.indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  _.countBy = group(function(result, value, key) {
+    if (_.has(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iteratee, context) {
+    iteratee = _.iteratee(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = low + high >>> 1;
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  };
+
+  // Safely create a real, live array from anything iterable.
+  _.toArray = function(obj) {
+    if (!obj) return [];
+    if (_.isArray(obj)) return slice.call(obj);
+    if (obj.length === +obj.length) return _.map(obj, _.identity);
+    return _.values(obj);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    if (obj == null) return 0;
+    return obj.length === +obj.length ? obj.length : _.keys(obj).length;
+  };
+
+  // Split a collection into two arrays: one whose elements all satisfy the given
+  // predicate, and one whose elements all do not satisfy the predicate.
+  _.partition = function(obj, predicate, context) {
+    predicate = _.iteratee(predicate, context);
+    var pass = [], fail = [];
+    _.each(obj, function(value, key, obj) {
+      (predicate(value, key, obj) ? pass : fail).push(value);
+    });
+    return [pass, fail];
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head` and `take`. The **guard** check
+  // allows it to work with `_.map`.
+  _.first = _.head = _.take = function(array, n, guard) {
+    if (array == null) return void 0;
+    if (n == null || guard) return array[0];
+    if (n < 0) return [];
+    return slice.call(array, 0, n);
+  };
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N. The **guard** check allows it to work with
+  // `_.map`.
+  _.initial = function(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  };
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  _.last = function(array, n, guard) {
+    if (array == null) return void 0;
+    if (n == null || guard) return array[array.length - 1];
+    return slice.call(array, Math.max(array.length - n, 0));
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+  // Especially useful on the arguments object. Passing an **n** will return
+  // the rest N values in the array. The **guard**
+  // check allows it to work with `_.map`.
+  _.rest = _.tail = _.drop = function(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, _.identity);
+  };
+
+  // Internal implementation of a recursive `flatten` function.
+  var flatten = function(input, shallow, strict, output) {
+    if (shallow && _.every(input, _.isArray)) {
+      return concat.apply(output, input);
+    }
+    for (var i = 0, length = input.length; i < length; i++) {
+      var value = input[i];
+      if (!_.isArray(value) && !_.isArguments(value)) {
+        if (!strict) output.push(value);
+      } else if (shallow) {
+        push.apply(output, value);
+      } else {
+        flatten(value, shallow, strict, output);
+      }
+    }
+    return output;
+  };
+
+  // Flatten out an array, either recursively (by default), or just one level.
+  _.flatten = function(array, shallow) {
+    return flatten(array, shallow, false, []);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
+    if (array == null) return [];
+    if (!_.isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = _.iteratee(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = array.length; i < length; i++) {
+      var value = array[i];
+      if (isSorted) {
+        if (!i || seen !== value) result.push(value);
+        seen = value;
+      } else if (iteratee) {
+        var computed = iteratee(value, i, array);
+        if (_.indexOf(seen, computed) < 0) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (_.indexOf(result, value) < 0) {
+        result.push(value);
+      }
+    }
+    return result;
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(flatten(arguments, true, true, []));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  _.intersection = function(array) {
+    if (array == null) return [];
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = array.length; i < length; i++) {
+      var item = array[i];
+      if (_.contains(result, item)) continue;
+      for (var j = 1; j < argsLength; j++) {
+        if (!_.contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  };
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array) {
+    var rest = flatten(slice.call(arguments, 1), true, true, []);
+    return _.filter(array, function(value){
+      return !_.contains(rest, value);
+    });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function(array) {
+    if (array == null) return [];
+    var length = _.max(arguments, 'length').length;
+    var results = Array(length);
+    for (var i = 0; i < length; i++) {
+      results[i] = _.pluck(arguments, i);
+    }
+    return results;
+  };
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values.
+  _.object = function(list, values) {
+    if (list == null) return {};
+    var result = {};
+    for (var i = 0, length = list.length; i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  };
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = function(array, item, isSorted) {
+    if (array == null) return -1;
+    var i = 0, length = array.length;
+    if (isSorted) {
+      if (typeof isSorted == 'number') {
+        i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
+      } else {
+        i = _.sortedIndex(array, item);
+        return array[i] === item ? i : -1;
+      }
+    }
+    for (; i < length; i++) if (array[i] === item) return i;
+    return -1;
+  };
+
+  _.lastIndexOf = function(array, item, from) {
+    if (array == null) return -1;
+    var idx = array.length;
+    if (typeof from == 'number') {
+      idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
+    }
+    while (--idx >= 0) if (array[idx] === item) return idx;
+    return -1;
+  };
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = step || 1;
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Reusable constructor function for prototype setting.
+  var Ctor = function(){};
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+  // available.
+  _.bind = function(func, context) {
+    var args, bound;
+    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
+    args = slice.call(arguments, 2);
+    bound = function() {
+      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
+      Ctor.prototype = func.prototype;
+      var self = new Ctor;
+      Ctor.prototype = null;
+      var result = func.apply(self, args.concat(slice.call(arguments)));
+      if (_.isObject(result)) return result;
+      return self;
+    };
+    return bound;
+  };
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. _ acts
+  // as a placeholder, allowing any combination of arguments to be pre-filled.
+  _.partial = function(func) {
+    var boundArgs = slice.call(arguments, 1);
+    return function() {
+      var position = 0;
+      var args = boundArgs.slice();
+      for (var i = 0, length = args.length; i < length; i++) {
+        if (args[i] === _) args[i] = arguments[position++];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return func.apply(this, args);
+    };
+  };
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var i, length = arguments.length, key;
+    if (length <= 1) throw new Error('bindAll must be passed function names');
+    for (i = 1; i < length; i++) {
+      key = arguments[i];
+      obj[key] = _.bind(obj[key], obj);
+    }
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = hasher ? hasher.apply(this, arguments) : key;
+      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){
+      return func.apply(null, args);
+    }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = function(func) {
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+  };
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  _.throttle = function(func, wait, options) {
+    var context, args, result;
+    var timeout = null;
+    var previous = 0;
+    if (!options) options = {};
+    var later = function() {
+      previous = options.leading === false ? 0 : _.now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+    return function() {
+      var now = _.now();
+      if (!previous && options.leading === false) previous = now;
+      var remaining = wait - (now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        clearTimeout(timeout);
+        timeout = null;
+        previous = now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds. If `immediate` is passed, trigger the function on the
+  // leading edge, instead of the trailing.
+  _.debounce = function(func, wait, immediate) {
+    var timeout, args, context, timestamp, result;
+
+    var later = function() {
+      var last = _.now() - timestamp;
+
+      if (last < wait && last > 0) {
+        timeout = setTimeout(later, wait - last);
+      } else {
+        timeout = null;
+        if (!immediate) {
+          result = func.apply(context, args);
+          if (!timeout) context = args = null;
+        }
+      }
+    };
+
+    return function() {
+      context = this;
+      args = arguments;
+      timestamp = _.now();
+      var callNow = immediate && !timeout;
+      if (!timeout) timeout = setTimeout(later, wait);
+      if (callNow) {
+        result = func.apply(context, args);
+        context = args = null;
+      }
+
+      return result;
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return _.partial(wrapper, func);
+  };
+
+  // Returns a negated version of the passed-in predicate.
+  _.negate = function(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  };
+
+  // Returns a function that will only be executed after being called N times.
+  _.after = function(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  };
+
+  // Returns a function that will only be executed before being called N times.
+  _.before = function(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      } else {
+        func = null;
+      }
+      return memo;
+    };
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = _.partial(_.before, 2);
+
+  // Object Functions
+  // ----------------
+
+  // Retrieve the names of an object's properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = function(obj) {
+    if (!_.isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (_.has(obj, key)) keys.push(key);
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[keys[i]];
+    }
+    return values;
+  };
+
+  // Convert an object into a list of `[key, value]` pairs.
+  _.pairs = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [keys[i], obj[keys[i]]];
+    }
+    return pairs;
+  };
+
+  // Invert the keys and values of an object. The values must be serializable.
+  _.invert = function(obj) {
+    var result = {};
+    var keys = _.keys(obj);
+    for (var i = 0, length = keys.length; i < length; i++) {
+      result[obj[keys[i]]] = keys[i];
+    }
+    return result;
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    var source, prop;
+    for (var i = 1, length = arguments.length; i < length; i++) {
+      source = arguments[i];
+      for (prop in source) {
+        if (hasOwnProperty.call(source, prop)) {
+            obj[prop] = source[prop];
+        }
+      }
+    }
+    return obj;
+  };
+
+  // Return a copy of the object only containing the whitelisted properties.
+  _.pick = function(obj, iteratee, context) {
+    var result = {}, key;
+    if (obj == null) return result;
+    if (_.isFunction(iteratee)) {
+      iteratee = createCallback(iteratee, context);
+      for (key in obj) {
+        var value = obj[key];
+        if (iteratee(value, key, obj)) result[key] = value;
+      }
+    } else {
+      var keys = concat.apply([], slice.call(arguments, 1));
+      obj = new Object(obj);
+      for (var i = 0, length = keys.length; i < length; i++) {
+        key = keys[i];
+        if (key in obj) result[key] = obj[key];
+      }
+    }
+    return result;
+  };
+
+   // Return a copy of the object without the blacklisted properties.
+  _.omit = function(obj, iteratee, context) {
+    if (_.isFunction(iteratee)) {
+      iteratee = _.negate(iteratee);
+    } else {
+      var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
+      iteratee = function(value, key) {
+        return !_.contains(keys, key);
+      };
+    }
+    return _.pick(obj, iteratee, context);
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    for (var i = 1, length = arguments.length; i < length; i++) {
+      var source = arguments[i];
+      for (var prop in source) {
+        if (obj[prop] === void 0) obj[prop] = source[prop];
+      }
+    }
+    return obj;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Internal recursive comparison function for `isEqual`.
+  var eq = function(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // A strict comparison is necessary because `null == undefined`.
+    if (a == null || b == null) return a === b;
+    // Unwrap any wrapped objects.
+    if (a instanceof _) a = a._wrapped;
+    if (b instanceof _) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    switch (className) {
+      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
+      case '[object RegExp]':
+      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+    }
+    if (typeof a != 'object' || typeof b != 'object') return false;
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+    // Objects with different constructors are not equivalent, but `Object`s
+    // from different frames are.
+    var aCtor = a.constructor, bCtor = b.constructor;
+    if (
+      aCtor !== bCtor &&
+      // Handle Object.create(x) cases
+      'constructor' in a && 'constructor' in b &&
+      !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
+        _.isFunction(bCtor) && bCtor instanceof bCtor)
+    ) {
+      return false;
+    }
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+    var size, result;
+    // Recursively compare objects and arrays.
+    if (className === '[object Array]') {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      size = a.length;
+      result = size === b.length;
+      if (result) {
+        // Deep compare the contents, ignoring non-numeric properties.
+        while (size--) {
+          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+        }
+      }
+    } else {
+      // Deep compare objects.
+      var keys = _.keys(a), key;
+      size = keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      result = _.keys(b).length === size;
+      if (result) {
+        while (size--) {
+          // Deep compare each member
+          key = keys[size];
+          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+        }
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return result;
+  };
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    return eq(a, b, [], []);
+  };
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  _.isEmpty = function(obj) {
+    if (obj == null) return true;
+    if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
+    for (var key in obj) if (_.has(obj, key)) return false;
+    return true;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType === 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) === '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  };
+
+  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+    _['is' + name] = function(obj) {
+      return toString.call(obj) === '[object ' + name + ']';
+    };
+  });
+
+  // Define a fallback version of the method in browsers (ahem, IE), where
+  // there isn't any inspectable "Arguments" type.
+  if (!_.isArguments(arguments)) {
+    _.isArguments = function(obj) {
+      return _.has(obj, 'callee');
+    };
+  }
+
+  // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
+  if (typeof /./ !== 'function') {
+    _.isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  // Is a given object a finite number?
+  _.isFinite = function(obj) {
+    return isFinite(obj) && !isNaN(parseFloat(obj));
+  };
+
+  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+  _.isNaN = function(obj) {
+    return _.isNumber(obj) && obj !== +obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Shortcut function for checking if an object has a given property directly
+  // on itself (in other words, not on a prototype).
+  _.has = function(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iteratees.
+  _.identity = function(value) {
+    return value;
+  };
+
+  _.constant = function(value) {
+    return function() {
+      return value;
+    };
+  };
+
+  _.noop = function(){};
+
+  _.property = function(key) {
+    return function(obj) {
+      return obj[key];
+    };
+  };
+
+  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
+  _.matches = function(attrs) {
+    var pairs = _.pairs(attrs), length = pairs.length;
+    return function(obj) {
+      if (obj == null) return !length;
+      obj = new Object(obj);
+      for (var i = 0; i < length; i++) {
+        var pair = pairs[i], key = pair[0];
+        if (pair[1] !== obj[key] || !(key in obj)) return false;
+      }
+      return true;
+    };
+  };
+
+  // Run a function **n** times.
+  _.times = function(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = createCallback(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  };
+
+  // Return a random integer between min and max (inclusive).
+  _.random = function(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  };
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  _.now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+   // List of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&',
+    '<': '<',
+    '>': '>',
+    '"': '"',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+  var unescapeMap = _.invert(escapeMap);
+
+  // Functions for escaping and unescaping strings to/from HTML interpolation.
+  var createEscaper = function(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped
+    var source = '(?:' + _.keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  };
+  _.escape = createEscaper(escapeMap);
+  _.unescape = createEscaper(unescapeMap);
+
+  // If the value of the named `property` is a function then invoke it with the
+  // `object` as context; otherwise, return it.
+  _.result = function(object, property) {
+    if (object == null) return void 0;
+    var value = object[property];
+    return _.isFunction(value) ? object[property]() : value;
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g,
+    escape      : /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'":      "'",
+    '\\':     '\\',
+    '\r':     'r',
+    '\n':     'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  var escapeChar = function(match) {
+    return '\\' + escapes[match];
+  };
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  _.template = function(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = _.defaults({}, settings, _.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escaper, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offest.
+      return match;
+    });
+    source += "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    try {
+      var render = new Function(settings.variable || 'obj', '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    var argument = settings.variable || 'obj';
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  };
+
+  // Add a "chain" function. Start chaining a wrapped Underscore object.
+  _.chain = function(obj) {
+    var instance = _(obj);
+    instance._chain = true;
+    return instance;
+  };
+
+  // OOP
+  // ---------------
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(obj) {
+    return this._chain ? _(obj).chain() : obj;
+  };
+
+  // Add your own custom functions to the Underscore object.
+  _.mixin = function(obj) {
+    _.each(_.functions(obj), function(name) {
+      var func = _[name] = obj[name];
+      _.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return result.call(this, func.apply(_, args));
+      };
+    });
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      method.apply(obj, arguments);
+      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
+      return result.call(this, obj);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  _.each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      return result.call(this, method.apply(this._wrapped, arguments));
+    };
+  });
+
+  // Extracts the result from a wrapped and chained object.
+  _.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // AMD registration happens at the end for compatibility with AMD loaders
+  // that may not enforce next-turn semantics on modules. Even though general
+  // practice for AMD registration is to be anonymous, underscore registers
+  // as a named module because, like jQuery, it is a base library that is
+  // popular enough to be bundled in a third party lib, but not be part of
+  // an AMD load request. Those cases could generate an error when an
+  // anonymous define() is called outside of a loader request.
+  if (typeof define === 'function' && define.amd) {
+    define('underscore', [], function() {
+      return _;
+    });
+  }
+}.call(this));
diff --git a/documentation/_static/up-pressed.png b/documentation/_static/up-pressed.png
index 8bd587a..99e7210 100644
Binary files a/documentation/_static/up-pressed.png and b/documentation/_static/up-pressed.png differ
diff --git a/documentation/_static/up.png b/documentation/_static/up.png
index b946256..26de002 100644
Binary files a/documentation/_static/up.png and b/documentation/_static/up.png differ
diff --git a/documentation/_static/websupport.js b/documentation/_static/websupport.js
index 19fcda5..ffd9b2b 100644
--- a/documentation/_static/websupport.js
+++ b/documentation/_static/websupport.js
@@ -4,7 +4,7 @@
  *
  * sphinx.websupport utilties for all documentation.
  *
- * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -50,51 +50,51 @@
   }
 
   function initEvents() {
-    $('a.comment-close').live("click", function(event) {
+    $(document).on("click", 'a.comment-close', function(event) {
       event.preventDefault();
       hide($(this).attr('id').substring(2));
     });
-    $('a.vote').live("click", function(event) {
+    $(document).on("click", 'a.vote', function(event) {
       event.preventDefault();
       handleVote($(this));
     });
-    $('a.reply').live("click", function(event) {
+    $(document).on("click", 'a.reply', function(event) {
       event.preventDefault();
       openReply($(this).attr('id').substring(2));
     });
-    $('a.close-reply').live("click", function(event) {
+    $(document).on("click", 'a.close-reply', function(event) {
       event.preventDefault();
       closeReply($(this).attr('id').substring(2));
     });
-    $('a.sort-option').live("click", function(event) {
+    $(document).on("click", 'a.sort-option', function(event) {
       event.preventDefault();
       handleReSort($(this));
     });
-    $('a.show-proposal').live("click", function(event) {
+    $(document).on("click", 'a.show-proposal', function(event) {
       event.preventDefault();
       showProposal($(this).attr('id').substring(2));
     });
-    $('a.hide-proposal').live("click", function(event) {
+    $(document).on("click", 'a.hide-proposal', function(event) {
       event.preventDefault();
       hideProposal($(this).attr('id').substring(2));
     });
-    $('a.show-propose-change').live("click", function(event) {
+    $(document).on("click", 'a.show-propose-change', function(event) {
       event.preventDefault();
       showProposeChange($(this).attr('id').substring(2));
     });
-    $('a.hide-propose-change').live("click", function(event) {
+    $(document).on("click", 'a.hide-propose-change', function(event) {
       event.preventDefault();
       hideProposeChange($(this).attr('id').substring(2));
     });
-    $('a.accept-comment').live("click", function(event) {
+    $(document).on("click", 'a.accept-comment', function(event) {
       event.preventDefault();
       acceptComment($(this).attr('id').substring(2));
     });
-    $('a.delete-comment').live("click", function(event) {
+    $(document).on("click", 'a.delete-comment', function(event) {
       event.preventDefault();
       deleteComment($(this).attr('id').substring(2));
     });
-    $('a.comment-markup').live("click", function(event) {
+    $(document).on("click", 'a.comment-markup', function(event) {
       event.preventDefault();
       toggleCommentMarkupBox($(this).attr('id').substring(2));
     });
@@ -700,8 +700,8 @@
         (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
       <div class="comment-markup-box" id="mb<%id%>">\
         reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
-        <tt>``code``</tt>, \
-        code blocks: <tt>::</tt> and an indented block after blank line</div>\
+        <code>``code``</code>, \
+        code blocks: <code>::</code> and an indented block after blank line</div>\
       <form method="post" id="cf<%id%>" class="comment-form" action="">\
         <textarea name="comment" cols="80"></textarea>\
         <p class="propose-button">\
diff --git a/documentation/advanced_topics.html b/documentation/advanced_topics.html
index 2025379..e4296cc 100644
--- a/documentation/advanced_topics.html
+++ b/documentation/advanced_topics.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Advanced Topics — XMDS2 2.2.2 documentation</title>
+    <title>Advanced Topics — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Frequently Asked Questions" href="faq.html" />
     <link rel="prev" title="Modified Midpoint Method" href="bulirschStoer.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,21 +42,21 @@
         <li class="right" >
           <a href="bulirschStoer.html" title="Modified Midpoint Method"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="advanced-topics">
 <span id="advancedtopics"></span><span id="index-0"></span><h1>Advanced Topics<a class="headerlink" href="#advanced-topics" title="Permalink to this headline">¶</a></h1>
 <p>This section has further details on some important topics.</p>
-<p><a class="reference internal" href="#importing"><em>Importing data</em></a> (importing data into XMDS2, and data formats used in the export)</p>
-<p><a class="reference internal" href="#convolutions"><em>Convolutions and Fourier transforms</em></a> (extra information on the Fourier transforms used in XMDS2, how this applies to convolutions)</p>
-<p><a class="reference internal" href="#dimensionaliases"><em>Dimension aliases</em></a> (dimensions which are declared to be identical, useful for correlation functions)</p>
+<p><a class="reference internal" href="#importing"><span>Importing data</span></a> (importing data into XMDS2, and data formats used in the export)</p>
+<p><a class="reference internal" href="#convolutions"><span>Convolutions and Fourier transforms</span></a> (extra information on the Fourier transforms used in XMDS2, how this applies to convolutions)</p>
+<p><a class="reference internal" href="#dimensionaliases"><span>Dimension aliases</span></a> (dimensions which are declared to be identical, useful for correlation functions)</p>
 <div class="section" id="importing-data">
 <span id="importing"></span><span id="index-1"></span><h2>Importing data<a class="headerlink" href="#importing-data" title="Permalink to this headline">¶</a></h2>
 <p>There are many cases where it is advantageous to import previously acquired data into XMDS2. For example, the differential equation you wish to solve may depend on a complicated functional form, which is more easily obtained via an analytical package such as Mathematica or Maple. Furthermore, importing data from another source can be quicker than needlessly performing calculations in XMDS2. In this tutorial, we shall consider an example of importing into XMDS2 a function generated in  [...]
@@ -133,7 +133,7 @@
 Export["func.h5", {func, x1}, {"Datasets", { "function_x", "x"}}]
 </pre></div>
 </div>
-<p>In the directory containing the notebook “grid.nb” you should now see the file “func.h5”. This file essentially contains the list <tt class="docutils literal"><span class="pre">{func,</span> <span class="pre">x1}</span></tt>. However, the hdf5 format stores func and x1 as separate entities called “Datasets”. For importation into XMDS2 it is necessary that these datasets are named. This is precisely what the segment <tt class="docutils literal"><span [...]
+<p>In the directory containing the notebook “grid.nb” you should now see the file “func.h5”. This file essentially contains the list <code class="docutils literal"><span class="pre">{func,</span> <span class="pre">x1}</span></code>. However, the hdf5 format stores func and x1 as separate entities called “Datasets”. For importation into XMDS2 it is necessary that these datasets are named. This is precisely what the segment <code class="docutils literal" [...]
 <p>The final step is to import the file “func.h5” into your primary XMDS2 file. This data will be stored as a vector called “gen_function_x”, in component “function_x”.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><vector</span> <span class="na">type=</span><span class="s">"real"</span> <span class="na">name=</span><span class="s">"gen_function_x"</span> <span class="na">dimensions=</span><span class="s">"x"</span><span class="nt">></span>
   <span class="nt"><components></span>function_x<span class="nt"></components></span>
@@ -207,13 +207,13 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
 </div>
 </div>
 <div class="section" id="loose-geometry-matching-mode">
-<span id="loosegeometrymatchingmode"></span><span id="index-3"></span><h2>‘Loose’ <tt class="docutils literal"><span class="pre">geometry_matching_mode</span></tt><a class="headerlink" href="#loose-geometry-matching-mode" title="Permalink to this headline">¶</a></h2>
+<span id="loosegeometrymatchingmode"></span><span id="index-3"></span><h2>‘Loose’ <code class="docutils literal"><span class="pre">geometry_matching_mode</span></code><a class="headerlink" href="#loose-geometry-matching-mode" title="Permalink to this headline">¶</a></h2>
 </div>
 <div class="section" id="dimension-aliases">
 <span id="dimensionaliases"></span><span id="index-4"></span><h2>Dimension aliases<a class="headerlink" href="#dimension-aliases" title="Permalink to this headline">¶</a></h2>
-<p>Dimension aliases specify that two or more dimensions have exactly the same <tt class="docutils literal"><span class="pre">lattice</span></tt>, <tt class="docutils literal"><span class="pre">domain</span></tt> and <tt class="docutils literal"><span class="pre">transform</span></tt>.  This can be useful in situations where the problem enforces this, for example when computing correlation functions or representing square matrices.</p>
-<p>Dimension aliases are not just a short-hand for defining an additional dimension, they also permit dimensions to be accessed <a class="reference internal" href="reference_elements.html#referencingnonlocal"><em>non-locally</em></a>, which is essential when computing spatial correlation functions.</p>
-<p>Here is how to compute a spatial correlation function <span class="math">\(g^{(1)}(x, x') = \psi^*(x) \psi(x')\)</span> of the quantity <tt class="docutils literal"><span class="pre">psi</span></tt>:</p>
+<p>Dimension aliases specify that two or more dimensions have exactly the same <code class="docutils literal"><span class="pre">lattice</span></code>, <code class="docutils literal"><span class="pre">domain</span></code> and <code class="docutils literal"><span class="pre">transform</span></code>.  This can be useful in situations where the problem enforces this, for example when computing correlation functions or representing square matrices.</p>
+<p>Dimension aliases are not just a short-hand for defining an additional dimension, they also permit dimensions to be accessed <a class="reference internal" href="reference_elements.html#referencingnonlocal"><span>non-locally</span></a>, which is essential when computing spatial correlation functions.</p>
+<p>Here is how to compute a spatial correlation function <span class="math">\(g^{(1)}(x, x') = \psi^*(x) \psi(x')\)</span> of the quantity <code class="docutils literal"><span class="pre">psi</span></code>:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
 
   <span class="c"><!-- name, features block --></span>
@@ -247,8 +247,8 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>In this simulation note that the vector <tt class="docutils literal"><span class="pre">wavefunction</span></tt> defaults to only having the dimension “x” even though “xp” is also a dimension (implicitly declared through the <tt class="docutils literal"><span class="pre">aliases</span></tt> attribute).  <tt class="docutils literal"><span class="pre">vector</span></tt>‘s without an explicit <tt class="docutils literal"><span class="pre">dimensions</span></t [...]
-<p>See the example <tt class="docutils literal"><span class="pre">groundstate_gaussian.xmds</span></tt> for a complete example.</p>
+<p>In this simulation note that the vector <code class="docutils literal"><span class="pre">wavefunction</span></code> defaults to only having the dimension “x” even though “xp” is also a dimension (implicitly declared through the <code class="docutils literal"><span class="pre">aliases</span></code> attribute).  <code class="docutils literal"><span class="pre">vector</span></code>‘s without an explicit <code class="docutils literal"><span class="pre">dimens [...]
+<p>See the example <code class="docutils literal"><span class="pre">groundstate_gaussian.xmds</span></code> for a complete example.</p>
 </div>
 </div>
 
@@ -256,7 +256,7 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -271,13 +271,13 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
 <li><a class="reference internal" href="#example-3">Example 3</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#loose-geometry-matching-mode">‘Loose’ <tt class="docutils literal"><span class="pre">geometry_matching_mode</span></tt></a></li>
+<li><a class="reference internal" href="#loose-geometry-matching-mode">‘Loose’ <code class="docutils literal"><span class="pre">geometry_matching_mode</span></code></a></li>
 <li><a class="reference internal" href="#dimension-aliases">Dimension aliases</a></li>
 </ul>
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -294,7 +294,7 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -306,13 +306,13 @@ Export["func.h5", {func, x1, y1}, {"Datasets", { "funct
         <li class="right" >
           <a href="bulirschStoer.html" title="Modified Midpoint Method"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/bulirschStoer.html b/documentation/bulirschStoer.html
index b6adf8e..9b8827f 100644
--- a/documentation/bulirschStoer.html
+++ b/documentation/bulirschStoer.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Modified Midpoint Method — XMDS2 2.2.2 documentation</title>
+    <title>Modified Midpoint Method — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,13 +25,13 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="up" title="Reference section" href="reference_index.html" />
     <link rel="next" title="Advanced Topics" href="advanced_topics.html" />
     <link rel="prev" title="XMDS2 script elements" href="reference_elements.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -43,15 +43,15 @@
         <li class="right" >
           <a href="reference_elements.html" title="XMDS2 script elements"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="modified-midpoint-method">
 <span id="mmdetail"></span><span id="index-0"></span><h1>Modified Midpoint Method<a class="headerlink" href="#modified-midpoint-method" title="Permalink to this headline">¶</a></h1>
@@ -91,7 +91,7 @@ y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \ri
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -103,7 +103,7 @@ y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \ri
 <li><a class="reference internal" href="#error-scaling-behaviour">Error Scaling Behaviour</a></li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -120,7 +120,7 @@ y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \ri
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -132,14 +132,14 @@ y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \ri
         <li class="right" >
           <a href="reference_elements.html" title="XMDS2 script elements"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" >Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" >Reference section</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/developer.html b/documentation/developer.html
index 4ca72f8..60ed961 100644
--- a/documentation/developer.html
+++ b/documentation/developer.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Developer Documentation — XMDS2 2.2.2 documentation</title>
+    <title>Developer Documentation — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Licensing" href="licensing.html" />
     <link rel="prev" title="xsil2graphics2" href="xsil2graphics2.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="xsil2graphics2.html" title="xsil2graphics2"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="developer-documentation">
 <span id="developerdocumentation"></span><h1>Developer Documentation<a class="headerlink" href="#developer-documentation" title="Permalink to this headline">¶</a></h1>
@@ -59,28 +59,28 @@
 <p>Every time you add a new feature and/or fix a new and exciting bug, it is a great idea to make sure that the new feature works and/or the bug stays fixed.  Fortunately, it is pleasantly easy to add a test case to the testing suite.</p>
 <ol class="arabic simple">
 <li>Write normal XMDS script that behaves as you expect.</li>
-<li>Add a <tt class="docutils literal"><span class="pre"><testing></span></tt> element to your script.  You can read the description of this element and its contents below, and have a look at other testcases for examples, but the basic structure is simple:.</li>
+<li>Add a <code class="docutils literal"><span class="pre"><testing></span></code> element to your script.  You can read the description of this element and its contents below, and have a look at other testcases for examples, but the basic structure is simple:.</li>
 </ol>
 <pre class="literal-block">
-<<a class="reference internal" href="#testingelement"><em>testing</em></a>>
-  <<a class="reference internal" href="#commandlineelement"><em>command_line</em></a>> <<a class="reference internal" href="#commandlineelement"><em>/command_line</em></a>>
-  <<a class="reference internal" href="reference_elements.html#argumentselement"><em>arguments</em></a>>
-    <<a class="reference internal" href="reference_elements.html#argumentelement"><em>argument</em></a> />
-    <<a class="reference internal" href="reference_elements.html#argumentelement"><em>argument</em></a> />
+<<a class="reference internal" href="#testingelement"><span>testing</span></a>>
+  <<a class="reference internal" href="#commandlineelement"><span>command_line</span></a>> <<a class="reference internal" href="#commandlineelement"><span>/command_line</span></a>>
+  <<a class="reference internal" href="reference_elements.html#argumentselement"><span>arguments</span></a>>
+    <<a class="reference internal" href="reference_elements.html#argumentelement"><span>argument</span></a> />
+    <<a class="reference internal" href="reference_elements.html#argumentelement"><span>argument</span></a> />
     ...
-  <<a class="reference internal" href="reference_elements.html#argumentselement"><em>/arguments</em></a>>
-  <<a class="reference internal" href="#inputxsilfileelement"><em>input_xsil_file</em></a> />
-  <<a class="reference internal" href="#xsilfileelement"><em>xsil_file</em></a>>
-    <<a class="reference internal" href="#momentgroupelement"><em>moment_group</em></a> />
-    <<a class="reference internal" href="#momentgroupelement"><em>moment_group</em></a> />
+  <<a class="reference internal" href="reference_elements.html#argumentselement"><span>/arguments</span></a>>
+  <<a class="reference internal" href="#inputxsilfileelement"><span>input_xsil_file</span></a> />
+  <<a class="reference internal" href="#xsilfileelement"><span>xsil_file</span></a>>
+    <<a class="reference internal" href="#momentgroupelement"><span>moment_group</span></a> />
+    <<a class="reference internal" href="#momentgroupelement"><span>moment_group</span></a> />
     ...
-  <<a class="reference internal" href="#xsilfileelement"><em>/xsil_file</em></a>>
-<<a class="reference internal" href="#testingelement"><em>/testing</em></a>>
+  <<a class="reference internal" href="#xsilfileelement"><span>/xsil_file</span></a>>
+<<a class="reference internal" href="#testingelement"><span>/testing</span></a>>
 </pre>
 <ol class="arabic simple" start="3">
-<li>Put into the appropriate <tt class="docutils literal"><span class="pre">testsuite/</span></tt> directory.</li>
-<li>run <tt class="docutils literal"><span class="pre">./run_tests.py</span></tt> This will automatically generate your <tt class="docutils literal"><span class="pre">_expected</span></tt> files.</li>
-<li>Commit the <tt class="docutils literal"><span class="pre">.xmds</span></tt>, <tt class="docutils literal"><span class="pre">*_expected.xsil</span></tt> file and any <tt class="docutils literal"><span class="pre">*_expected*</span></tt> data files.</li>
+<li>Put into the appropriate <code class="docutils literal"><span class="pre">testsuite/</span></code> directory.</li>
+<li>run <code class="docutils literal"><span class="pre">./run_tests.py</span></code> This will automatically generate your <code class="docutils literal"><span class="pre">_expected</span></code> files.</li>
+<li>Commit the <code class="docutils literal"><span class="pre">.xmds</span></code>, <code class="docutils literal"><span class="pre">*_expected.xsil</span></code> file and any <code class="docutils literal"><span class="pre">*_expected*</span></code> data files.</li>
 </ol>
 <div class="section" id="testing-element">
 <span id="testingelement"></span><h3>Testing element<a class="headerlink" href="#testing-element" title="Permalink to this headline">¶</a></h3>
@@ -101,19 +101,19 @@
 <div class="section" id="xmds-documentation">
 <span id="userdocumentation"></span><span id="index-1"></span><h2>XMDS Documentation<a class="headerlink" href="#xmds-documentation" title="Permalink to this headline">¶</a></h2>
 <p>Documentation in XMDS is written as reStructuredText files (.rst), which are then parsed into HTML files to be displayed on their website.</p>
-<p>You can find the user documentation folder located <tt class="docutils literal"><span class="pre">admin/userdoc-source</span></tt>. This is where all of the .rst files are kept. If you’re wanting to add documentation to the site, you’ll need to create your own .rst file, with the name of the webpage as the filename.</p>
+<p>You can find the user documentation folder located <code class="docutils literal"><span class="pre">admin/userdoc-source</span></code>. This is where all of the .rst files are kept. If you’re wanting to add documentation to the site, you’ll need to create your own .rst file, with the name of the webpage as the filename.</p>
 <p>RST is a relatively simple language, which is basically simplified HTML markup. For documentation on how to make Lists, Href Links, Embed images etc, you should check here;</p>
 <p><a class="reference external" href="http://docutils.sourceforge.net/docs/user/rst/quickref.html">http://docutils.sourceforge.net/docs/user/rst/quickref.html</a>
 <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html">http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html</a></p>
 <p>However, you should easily be able to use some of the pre-existing .rst files in the project as a template to create yours.</p>
 <p>Once your documentation is in this folder, it should be deployed along with the project to their website when you run create_release_version.sh, which can be found in the /Trunk/xpdeint/admin folder. If you would like to test to see what your rst file generates without running this shell script, you can use the Makefile in the userdoc-source folder, by running “make html”.</p>
-<p>NOTE: Before you can run the create_release_version.sh file, there are a few packages you will need. This command uses latex to generate the XMDS2 pdf, so you’ll be needing the following packages; <tt class="docutils literal"><span class="pre">texlive-fonts-recommended</span></tt>, <tt class="docutils literal"><span class="pre">texlive-lang-cjk</span></tt>, <tt class="docutils literal"><span class="pre">texlive-latex-base</span></tt>.</p>
+<p>NOTE: Before you can run the create_release_version.sh file, there are a few packages you will need. This command uses latex to generate the XMDS2 pdf, so you’ll be needing the following packages; <code class="docutils literal"><span class="pre">texlive-fonts-recommended</span></code>, <code class="docutils literal"><span class="pre">texlive-lang-cjk</span></code>, <code class="docutils literal"><span class="pre">texlive-latex-base</span></code>.</p>
 </div>
 <div class="section" id="how-to-update-xmds2-script-validator-xml-schema">
-<span id="howtoaddelementtovalidator"></span><span id="index-2"></span><h2>How to update <tt class="docutils literal"><span class="pre">XMDS2</span></tt> script validator (XML schema)<a class="headerlink" href="#how-to-update-xmds2-script-validator-xml-schema" title="Permalink to this headline">¶</a></h2>
+<span id="howtoaddelementtovalidator"></span><span id="index-2"></span><h2>How to update <code class="docutils literal"><span class="pre">XMDS2</span></code> script validator (XML schema)<a class="headerlink" href="#how-to-update-xmds2-script-validator-xml-schema" title="Permalink to this headline">¶</a></h2>
 <img alt="_images/IntroduceNewElement.png" class="align-right" src="_images/IntroduceNewElement.png" />
 <p>This is a short guide to adding an element to XMDS2, so that it can be validated by the XMDS2 script validator. In this guide, the example being used will be the addition of a matrix element to the validator.  The matrix will have a  ‘name’ and a ‘type’ (so it can be called later, and the type is known for future reference). Each matrix will also need a ‘row’ component, and possibly an initialisation value.</p>
-<p>Navigate to <tt class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rnc</span></tt>. This is a RelaxNG compact file, which specifies the XML schema which is only used for issuing warnings to users about missing or extraneous XML tags / attributes. Add the following lines to the end of the file (so that it is outside all other brackets in the file):</p>
+<p>Navigate to <code class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rnc</span></code>. This is a RelaxNG compact file, which specifies the XML schema which is only used for issuing warnings to users about missing or extraneous XML tags / attributes. Add the following lines to the end of the file (so that it is outside all other brackets in the file):</p>
 <div class="highlight-none"><div class="highlight"><pre>Matrix = element matrix {
     attribute name { text }
     , attribute type { text }?
@@ -124,18 +124,18 @@
 }
 </pre></div>
 </div>
-<p>Save this file, and then in the terminal navigate to the folder <tt class="docutils literal"><span class="pre">xpdeint/support/</span></tt> and run <tt class="docutils literal"><span class="pre">make</span></tt>. This updates the XML based file <tt class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rng</span></tt>, which is the file the parser uses to validate elements in XMDS2. This file which is  used is in RelaxNG format, but RelaxNG compact is easier to read and edit.</p>
-<p>Commit both <tt class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rnc</span></tt> and <tt class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rng</span></tt> to the code repository.</p>
+<p>Save this file, and then in the terminal navigate to the folder <code class="docutils literal"><span class="pre">xpdeint/support/</span></code> and run <code class="docutils literal"><span class="pre">make</span></code>. This updates the XML based file <code class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rng</span></code>, which is the file the parser uses to validate elements in XMDS2. This file which is  used is in RelaxNG format, but RelaxNG compact is easier to [...]
+<p>Commit both <code class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rnc</span></code> and <code class="docutils literal"><span class="pre">xpdeint/support/xpdeint.rng</span></code> to the code repository.</p>
 </div>
 <div class="section" id="how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment">
 <span id="howtoaddintegrator"></span><span id="index-3"></span><h2>How to introduce a new integrator Stepper into the XMDS2 environment<a class="headerlink" href="#how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment" title="Permalink to this headline">¶</a></h2>
 <img alt="_images/IntroduceNewIntegrationTechnique.png" class="align-right" src="_images/IntroduceNewIntegrationTechnique.png" />
 <p>This is a short guide to adding a new stepper containing a new mathematical technique to XMDS2, which can then be used by to integrate equations. This guide describes the logistics of introducing a new stepper and as such, the code inside the stepper template is outside the scope of this document. The new stepper which will be used in this guide will be called ‘IntegrateMethodStepper’.</p>
-<p>Navigate to the <tt class="docutils literal"><span class="pre">xpdeint/Segments/Integrators</span></tt> directory. Create a file called <tt class="docutils literal"><span class="pre">IntegrateMethodStepper.tmpl</span></tt> in this directory. In this file, implement the new integration algorithm (follow the convention of existing steppers in that folder). In this same folder, open the file named <tt class="docutils literal"><span class="pre">__init__.py</span></tt> and add the followin [...]
+<p>Navigate to the <code class="docutils literal"><span class="pre">xpdeint/Segments/Integrators</span></code> directory. Create a file called <code class="docutils literal"><span class="pre">IntegrateMethodStepper.tmpl</span></code> in this directory. In this file, implement the new integration algorithm (follow the convention of existing steppers in that folder). In this same folder, open the file named <code class="docutils literal"><span class="pre">__init__.py</span></code> and add  [...]
 <div class="highlight-none"><div class="highlight"><pre>import IntegrateMethodStepper
 </pre></div>
 </div>
-<p>Navigate up until you are in the <tt class="docutils literal"><span class="pre">xpdeint</span></tt> directory. Open the file <tt class="docutils literal"><span class="pre">XMDS2Parser.py</span></tt>, and ‘find’ the algorithm map (Ctrl+F > algorithmMap works for most text editors). The mnemonic ‘IM’ will be used for our Stepper. If the stepper uses fixed step sizes, then add the following line to the algorithm map:</p>
+<p>Navigate up until you are in the <code class="docutils literal"><span class="pre">xpdeint</span></code> directory. Open the file <code class="docutils literal"><span class="pre">XMDS2Parser.py</span></code>, and ‘find’ the algorithm map (Ctrl+F > algorithmMap works for most text editors). The mnemonic ‘IM’ will be used for our Stepper. If the stepper uses fixed step sizes, then add the following line to the algorithm map:</p>
 <div class="highlight-none"><div class="highlight"><pre>'IM':   (Integrators.FixedStep.FixedStep, Integrators.IntegrateMethodStepper.IntegrateMethodStepper),
 </pre></div>
 </div>
@@ -143,7 +143,7 @@
 <div class="highlight-none"><div class="highlight"><pre>'IM':   (Integrators.AdaptiveStep.AdaptiveStep, Integrators.IntegrateMethodStepper.IntegrateMethodStepper),
 </pre></div>
 </div>
-<p>In the terminal, navigate to the <tt class="docutils literal"><span class="pre">xpdeint</span></tt> directory, and run make over the entire directory. ‘IM’ can now be used to specify the new Stepper as your integration algorithm inside your .xmds files, e.g.</p>
+<p>In the terminal, navigate to the <code class="docutils literal"><span class="pre">xpdeint</span></code> directory, and run make over the entire directory. ‘IM’ can now be used to specify the new Stepper as your integration algorithm inside your .xmds files, e.g.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"IM"</span> <span class="na">interval=</span><span class="s">"5.0"</span> <span class="na">steps=</span><span class="s">"2000"</span><span class="nt">></span>
     ...
 <span class="nt"></integrate></span>
@@ -184,71 +184,71 @@
 <span id="index-5"></span><h2>Directory layout<a class="headerlink" href="#directory-layout" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="xmds2-s-code-and-templates">
 <h3>XMDS2’s code and templates<a class="headerlink" href="#xmds2-s-code-and-templates" title="Permalink to this headline">¶</a></h3>
-<p>All <tt class="docutils literal"><span class="pre">.tmpl</span></tt> files are Cheetah template files.  These are used to generate C++ code.  These templates are compiled as part of the XMDS2 build process to <tt class="docutils literal"><span class="pre">.py</span></tt> files of the same name.  Do not edit the generated <tt class="docutils literal"><span class="pre">.py</span></tt> files, always edit the <tt class="docutils literal"><span class="pre">.tmpl</span></tt> files and regen [...]
+<p>All <code class="docutils literal"><span class="pre">.tmpl</span></code> files are Cheetah template files.  These are used to generate C++ code.  These templates are compiled as part of the XMDS2 build process to <code class="docutils literal"><span class="pre">.py</span></code> files of the same name.  Do not edit the generated <code class="docutils literal"><span class="pre">.py</span></code> files, always edit the <code class="docutils literal"><span class="pre">.tmpl</span></code> [...]
 <ul>
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">xpdeint/</span></tt>:</dt>
+<dt><code class="docutils literal"><span class="pre">xpdeint/</span></code>:</dt>
 <dd><ul class="first last">
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">Features/</span></tt>: Code for all <tt class="docutils literal"><span class="pre"><feature></span></tt> elements, such as <tt class="docutils literal"><span class="pre"><globals></span></tt> and <tt class="docutils literal"><span class="pre"><auto_vectorise></span></tt></dt>
+<dt><code class="docutils literal"><span class="pre">Features/</span></code>: Code for all <code class="docutils literal"><span class="pre"><feature></span></code> elements, such as <code class="docutils literal"><span class="pre"><globals></span></code> and <code class="docutils literal"><span class="pre"><auto_vectorise></span></code></dt>
 <dd><ul class="first last simple">
-<li><tt class="docutils literal"><span class="pre">Transforms/</span></tt>: Code for the Fourier and matrix-based transforms (including MPI variants).</li>
+<li><code class="docutils literal"><span class="pre">Transforms/</span></code>: Code for the Fourier and matrix-based transforms (including MPI variants).</li>
 </ul>
 </dd>
 </dl>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">Geometry/</span></tt>: Code for describing the geometry of simulation dimensions and domains.  Includes code for <tt class="docutils literal"><span class="pre">Geometry</span></tt>, <tt class="docutils literal"><span class="pre">Field</span></tt> and all <tt class="docutils literal"><span class="pre">DimensionRepresentations</span></tt>.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">Geometry/</span></code>: Code for describing the geometry of simulation dimensions and domains.  Includes code for <code class="docutils literal"><span class="pre">Geometry</span></code>, <code class="docutils literal"><span class="pre">Field</span></code> and all <code class="docutils literal"><span class="pre">DimensionRepresentations</span></code>.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">Operators/</span></tt>: Code for all <tt class="docutils literal"><span class="pre"><operator></span></tt> elements, including <tt class="docutils literal"><span class="pre">IP</span></tt>, <tt class="docutils literal"><span class="pre">EX</span></tt> and the temporal derivative operator <tt class="docutils literal"><span class="pre">DeltaA</span></tt>.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">Operators/</span></code>: Code for all <code class="docutils literal"><span class="pre"><operator></span></code> elements, including <code class="docutils literal"><span class="pre">IP</span></code>, <code class="docutils literal"><span class="pre">EX</span></code> and the temporal derivative operator <code class="docutils literal"><span class="pre">DeltaA</span></code>.</p>
 </li>
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">Segments/</span></tt>: Code for all elements that can appear in a <tt class="docutils literal"><span class="pre"><segments></span></tt> tag.  This includes <tt class="docutils literal"><span class="pre"><integrate></span></tt>, <tt class="docutils literal"><span class="pre"><filter></span></tt>, and <tt class="docutils literal"><span class="pre"><breakpoint></span></tt>.</dt>
+<dt><code class="docutils literal"><span class="pre">Segments/</span></code>: Code for all elements that can appear in a <code class="docutils literal"><span class="pre"><segments></span></code> tag.  This includes <code class="docutils literal"><span class="pre"><integrate></span></code>, <code class="docutils literal"><span class="pre"><filter></span></code>, and <code class="docutils literal"><span class="pre"><breakpoint></span></code>.</dt>
 <dd><ul class="first last simple">
-<li><tt class="docutils literal"><span class="pre">Integrators</span></tt>: Code for fixed and adaptive integration schemes, and all steppers (e.g. <tt class="docutils literal"><span class="pre">RK4</span></tt>, <tt class="docutils literal"><span class="pre">RK45</span></tt>, <tt class="docutils literal"><span class="pre">RK9</span></tt>, etc.)</li>
+<li><code class="docutils literal"><span class="pre">Integrators</span></code>: Code for fixed and adaptive integration schemes, and all steppers (e.g. <code class="docutils literal"><span class="pre">RK4</span></code>, <code class="docutils literal"><span class="pre">RK45</span></code>, <code class="docutils literal"><span class="pre">RK9</span></code>, etc.)</li>
 </ul>
 </dd>
 </dl>
 </li>
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">Stochastic/</span></tt>: Code for all random number generators and the random variables derived from them.</dt>
+<dt><code class="docutils literal"><span class="pre">Stochastic/</span></code>: Code for all random number generators and the random variables derived from them.</dt>
 <dd><ul class="first last simple">
-<li><tt class="docutils literal"><span class="pre">Generators/</span></tt>: Code for random number generators, includes <tt class="docutils literal"><span class="pre">dSFMT</span></tt>, <tt class="docutils literal"><span class="pre">POSIX</span></tt>, <tt class="docutils literal"><span class="pre">Solirte</span></tt>.</li>
-<li><tt class="docutils literal"><span class="pre">RandomVariables/</span></tt>: Code for the random variables derived from the random number generators.  These are the gaussian, poissonian and uniform random variables.</li>
+<li><code class="docutils literal"><span class="pre">Generators/</span></code>: Code for random number generators, includes <code class="docutils literal"><span class="pre">dSFMT</span></code>, <code class="docutils literal"><span class="pre">POSIX</span></code>, <code class="docutils literal"><span class="pre">Solirte</span></code>.</li>
+<li><code class="docutils literal"><span class="pre">RandomVariables/</span></code>: Code for the random variables derived from the random number generators.  These are the gaussian, poissonian and uniform random variables.</li>
 </ul>
 </dd>
 </dl>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">SimulationDrivers/</span></tt>: Code for all <tt class="docutils literal"><span class="pre"><driver></span></tt> elements.  In particular, this is where the location of MPI and multi-path code.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">SimulationDrivers/</span></code>: Code for all <code class="docutils literal"><span class="pre"><driver></span></code> elements.  In particular, this is where the location of MPI and multi-path code.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">Vectors/</span></tt>: Code for all <tt class="docutils literal"><span class="pre"><vector></span></tt> elements, and their initialisation.  This includes normal <tt class="docutils literal"><span class="pre"><vector></span></tt> elements as well as <tt class="docutils literal"><span class="pre"><computed_vector></span></tt> and <tt class="docutils literal"><span class="pre"><noise_vector></span></ [...]
+<li><p class="first"><code class="docutils literal"><span class="pre">Vectors/</span></code>: Code for all <code class="docutils literal"><span class="pre"><vector></span></code> elements, and their initialisation.  This includes normal <code class="docutils literal"><span class="pre"><vector></span></code> elements as well as <code class="docutils literal"><span class="pre"><computed_vector></span></code> and <code class="docutils literal"><span class="pre"><noise_v [...]
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">includes/</span></tt>: C++ header and sources files used by the generated simulations.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">includes/</span></code>: C++ header and sources files used by the generated simulations.</p>
 </li>
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">support/</span></tt>: Support files</dt>
+<dt><code class="docutils literal"><span class="pre">support/</span></code>: Support files</dt>
 <dd><ul class="first last simple">
-<li><tt class="docutils literal"><span class="pre">wscript</span></tt>: <tt class="docutils literal"><span class="pre">waf</span></tt> build script for configuring and compiling generated simulations</li>
-<li><tt class="docutils literal"><span class="pre">xpdeint.rnc</span></tt>: Compact RelaxNG XML validation for XMDS scripts.  This is the source file for the XML RelaxNG file <tt class="docutils literal"><span class="pre">xpdeint.rng</span></tt></li>
-<li><tt class="docutils literal"><span class="pre">xpdeint.rng</span></tt>: RelaxNG XML validation for XMDS scripts.  To regenerate this file from <tt class="docutils literal"><span class="pre">xpdeint.rnc</span></tt>, just run <tt class="docutils literal"><span class="pre">make</span></tt> in this directory.</li>
+<li><code class="docutils literal"><span class="pre">wscript</span></code>: <code class="docutils literal"><span class="pre">waf</span></code> build script for configuring and compiling generated simulations</li>
+<li><code class="docutils literal"><span class="pre">xpdeint.rnc</span></code>: Compact RelaxNG XML validation for XMDS scripts.  This is the source file for the XML RelaxNG file <code class="docutils literal"><span class="pre">xpdeint.rng</span></code></li>
+<li><code class="docutils literal"><span class="pre">xpdeint.rng</span></code>: RelaxNG XML validation for XMDS scripts.  To regenerate this file from <code class="docutils literal"><span class="pre">xpdeint.rnc</span></code>, just run <code class="docutils literal"><span class="pre">make</span></code> in this directory.</li>
 </ul>
 </dd>
 </dl>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">waf/</span></tt>: Our included version of the Python configuration and build tool <tt class="docutils literal"><span class="pre">waf</span></tt>.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">waf/</span></code>: Our included version of the Python configuration and build tool <code class="docutils literal"><span class="pre">waf</span></code>.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">waf_extensions/</span></tt>: <tt class="docutils literal"><span class="pre">waf</span></tt> tool for compiling Cheetah templates.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">waf_extensions/</span></code>: <code class="docutils literal"><span class="pre">waf</span></code> tool for compiling Cheetah templates.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">xsil2graphics2/</span></tt>: Templates for the output formats supported by <tt class="docutils literal"><span class="pre">xsil2graphics2</span></tt>.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">xsil2graphics2/</span></code>: Templates for the output formats supported by <code class="docutils literal"><span class="pre">xsil2graphics2</span></code>.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">wscript</span></tt>: <tt class="docutils literal"><span class="pre">waf</span></tt> build script for XMDS2 itself.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">wscript</span></code>: <code class="docutils literal"><span class="pre">waf</span></code> build script for XMDS2 itself.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">CodeParser.py</span></tt>: Minimally parses included C++ code for handling nonlocal dimension access, IP/EX operators and IP operator validation.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">CodeParser.py</span></code>: Minimally parses included C++ code for handling nonlocal dimension access, IP/EX operators and IP operator validation.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">Configuration.py</span></tt>: Manages configuration and building of generated simulations.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">Configuration.py</span></code>: Manages configuration and building of generated simulations.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">FriendlyPlusStyle.py</span></tt>: Sphinx plug-in to improve formatting of XMDS scripts in user documentation.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">FriendlyPlusStyle.py</span></code>: Sphinx plug-in to improve formatting of XMDS scripts in user documentation.</p>
 </li>
-<li><p class="first">This directory also contains code for the input script parser, code blocks, code indentation, and the root <tt class="docutils literal"><span class="pre">_ScriptElement</span></tt> class.</p>
+<li><p class="first">This directory also contains code for the input script parser, code blocks, code indentation, and the root <code class="docutils literal"><span class="pre">_ScriptElement</span></code> class.</p>
 </li>
 </ul>
 </dd>
@@ -260,20 +260,20 @@
 <h3>Support files<a class="headerlink" href="#support-files" title="Permalink to this headline">¶</a></h3>
 <ul>
 <li><dl class="first docutils">
-<dt><tt class="docutils literal"><span class="pre">admin/</span></tt>: Documentation source, Linux installer and release scripts.</dt>
+<dt><code class="docutils literal"><span class="pre">admin/</span></code>: Documentation source, Linux installer and release scripts.</dt>
 <dd><ul class="first last simple">
-<li><tt class="docutils literal"><span class="pre">developer-doc-source/</span></tt>: source for epydoc python class documentation (generated from python code).</li>
-<li><tt class="docutils literal"><span class="pre">userdoc-source/</span></tt>: source for the user documentation (results visible at www.xmds.org and xmds2.readthedocs.org).</li>
-<li><tt class="docutils literal"><span class="pre">xpdeint.tmbundle/</span></tt>: TextMate support bundle for Cheetah templates and XMDS scripts</li>
+<li><code class="docutils literal"><span class="pre">developer-doc-source/</span></code>: source for epydoc python class documentation (generated from python code).</li>
+<li><code class="docutils literal"><span class="pre">userdoc-source/</span></code>: source for the user documentation (results visible at www.xmds.org and xmds2.readthedocs.org).</li>
+<li><code class="docutils literal"><span class="pre">xpdeint.tmbundle/</span></code>: TextMate support bundle for Cheetah templates and XMDS scripts</li>
 </ul>
 </dd>
 </dl>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">bin/</span></tt>: Executable scripts to be installed as part of XMDS2 (includes <tt class="docutils literal"><span class="pre">xmds2</span></tt> and <tt class="docutils literal"><span class="pre">xsil2graphics2</span></tt>).</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">bin/</span></code>: Executable scripts to be installed as part of XMDS2 (includes <code class="docutils literal"><span class="pre">xmds2</span></code> and <code class="docutils literal"><span class="pre">xsil2graphics2</span></code>).</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">examples/</span></tt>: Example XMDS2 input scripts demonstrating most of XMDS2’s features.</p>
+<li><p class="first"><code class="docutils literal"><span class="pre">examples/</span></code>: Example XMDS2 input scripts demonstrating most of XMDS2’s features.</p>
 </li>
-<li><p class="first"><tt class="docutils literal"><span class="pre">testsuite/</span></tt>: Testsuite of XMDS2 scripts.  Run the testsuite by executing <tt class="docutils literal"><span class="pre">./run_tests.py</span></tt></p>
+<li><p class="first"><code class="docutils literal"><span class="pre">testsuite/</span></code>: Testsuite of XMDS2 scripts.  Run the testsuite by executing <code class="docutils literal"><span class="pre">./run_tests.py</span></code></p>
 </li>
 </ul>
 </div>
@@ -284,7 +284,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -301,7 +301,7 @@
 </ul>
 </li>
 <li><a class="reference internal" href="#xmds-documentation">XMDS Documentation</a></li>
-<li><a class="reference internal" href="#how-to-update-xmds2-script-validator-xml-schema">How to update <tt class="docutils literal"><span class="pre">XMDS2</span></tt> script validator (XML schema)</a></li>
+<li><a class="reference internal" href="#how-to-update-xmds2-script-validator-xml-schema">How to update <code class="docutils literal"><span class="pre">XMDS2</span></code> script validator (XML schema)</a></li>
 <li><a class="reference internal" href="#how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment">How to introduce a new integrator Stepper into the XMDS2 environment</a></li>
 <li><a class="reference internal" href="#logical-breakdown-of-xmds2-parsing-process">Logical breakdown of XMDS2 Parsing Process</a><ul>
 <li><a class="reference internal" href="#overall-process-for-parsing-xml-file-in-xmds2">Overall process for parsing XML file in XMDS2</a></li>
@@ -320,7 +320,7 @@
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -337,7 +337,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -349,13 +349,13 @@
         <li class="right" >
           <a href="xsil2graphics2.html" title="xsil2graphics2"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/doctrees/advanced_topics.doctree b/documentation/doctrees/advanced_topics.doctree
index b605a1f..46b32ad 100644
Binary files a/documentation/doctrees/advanced_topics.doctree and b/documentation/doctrees/advanced_topics.doctree differ
diff --git a/documentation/doctrees/bulirschStoer.doctree b/documentation/doctrees/bulirschStoer.doctree
index 911ffe7..280dd78 100644
Binary files a/documentation/doctrees/bulirschStoer.doctree and b/documentation/doctrees/bulirschStoer.doctree differ
diff --git a/documentation/doctrees/developer.doctree b/documentation/doctrees/developer.doctree
index 9737aa7..3645371 100644
Binary files a/documentation/doctrees/developer.doctree and b/documentation/doctrees/developer.doctree differ
diff --git a/documentation/doctrees/documentation_toc.doctree b/documentation/doctrees/documentation_toc.doctree
index 2a2224b..048266e 100644
Binary files a/documentation/doctrees/documentation_toc.doctree and b/documentation/doctrees/documentation_toc.doctree differ
diff --git a/documentation/doctrees/environment.pickle b/documentation/doctrees/environment.pickle
index 567b21c..e977ecf 100644
Binary files a/documentation/doctrees/environment.pickle and b/documentation/doctrees/environment.pickle differ
diff --git a/documentation/doctrees/faq.doctree b/documentation/doctrees/faq.doctree
index 8d07890..16c01d1 100644
Binary files a/documentation/doctrees/faq.doctree and b/documentation/doctrees/faq.doctree differ
diff --git a/documentation/doctrees/index.doctree b/documentation/doctrees/index.doctree
index 7b06b13..c9bedac 100644
Binary files a/documentation/doctrees/index.doctree and b/documentation/doctrees/index.doctree differ
diff --git a/documentation/doctrees/installation.doctree b/documentation/doctrees/installation.doctree
index c585e2a..d74ce29 100644
Binary files a/documentation/doctrees/installation.doctree and b/documentation/doctrees/installation.doctree differ
diff --git a/documentation/doctrees/introduction.doctree b/documentation/doctrees/introduction.doctree
index 5d4bb2d..afe443f 100644
Binary files a/documentation/doctrees/introduction.doctree and b/documentation/doctrees/introduction.doctree differ
diff --git a/documentation/doctrees/licensing.doctree b/documentation/doctrees/licensing.doctree
index 6d97fcb..22fc85a 100644
Binary files a/documentation/doctrees/licensing.doctree and b/documentation/doctrees/licensing.doctree differ
diff --git a/documentation/doctrees/news.doctree b/documentation/doctrees/news.doctree
index 18a74d6..1423115 100644
Binary files a/documentation/doctrees/news.doctree and b/documentation/doctrees/news.doctree differ
diff --git a/documentation/doctrees/news_content.doctree b/documentation/doctrees/news_content.doctree
index 5f6a3e8..2920cb6 100644
Binary files a/documentation/doctrees/news_content.doctree and b/documentation/doctrees/news_content.doctree differ
diff --git a/documentation/doctrees/optimisation_hints.doctree b/documentation/doctrees/optimisation_hints.doctree
index 1937bf5..c8ee7b0 100644
Binary files a/documentation/doctrees/optimisation_hints.doctree and b/documentation/doctrees/optimisation_hints.doctree differ
diff --git a/documentation/doctrees/reference_elements.doctree b/documentation/doctrees/reference_elements.doctree
index 89f3e98..16c5f78 100644
Binary files a/documentation/doctrees/reference_elements.doctree and b/documentation/doctrees/reference_elements.doctree differ
diff --git a/documentation/doctrees/reference_index.doctree b/documentation/doctrees/reference_index.doctree
index cdd5dc7..2538445 100644
Binary files a/documentation/doctrees/reference_index.doctree and b/documentation/doctrees/reference_index.doctree differ
diff --git a/documentation/doctrees/reference_installation_and_configuration.doctree b/documentation/doctrees/reference_installation_and_configuration.doctree
index 62f69bb..a39be3e 100644
Binary files a/documentation/doctrees/reference_installation_and_configuration.doctree and b/documentation/doctrees/reference_installation_and_configuration.doctree differ
diff --git a/documentation/doctrees/reference_schema.doctree b/documentation/doctrees/reference_schema.doctree
index 4bdb846..76a4c6c 100644
Binary files a/documentation/doctrees/reference_schema.doctree and b/documentation/doctrees/reference_schema.doctree differ
diff --git a/documentation/doctrees/reference_usefulXMLSyntax.doctree b/documentation/doctrees/reference_usefulXMLSyntax.doctree
index 8771020..f9d29e0 100644
Binary files a/documentation/doctrees/reference_usefulXMLSyntax.doctree and b/documentation/doctrees/reference_usefulXMLSyntax.doctree differ
diff --git a/documentation/doctrees/tutorial.doctree b/documentation/doctrees/tutorial.doctree
index 44599a7..49127e6 100644
Binary files a/documentation/doctrees/tutorial.doctree and b/documentation/doctrees/tutorial.doctree differ
diff --git a/documentation/doctrees/upgrade.doctree b/documentation/doctrees/upgrade.doctree
index 21e1e41..3a5fd5b 100644
Binary files a/documentation/doctrees/upgrade.doctree and b/documentation/doctrees/upgrade.doctree differ
diff --git a/documentation/doctrees/worked_examples.doctree b/documentation/doctrees/worked_examples.doctree
index cf5838e..bf6a60f 100644
Binary files a/documentation/doctrees/worked_examples.doctree and b/documentation/doctrees/worked_examples.doctree differ
diff --git a/documentation/doctrees/xsil2graphics2.doctree b/documentation/doctrees/xsil2graphics2.doctree
index 97197c2..c25c592 100644
Binary files a/documentation/doctrees/xsil2graphics2.doctree and b/documentation/doctrees/xsil2graphics2.doctree differ
diff --git a/documentation/documentation_toc.html b/documentation/documentation_toc.html
index d615eba..6555c9b 100644
--- a/documentation/documentation_toc.html
+++ b/documentation/documentation_toc.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Welcome to the documentation for XMDS2! — XMDS2 2.2.2 documentation</title>
+    <title>Welcome to the documentation for XMDS2! — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,23 +25,23 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" /> 
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="welcome-to-the-documentation-for-xmds2">
 <span id="documentation"></span><h1>Welcome to the documentation for XMDS2!<a class="headerlink" href="#welcome-to-the-documentation-for-xmds2" title="Permalink to this headline">¶</a></h1>
@@ -80,7 +80,7 @@
 <li class="toctree-l1"><a class="reference internal" href="advanced_topics.html">Advanced Topics</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#importing-data">Importing data</a></li>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#convolutions-and-fourier-transforms">Convolutions and Fourier transforms</a></li>
-<li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#loose-geometry-matching-mode">‘Loose’ <tt class="docutils literal"><span class="pre">geometry_matching_mode</span></tt></a></li>
+<li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#loose-geometry-matching-mode">‘Loose’ <code class="docutils literal"><span class="pre">geometry_matching_mode</span></code></a></li>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#dimension-aliases">Dimension aliases</a></li>
 </ul>
 </li>
@@ -107,7 +107,7 @@
 <li class="toctree-l1"><a class="reference internal" href="developer.html">Developer Documentation</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#test-scripts">Test scripts</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#xmds-documentation">XMDS Documentation</a></li>
-<li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-update-xmds2-script-validator-xml-schema">How to update <tt class="docutils literal"><span class="pre">XMDS2</span></tt> script validator (XML schema)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-update-xmds2-script-validator-xml-schema">How to update <code class="docutils literal"><span class="pre">XMDS2</span></code> script validator (XML schema)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment">How to introduce a new integrator Stepper into the XMDS2 environment</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#logical-breakdown-of-xmds2-parsing-process">Logical breakdown of XMDS2 Parsing Process</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#directory-layout">Directory layout</a></li>
@@ -119,6 +119,8 @@
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="news.html">News</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-3-it-came-from-the-deep-january-20-2017">XMDS 2.2.3 “It came from the deep” (January 20, 2017)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-0-out-of-cheese-error-january-13-2014">XMDS 2.2.0 “Out of cheese error” (January 13, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013">XMDS 2.1.4 “Well if this isn’t nice, I don’t know what is” (September 27, 2013)</a></li>
@@ -136,12 +138,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -158,19 +160,19 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/faq.html b/documentation/faq.html
index f88b366..b0f8405 100644
--- a/documentation/faq.html
+++ b/documentation/faq.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Frequently Asked Questions — XMDS2 2.2.2 documentation</title>
+    <title>Frequently Asked Questions — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Upgrading From XMDS 1.X" href="upgrade.html" />
     <link rel="prev" title="Advanced Topics" href="advanced_topics.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="advanced_topics.html" title="Advanced Topics"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="frequently-asked-questions">
 <span id="faq"></span><span id="index-0"></span><h1>Frequently Asked Questions<a class="headerlink" href="#frequently-asked-questions" title="Permalink to this headline">¶</a></h1>
@@ -73,19 +73,19 @@
 </div>
 <div class="section" id="how-do-i-put-time-dependence-into-my-vectors">
 <span id="index-3"></span><h2>How do I put time dependence into my vectors?<a class="headerlink" href="#how-do-i-put-time-dependence-into-my-vectors" title="Permalink to this headline">¶</a></h2>
-<p>Standard vectors can’t have time dependence (or, more accurately, depend on the <tt class="docutils literal"><span class="pre">propagation_dimension</span></tt> variable), but computed vectors can. So, for example, if you have set your <tt class="docutils literal"><span class="pre">propagation_dimension</span></tt> as “t”, you can simply use the variable “t” in your computed vector and it will work.</p>
-<p>Alternatively, you can explicitly use the <tt class="docutils literal"><span class="pre">propagation_dimension</span></tt> variable in your differential equation inside the <tt class="docutils literal"><span class="pre"><operators></span></tt> block.</p>
+<p>Standard vectors can’t have time dependence (or, more accurately, depend on the <code class="docutils literal"><span class="pre">propagation_dimension</span></code> variable), but computed vectors can. So, for example, if you have set your <code class="docutils literal"><span class="pre">propagation_dimension</span></code> as “t”, you can simply use the variable “t” in your computed vector and it will work.</p>
+<p>Alternatively, you can explicitly use the <code class="docutils literal"><span class="pre">propagation_dimension</span></code> variable in your differential equation inside the <code class="docutils literal"><span class="pre"><operators></span></code> block.</p>
 </div>
 <div class="section" id="can-i-specify-the-range-of-my-domain-and-number-of-grid-points-at-run-time">
 <span id="index-4"></span><h2>Can I specify the range of my domain and number of grid points at run-time?<a class="headerlink" href="#can-i-specify-the-range-of-my-domain-and-number-of-grid-points-at-run-time" title="Permalink to this headline">¶</a></h2>
-<p>Yes, you can. In your script, specify the domain and number of grid points as arguments to be passed in at run-time, use those variables in your <tt class="docutils literal"><span class="pre"><geometry></span></tt> block rather than explicitly specifying them, and use the <tt class="docutils literal"><span class="pre"><validation</span> <span class="pre">kind="run-time"</span> <span class="pre">/></span></tt> feature. See the <a class="reference internal" href="r [...]
-<p>While the domain can always be specified in this way, specifying the lattice size at run-time is currently only allowed with the following transforms: ‘dct’, ‘dst’, ‘dft’ and ‘none’ (see <a class="reference internal" href="reference_elements.html#validation"><em>Transforms</em></a> in the Reference section).</p>
+<p>Yes, you can. In your script, specify the domain and number of grid points as arguments to be passed in at run-time, use those variables in your <code class="docutils literal"><span class="pre"><geometry></span></code> block rather than explicitly specifying them, and use the <code class="docutils literal"><span class="pre"><validation</span> <span class="pre">kind="run-time"</span> <span class="pre">/></span></code> feature. See the <a class="reference internal" [...]
+<p>While the domain can always be specified in this way, specifying the lattice size at run-time is currently only allowed with the following transforms: ‘dct’, ‘dst’, ‘dft’ and ‘none’ (see <a class="reference internal" href="reference_elements.html#validation"><span>Transforms</span></a> in the Reference section).</p>
 <p>Also note that for some multi-dimensional spaces using different transforms, XMDS2 will sometimes optimise the code it generates based on the relative sizes of the dimensions. If one or more of the lattices are specified at run-time it is unable to do this and will have to make guesses. In some situations this may result in slightly slower code.</p>
 </div>
 <div class="section" id="when-can-i-use-ip-operators-and-why-should-i-and-when-must-i-use-ex-operators">
 <span id="index-5"></span><h2>When can I use IP operators (and why should I) and when must I use EX operators?<a class="headerlink" href="#when-can-i-use-ip-operators-and-why-should-i-and-when-must-i-use-ex-operators" title="Permalink to this headline">¶</a></h2>
-<p>An <a class="reference internal" href="reference_elements.html#operatornameselement"><em><operator></em></a> that specifies named operators to be used in integration equations can have the <tt class="docutils literal"><span class="pre">kind="IP"</span></tt> or <tt class="docutils literal"><span class="pre">kind="EX"</span></tt> attribute, standing for ‘interaction picture’ and ‘explicit’ operators respectively.  Explicit operators can  [...]
-<p>Some explanation is in order.  The IP algorithm applies the operator separately to the rest of the evolution.  The reason this can be so effective is that the separate evolution can be performed exactly.  The solution of the equation <span class="math">\(\frac{d \psi}{dt} = L \psi\)</span> is <span class="math">\(\psi(t+\Delta t) = exp(L \Delta t) \psi(t)\)</span> for arbitrarily large timestep <span class="math">\(\Delta t\)</span>.  For a diagonal linear <tt class="docutils literal" [...]
+<p>An <a class="reference internal" href="reference_elements.html#operatornameselement"><span><operator></span></a> that specifies named operators to be used in integration equations can have the <code class="docutils literal"><span class="pre">kind="IP"</span></code> or <code class="docutils literal"><span class="pre">kind="EX"</span></code> attribute, standing for ‘interaction picture’ and ‘explicit’ operators respectively.  Explicit op [...]
+<p>Some explanation is in order.  The IP algorithm applies the operator separately to the rest of the evolution.  The reason this can be so effective is that the separate evolution can be performed exactly.  The solution of the equation <span class="math">\(\frac{d \psi}{dt} = L \psi\)</span> is <span class="math">\(\psi(t+\Delta t) = exp(L \Delta t) \psi(t)\)</span> for arbitrarily large timestep <span class="math">\(\Delta t\)</span>.  For a diagonal linear <code class="docutils litera [...]
 <p>Therefore, the limitations of IP operators themselves means that they can only be applied to to named components of one of the integration vectors, and not functions of those components.  Furthermore, an IP operator acting on a component must only be used in the derivative for that particular component.  Secondly, due to the implementation of IP operators in XMDS2, it is not safe to use them in comments, or in conjunction with declared variables.  It is also not safe to multiply or di [...]
 </div>
 <div class="section" id="visual-editors">
@@ -98,7 +98,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -118,7 +118,7 @@
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -135,7 +135,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -147,13 +147,13 @@
         <li class="right" >
           <a href="advanced_topics.html" title="Advanced Topics"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/genindex.html b/documentation/genindex.html
index 5eaae8c..d9c68f4 100644
--- a/documentation/genindex.html
+++ b/documentation/genindex.html
@@ -7,15 +7,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Index — XMDS2 2.2.2 documentation</title>
+    <title>Index — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -26,23 +26,23 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" /> 
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
 
 <h1 id="index">Index</h1>
@@ -112,7 +112,7 @@
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="worked_examples.html#index-14">Aliases</a>, <a href="reference_elements.html#index-29">[1]</a>, <a href="reference_elements.html#index-32">[2]</a>
+  <dt><a href="reference_elements.html#index-29">Aliases</a>, <a href="reference_elements.html#index-32">[1]</a>, <a href="worked_examples.html#index-14">[2]</a>
   </dt>
 
   </dl></td>
@@ -268,7 +268,7 @@
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="xsil2graphics2.html#index-0">Exporting data</a>, <a href="tutorial.html#index-1">[1]</a>
+  <dt><a href="tutorial.html#index-1">Exporting data</a>, <a href="xsil2graphics2.html#index-0">[1]</a>
   </dt>
 
   </dl></td>
@@ -1029,12 +1029,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -1051,19 +1051,19 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              >index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/index.html b/documentation/index.html
index 6d93bc9..9a51c36 100644
--- a/documentation/index.html
+++ b/documentation/index.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Welcome to XMDS2! — XMDS2 2.2.2 documentation</title>
+    <title>Welcome to XMDS2! — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,11 +25,11 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="#" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="#" />
     <link rel="next" title="Introduction" href="introduction.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -38,25 +38,41 @@
         <li class="right" >
           <a href="introduction.html" title="Introduction"
              accesskey="N">next</a> |</li>
-        <li><a href="#">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="#">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="welcome-to-xmds2">
 <h1>Welcome to XMDS2!<a class="headerlink" href="#welcome-to-xmds2" title="Permalink to this headline">¶</a></h1>
-<p>This website provides the documentation for XMDS2 (an all-new version of <a class="reference internal" href="introduction.html#xmdshistory"><em>XMDS</em></a>), a software package that allows the fast and easy solution of sets of ordinary, partial and stochastic differential equations, using a variety of efficient numerical algorithms.</p>
+<p>This website provides the documentation for XMDS2 (an all-new version of <a class="reference internal" href="introduction.html#xmdshistory"><span>XMDS</span></a>), a software package that allows the fast and easy solution of sets of ordinary, partial and stochastic differential equations, using a variety of efficient numerical algorithms.</p>
 <p>If you publish work that has involved XMDS2, please cite it as <a class="reference external" href="http://dx.doi.org/10.1016/j.cpc.2012.08.016">Comput. Phys. Commun. 184, 201-208 (2013)</a>.</p>
 <div class="section" id="getting-started">
 <h2>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h2>
-<p>To get a flavour of what XMDS2 can do, take a look at our <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a>, then take a look at our comprehensive  <a class="reference internal" href="documentation_toc.html#documentation"><em>documentation</em></a>.  Automated installers are available for Linux and Mac OS X, refer to our <a class="reference internal" href="installation.html#installation"><em>installation instructions</em></a> for de [...]
+<p>To get a flavour of what XMDS2 can do, take a look at our <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a>, then take a look at our comprehensive  <a class="reference internal" href="documentation_toc.html#documentation"><span>documentation</span></a>.  Automated installers are available for Linux and Mac OS X, refer to our <a class="reference internal" href="installation.html#installation"><span>installation instructions</span [...]
 </div>
 <div class="section" id="news">
 <h2>News<a class="headerlink" href="#news" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="xmds-2-2-3-it-came-from-the-deep-january-20-2017">
+<h3>XMDS 2.2.3 “It came from the deep” (January 20, 2017)<a class="headerlink" href="#xmds-2-2-3-it-came-from-the-deep-january-20-2017" title="Permalink to this headline">¶</a></h3>
+<p>XMDS 2.2.3 is primarily a maintenance release consolidating various bug fixes and small improvements that have been made. Specifically</p>
+<ul class="simple">
+<li>A number of bugs have been fixed</li>
+<li>Remove requirement that samples must divide into steps when using an adaptive stepper</li>
+<li>Make initial step size more robust when using adaptive stepper</li>
+<li>Improved debug mode</li>
+<li>Added extra examples</li>
+<li>Documentation improvements</li>
+</ul>
+</div>
+<div class="section" id="xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">
+<h3>XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)<a class="headerlink" href="#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014" title="Permalink to this headline">¶</a></h3>
+<p>High priority bug fixes to the previous release.</p>
+</div>
 <div class="section" id="xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">
 <h3>XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)<a class="headerlink" href="#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014" title="Permalink to this headline">¶</a></h3>
 <p>XMDS 2.2.1 contains minor bugfixes and updates. This includes documentation improvements, superior handling of external packages and more informative errors.</p>
@@ -65,7 +81,7 @@
 <h3>XMDS 2.2.0 “Out of cheese error” (January 13, 2014)<a class="headerlink" href="#xmds-2-2-0-out-of-cheese-error-january-13-2014" title="Permalink to this headline">¶</a></h3>
 <p>XMDS 2.2.0 contains a number of new features, as well as bugfixes and updates. Specifically</p>
 <ul class="simple">
-<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><em>Optimisation hints</em>< [...]
+<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><span>Optimisation hints</sp [...]
 <li>Significant speed optimisations for adaptive integrators with IP operators (past IP operator calculations are re-used if the time-step hasn’t changed).</li>
 <li>The “constant” attribute for IP/EX operators is now unnecessary and considered advanced usage.  If you don’t know whether to specify constant=”yes” or constant=”no”, don’t specify either.</li>
 <li>The xsil2graphics2 data exporter now supports Matlab, Octave, Mathematica and Python in all output formats, as well as R (HDF5 only).  The Matlab/Octave scripts are now identical.  A script generated for one will work for the other.</li>
@@ -83,7 +99,7 @@
 <p>The XMDS 2.1.4 update contains many new improvements and bugfixes:</p>
 <ul class="simple">
 <li><em>xsil2graphics2</em> now supports all output formats for MATLAB, Octave and Python.  The scripts generated for MATLAB/Octave are compatible with both.</li>
-<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><em>nonlocally</em></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><em>dimension alias</em></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
+<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><span>nonlocally</span></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><span>dimension alias</span></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
 <li>Correct the Fourier basis for dimensions using Hermite-Gauss transforms.  Previously ‘kx’ was effectively behaving as ‘-kx’.</li>
 <li>Improve the performance of ‘nx’ <–> ‘kx’ Hermite-Gauss transforms.</li>
 <li>Stochastic error checking with runtime noise generation now works correctly.  Previously different random numbers were generated for the full-step paths and the half-step paths.</li>
@@ -117,7 +133,7 @@
 </div>
 <div class="section" id="xmds-2-1-happy-mollusc-june-14-2012">
 <h3>XMDS 2.1 “Happy Mollusc” (June 14, 2012)<a class="headerlink" href="#xmds-2-1-happy-mollusc-june-14-2012" title="Permalink to this headline">¶</a></h3>
-<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><em>here</em></a> for details about the installers.</p>
+<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><span>here</span></a> for details about the installers.</p>
 <p>Existing users should note that this release introduces a more concise syntax for moment groups.  You can now use:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><sampling_group</span> <span class="na">initial_sample=</span><span class="s">"yes"</span> <span class="na">basis=</span><span class="s">"x y z"</span><span class="nt">></span>
     ...
@@ -136,7 +152,7 @@
 <p>In both cases, although the old syntax is not described in the documentation, it is still supported, so existing scripts will work without any changes.</p>
 <p>Other changes in XMDS 2.1 include:</p>
 <ul class="simple">
-<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><em>here</em></a> for details.</li>
+<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><span>here</span></a> for details.</li>
 <li><em>noise_vectors</em> can now be used in non-uniform dimensions (e.g. dimensions using the Bessel transform for cylindrical symmetry).</li>
 <li>“loose” <em>geometry_matching_mode</em> for HDF5 vector initialisation.  This enables extending the simulation grid from one simulation to the next, or coarsening or refining a grid when importing.</li>
 <li><em>vectors</em> can now be initialised by integrating over dimensions of other vectors.  <em>computed_vectors</em> always supported this, now <em>vectors</em> do too.</li>
@@ -202,7 +218,7 @@
 <li class="toctree-l1"><a class="reference internal" href="advanced_topics.html">Advanced Topics</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#importing-data">Importing data</a></li>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#convolutions-and-fourier-transforms">Convolutions and Fourier transforms</a></li>
-<li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#loose-geometry-matching-mode">‘Loose’ <tt class="docutils literal"><span class="pre">geometry_matching_mode</span></tt></a></li>
+<li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#loose-geometry-matching-mode">‘Loose’ <code class="docutils literal"><span class="pre">geometry_matching_mode</span></code></a></li>
 <li class="toctree-l2"><a class="reference internal" href="advanced_topics.html#dimension-aliases">Dimension aliases</a></li>
 </ul>
 </li>
@@ -229,7 +245,7 @@
 <li class="toctree-l1"><a class="reference internal" href="developer.html">Developer Documentation</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#test-scripts">Test scripts</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#xmds-documentation">XMDS Documentation</a></li>
-<li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-update-xmds2-script-validator-xml-schema">How to update <tt class="docutils literal"><span class="pre">XMDS2</span></tt> script validator (XML schema)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-update-xmds2-script-validator-xml-schema">How to update <code class="docutils literal"><span class="pre">XMDS2</span></code> script validator (XML schema)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment">How to introduce a new integrator Stepper into the XMDS2 environment</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#logical-breakdown-of-xmds2-parsing-process">Logical breakdown of XMDS2 Parsing Process</a></li>
 <li class="toctree-l2"><a class="reference internal" href="developer.html#directory-layout">Directory layout</a></li>
@@ -241,6 +257,8 @@
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="news.html">News</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-3-it-came-from-the-deep-january-20-2017">XMDS 2.2.3 “It came from the deep” (January 20, 2017)</a></li>
+<li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-2-0-out-of-cheese-error-january-13-2014">XMDS 2.2.0 “Out of cheese error” (January 13, 2014)</a></li>
 <li class="toctree-l2"><a class="reference internal" href="news.html#xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013">XMDS 2.1.4 “Well if this isn’t nice, I don’t know what is” (September 27, 2013)</a></li>
@@ -260,7 +278,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="#">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -282,7 +300,7 @@
 <li class="toctree-l1"><a class="reference internal" href="news.html">News</a></li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -299,7 +317,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -308,13 +326,13 @@
         <li class="right" >
           <a href="introduction.html" title="Introduction"
              >next</a> |</li>
-        <li><a href="#">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="#">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/installation.html b/documentation/installation.html
index 22e0b0d..d2df417 100644
--- a/documentation/installation.html
+++ b/documentation/installation.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Installation — XMDS2 2.2.2 documentation</title>
+    <title>Installation — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Quickstart Tutorial" href="tutorial.html" />
     <link rel="prev" title="Introduction" href="introduction.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="introduction.html" title="Introduction"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="installation">
 <span id="index-0"></span><span id="id1"></span><h1>Installation<a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h1>
@@ -59,7 +59,7 @@
 <p>If you’re using a Mac with OSX >= 10.6, there is a simple drag-and-drop installer available.</p>
 <p>If you are using a recent version of Ubuntu or Debian, XMDS2 is available as a package in your package / software manager. Note that if using the Ubuntu Software Centre rather than Synaptic, you must explicitly search for “xmds2” rather than “xmds”, or you will only get XMDS1 as a result.</p>
 <p>If you’re using a version of Linux that’s not Ubuntu / Debian, the easiest way to get started is to use the install shell script linked to below.</p>
-<p>If we don’t have an installer for your system, follow the <a class="reference internal" href="#manualinstallation"><em>manual installation</em></a> instructions.</p>
+<p>If we don’t have an installer for your system, follow the <a class="reference internal" href="#manualinstallation"><span>manual installation</span></a> instructions.</p>
 <table border="1" class="docutils">
 <colgroup>
 <col width="60%" />
@@ -69,14 +69,14 @@
 <tbody valign="top">
 <tr class="row-odd"><td>Linux (Ubuntu/Debian/Fedora/RedHat)</td>
 <td><a class="reference external" href="http://svn.code.sf.net/p/xmds/code/trunk/xpdeint/admin/linux_installer.sh">Download Linux shell script installer</a></td>
-<td><a class="reference internal" href="#linux-installation"><em>Learn more</em></a></td>
+<td><a class="reference internal" href="#linux-installation"><span>Learn more</span></a></td>
 </tr>
 <tr class="row-even"><td>OS X 10.6 / 10.7 / 10.8 / 10.9</td>
 <td><a class="reference external" href="http://sourceforge.net/projects/xmds/files">Download OS X Installer</a></td>
-<td><a class="reference internal" href="#mac-installation"><em>Learn more</em></a></td>
+<td><a class="reference internal" href="#mac-installation"><span>Learn more</span></a></td>
 </tr>
 <tr class="row-odd"><td>Other systems</td>
-<td><a class="reference internal" href="#manualinstallation"><em>Install from source</em></a></td>
+<td><a class="reference internal" href="#manualinstallation"><span>Install from source</span></a></td>
 <td> </td>
 </tr>
 </tbody>
@@ -96,10 +96,10 @@
 <div class="highlight-xmds2"><div class="highlight"><pre>/bin/bash -c "$(wget -qO - http://svn.code.sf.net/p/xmds/code/trunk/xpdeint/admin/linux_installer.sh)"
 </pre></div>
 </div>
-<p>The linux installer installs all XMDS2 dependencies from your native package manager where possible (<tt class="docutils literal"><span class="pre">apt-get</span></tt> for Ubuntu/Debian, <tt class="docutils literal"><span class="pre">yum</span></tt> for Fedora/Red Hat) but will download and compile the source code for libraries not available through the package manager. This means you’ll need to be connected to the internet when running the installer. The installer should not be [...]
-<p>For instructions on how to install XMDS2 on systems where you lack administrative rights, see <a class="reference internal" href="#manualinstallation"><em>Manual installation from source</em></a>.</p>
-<p>By default, this installer will install a known stable version of XMDS, which can be updated at any time by navigating to the XMDS directory and typing ‘make update’. To install the latest developer version at the beginning, simply run the installer with the <tt class="docutils literal"><span class="pre">--develop</span></tt> option.</p>
-<p>Once XMDS2 has been installed, you can run it from the terminal by typing <tt class="docutils literal"><span class="pre">xmds2</span></tt>. See the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a> for next steps.</p>
+<p>The linux installer installs all XMDS2 dependencies from your native package manager where possible (<code class="docutils literal"><span class="pre">apt-get</span></code> for Ubuntu/Debian, <code class="docutils literal"><span class="pre">yum</span></code> for Fedora/Red Hat) but will download and compile the source code for libraries not available through the package manager. This means you’ll need to be connected to the internet when running the installer. The installer shoul [...]
+<p>For instructions on how to install XMDS2 on systems where you lack administrative rights, see <a class="reference internal" href="#manualinstallation"><span>Manual installation from source</span></a>.</p>
+<p>By default, this installer will install a known stable version of XMDS, which can be updated at any time by navigating to the XMDS directory and typing ‘make update’. To install the latest developer version at the beginning, simply run the installer with the <code class="docutils literal"><span class="pre">--develop</span></code> option.</p>
+<p>Once XMDS2 has been installed, you can run it from the terminal by typing <code class="docutils literal"><span class="pre">xmds2</span></code>. See the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a> for next steps.</p>
 </div>
 <div class="section" id="mac-os-x-installation">
 <span id="mac-installation"></span><span id="index-2"></span><h2>Mac OS X Installation<a class="headerlink" href="#mac-os-x-installation" title="Permalink to this headline">¶</a></h2>
@@ -111,8 +111,8 @@
 <h3>Using the Mac OS X Installer<a class="headerlink" href="#using-the-mac-os-x-installer" title="Permalink to this headline">¶</a></h3>
 <p>A self-contained installer for Mac OS X 10.6 (Snow Leopard) and later is available from the link above. This installer is only compatible with Intel Macs.  This means that the older PowerPC architecture is <em>not supported</em>.  Xcode (Apple’s developer tools) is required to use this installer. Xcode is available for free from the Mac App Store for 10.7 or later, and is available on the install disk of earlier Macs as an optional install.  For users of earlier operating system [...]
 <p>Once you have downloaded the XMDS installer, installation is as simple as dragging it to your Applications folder or any other location.  Click the XMDS application to launch it, and press the “Launch XMDS Terminal” button to open a Terminal window customised to work with XMDS.  The first time you do this, the application will complete the installation process.  This process can take a few minutes, but is only performed once.</p>
-<p>The terminal window launched by the XMDS application has environment variables set for using this installation of XMDS.  You can run XMDS in this terminal by typing <tt class="docutils literal"><span class="pre">xmds2</span></tt>.  See the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a> for next steps.</p>
-<p>To uninstall XMDS, drag the XMDS application to the trash. XMDS places some files in the directory <tt class="docutils literal"><span class="pre">~/Library/XMDS</span></tt>. Remove this directory to completely remove XMDS from your system.</p>
+<p>The terminal window launched by the XMDS application has environment variables set for using this installation of XMDS.  You can run XMDS in this terminal by typing <code class="docutils literal"><span class="pre">xmds2</span></code>.  See the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a> for next steps.</p>
+<p>To uninstall XMDS, drag the XMDS application to the trash. XMDS places some files in the directory <code class="docutils literal"><span class="pre">~/Library/XMDS</span></code>. Remove this directory to completely remove XMDS from your system.</p>
 <p>This package includes binaries for <a class="reference external" href="http://www.open-mpi.org">OpenMPI</a>, <a class="reference external" href="http://www.fftw.org">FFTW</a>, <a class="reference external" href="http://www.hdfgroup.org/HDF5">HDF5</a> and <a class="reference external" href="http://www.gnu.org/software/gsl">GSL</a>. These binaries are self-contained and do not overwrite any existing installations.</p>
 </div>
 </div>
@@ -135,12 +135,13 @@
 <dt>You will need a copy of XMDS2.</dt>
 <dd><p class="first">The current release can be found at <a class="reference external" href="http://sourceforge.net/projects/xmds/">Sourceforge</a>, and downloaded as a single file.
 Download this file, and expand it in a directory where you want to keep the program files.</p>
-<ul class="last">
-<li><p class="first">Developer-only instructions: You can instead check out a working copy of the source using SVN.
+<ul class="last simple">
+<li>Developer-only instructions: You can instead check out a working copy of the source using SVN.
 In a directory where you want to check out the repository, run:
-<tt class="docutils literal"><span class="pre">svn</span> <span class="pre">checkout</span> <span class="pre">https://svn.code.sf.net/p/xmds/code/trunk/xpdeint</span> <span class="pre">.</span></tt></p>
-<p>(Only do this once.  To update your copy, type <tt class="docutils literal"><span class="pre">svn</span> <span class="pre">up</span></tt> or <tt class="docutils literal"><span class="pre">make</span> <span class="pre">update</span></tt> in the same directory, and then repeat any developer-only instructions below).</p>
-</li>
+<code class="docutils literal"><span class="pre">svn</span> <span class="pre">checkout</span> <span class="pre">https://svn.code.sf.net/p/xmds/code/trunk/xpdeint</span> <span class="pre">.</span></code>
+(Only do this once.  To update your copy, type <code class="docutils literal"><span class="pre">svn</span> <span class="pre">up</span></code> or <code class="docutils literal"><span class="pre">make</span> <span class="pre">update</span></code> in the same directory, and then repeat any developer-only instructions below).
+A checkout with read/write permissions requires a checkout with your login details.  e.g.:
+<code class="docutils literal"><span class="pre">svn</span> <span class="pre">checkout</span> <span class="pre">--username=myusername</span> <span class="pre">https://myusername@svn.code.sf.net/p/xmds/code/trunk/xpdeint</span> <span class="pre">.</span></code></li>
 </ul>
 </dd>
 </dl>
@@ -166,7 +167,7 @@ Intel’s compiler typically generates faster code than gcc, but it isn&#821
 <li><dl class="first docutils">
 <dt>Install setuptools.</dt>
 <dd><p class="first">If you have root (sudo) access, the easy way to install this is by executing
-ez_setup.py from the repository. Simply type <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">python</span> <span class="pre">ez_setup.py</span></tt></p>
+ez_setup.py from the repository. Simply type <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">python</span> <span class="pre">ez_setup.py</span></code></p>
 <blockquote>
 <div><p>If you want to install into your home directory without root access, this is more complex:</p>
 <ol class="loweralpha simple">
@@ -174,11 +175,11 @@ ez_setup.py from the repository. Simply type <tt class="docutils literal"><span
 Add “export PYTHONPATH=~/lib/python2.5/site-packages:$PYTHONPATH” and “export PATH=~/bin:$PATH” (if necessary)
 to your .bashrc file (and run ”. ~/.bashrc”)</li>
 <li>If necessary install setuptools, by executing ez_setup.py from the repository.
-<tt class="docutils literal"><span class="pre">python</span> <span class="pre">ez_setup.py</span> <span class="pre">--prefix=~</span></tt></li>
+<code class="docutils literal"><span class="pre">python</span> <span class="pre">ez_setup.py</span> <span class="pre">--prefix=~</span></code></li>
 </ol>
 </div></blockquote>
 <p class="last">If you use Mac OS X 10.5 or later, or installed the Enthought Python Distribution on Windows, then setuptools is already installed.
-Though if the next step fails, you may need to upgrade setuptools.  To do that, type <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">-U</span> <span class="pre">setuptools</span></tt></p>
+Though if the next step fails, you may need to upgrade setuptools.  To do that, type <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">-U</span> <span class="pre">setuptools</span></code></p>
 </dd>
 </dl>
 </li>
@@ -194,14 +195,14 @@ provides support for loading data created in this format into Mathematica and Ma
 <p>* Sidebar: Installing HDF5 from source follows a common pattern, which you may find yourself repeating later:</p>
 <blockquote class="last">
 <div><ol class="arabic">
-<li><p class="first">After extracting the source directory, type <tt class="docutils literal"><span class="pre">configure</span></tt> and then add possible options.</p>
+<li><p class="first">After extracting the source directory, type <code class="docutils literal"><span class="pre">configure</span></code> and then add possible options.</p>
 <blockquote>
-<div><p>(For HDF5, install with the <tt class="docutils literal"><span class="pre">--prefix=/usr/local/</span></tt> option if you want XMDS2 to find the library automatically.  This is rarely needed for other packages.)</p>
+<div><p>(For HDF5, install with the <code class="docutils literal"><span class="pre">--prefix=/usr/local/</span></code> option if you want XMDS2 to find the library automatically.  This is rarely needed for other packages.)</p>
 </div></blockquote>
 </li>
-<li><p class="first">Once that is finished, type <tt class="docutils literal"><span class="pre">make</span></tt>.  Then wait for that to finish, which will often be longer than you think.</p>
+<li><p class="first">Once that is finished, type <code class="docutils literal"><span class="pre">make</span></code>.  Then wait for that to finish, which will often be longer than you think.</p>
 </li>
-<li><p class="first">Finally, type <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">make</span> <span class="pre">install</span></tt> to install it into the appropriate directory.</p>
+<li><p class="first">Finally, type <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">make</span> <span class="pre">install</span></code> to install it into the appropriate directory.</p>
 </li>
 </ol>
 </div></blockquote>
@@ -214,7 +215,7 @@ provides support for loading data created in this format into Mathematica and Ma
 support for MPI distributed simulations, you must configure FFTW to use MPI.</p>
 <p class="last">FFTW is available for free at the <a class="reference external" href="http://www.fftw.org/">FFTW website</a>.
 To configure and compile it, follow the steps described in the HDF5 sidebar above.
-You may wish to add the <tt class="docutils literal"><span class="pre">--enable-mpi</span> <span class="pre">--disable-fortran</span></tt> options to the <tt class="docutils literal"><span class="pre">configure</span></tt> command.</p>
+You may wish to add the <code class="docutils literal"><span class="pre">--enable-mpi</span> <span class="pre">--disable-fortran</span></code> options to the <code class="docutils literal"><span class="pre">configure</span></code> command.</p>
 </dd>
 </dl>
 </li>
@@ -243,19 +244,19 @@ Mac OS X comes with its own (fast) matrix library.</p>
 </li>
 <li><dl class="first docutils">
 <dt><strong>numpy</strong> is a tool that XMDS2 uses for automated testing.</dt>
-<dd><p class="first">It can be installed with <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">numpy</span></tt>.</p>
+<dd><p class="first">It can be installed with <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">numpy</span></code>.</p>
 <p class="last">Mac OS X 10.5 and later come with numpy.</p>
 </dd>
 </dl>
 </li>
 <li><dl class="first docutils">
 <dt><strong>lxml</strong> is used to validate the syntax of scripts passed to XMDS2.</dt>
-<dd><p class="first">If you have root access, this can be installed with the command <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">lxml</span></tt></p>
+<dd><p class="first">If you have root access, this can be installed with the command <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">lxml</span></code></p>
 <p>You will need to have ‘libxml2’ and ‘libxslt’ installed (via your choice of package manager) to install lxml.
 Sufficient versions are preinstalled on Mac OS X 10.6.</p>
 <dl class="last docutils">
 <dt>If you don’t have root access or want to install into your home directory, use:</dt>
-<dd><p class="first last"><tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">--prefix=~</span> <span class="pre">lxml</span></tt></p>
+<dd><p class="first last"><code class="docutils literal"><span class="pre">easy_install</span> <span class="pre">--prefix=~</span> <span class="pre">lxml</span></code></p>
 </dd>
 </dl>
 </dd>
@@ -266,7 +267,7 @@ Sufficient versions are preinstalled on Mac OS X 10.6.</p>
 <dd><p class="first">h5py requires numpy version 1.0.3 or later.</p>
 <p class="last">Upgrading <a class="reference external" href="http://h5py.alfven.org/">h5py</a> on Mac OS X is best done with the source of the package, as the easy_install option can get confused with multiple numpy versions.
 (Mac OS X Snow Leopard comes with version 1.2.1).
-After downloading the source, execute <tt class="docutils literal"><span class="pre">python</span> <span class="pre">./setup.py</span> <span class="pre">build</span></tt> in the source directory, and then <tt class="docutils literal"><span class="pre">python</span> <span class="pre">./setup.py</span> <span class="pre">install</span></tt> to install it.</p>
+After downloading the source, execute <code class="docutils literal"><span class="pre">python</span> <span class="pre">./setup.py</span> <span class="pre">build</span></code> in the source directory, and then <code class="docutils literal"><span class="pre">python</span> <span class="pre">./setup.py</span> <span class="pre">install</span></code> to install it.</p>
 </dd>
 </dl>
 </li>
@@ -274,21 +275,21 @@ After downloading the source, execute <tt class="docutils literal"><span class="
 </div></blockquote>
 </li>
 <li><dl class="first docutils">
-<dt>Install XMDS2 into your python path by running (in the xmds-2.2.1/ directory):</dt>
-<dd><p class="first"><tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">./setup.py</span> <span class="pre">develop</span></tt></p>
-<p>If you want to install it into your home directory, type <tt class="docutils literal"><span class="pre">./setup.py</span> <span class="pre">develop</span> <span class="pre">--prefix=~</span></tt></p>
+<dt>Install XMDS2 into your python path by running (in the xmds-2.2.3/ directory):</dt>
+<dd><p class="first"><code class="docutils literal"><span class="pre">sudo</span> <span class="pre">./setup.py</span> <span class="pre">develop</span></code></p>
+<p>If you want to install it into your home directory, type <code class="docutils literal"><span class="pre">./setup.py</span> <span class="pre">develop</span> <span class="pre">--prefix=~</span></code></p>
 <p>This step requires access to the net, as it downloads any dependent packages.  If you are behind a firewall, you may need to set your HTTP_PROXY environment variable in order to do this.</p>
 <ul class="last">
 <li><dl class="first docutils">
 <dt>Developer only instructions:</dt>
 <dd><p class="first last">The Cheetah templates (*.tmpl) must be compiled into python.
-To do this, run <tt class="docutils literal"><span class="pre">make</span></tt> in the xmds-2.2.1/ directory.</p>
+To do this, run <code class="docutils literal"><span class="pre">make</span></code> in the xmds-2.2.3/ directory.</p>
 </dd>
 </dl>
 </li>
 <li><dl class="first docutils">
 <dt>Developer-only instructions:</dt>
-<dd><p class="first last">If you have ‘numpy’ installed, test XMDS2 by typing <tt class="docutils literal"><span class="pre">./run_tests.py</span></tt> in the xmds-2.2.1/ directory.
+<dd><p class="first last">If you have ‘numpy’ installed, test XMDS2 by typing <code class="docutils literal"><span class="pre">./run_tests.py</span></code> in the xmds-2.2.3/ directory.
 The package ‘numpy’ is one of the optional packages, with installation instructions below.</p>
 </dd>
 </dl>
@@ -296,10 +297,10 @@ The package ‘numpy’ is one of the optional packages, with installati
 <li><dl class="first docutils">
 <dt>Developer-only instructions:</dt>
 <dd><p class="first">To build the user documentation, you first need to install sphinx, either via your package manager or:
-<tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">Sphinx</span></tt></p>
-<p>Then, to build the documentation, in the xmds-2.2.1/admin/userdoc-source/ directory run: <tt class="docutils literal"><span class="pre">make</span> <span class="pre">html</span></tt></p>
-<p>If this results in an error, you may need to run <tt class="docutils literal"><span class="pre">sudo</span> <span class="pre">./setup.py</span> <span class="pre">develop</span></tt></p>
-<p class="last">The generated html documentation will then be found at xmds-2.2.1/documentation/index.html</p>
+<code class="docutils literal"><span class="pre">sudo</span> <span class="pre">easy_install</span> <span class="pre">Sphinx</span></code></p>
+<p>Then, to build the documentation, in the xmds-2.2.3/admin/userdoc-source/ directory run: <code class="docutils literal"><span class="pre">make</span> <span class="pre">html</span></code></p>
+<p>If this results in an error, you may need to run <code class="docutils literal"><span class="pre">sudo</span> <span class="pre">./setup.py</span> <span class="pre">develop</span></code></p>
+<p class="last">The generated html documentation will then be found at xmds-2.2.3/documentation/index.html</p>
 </dd>
 </dl>
 </li>
@@ -307,19 +308,19 @@ The package ‘numpy’ is one of the optional packages, with installati
 </dd>
 </dl>
 </li>
-<li><p class="first">Configure XMDS2 by typing <tt class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></tt>.  If XMDS2 is unable to find a library, you can tell XMDS2 where these libraries are located by adding <tt class="docutils literal"><span class="pre">include</span></tt> and <tt class="docutils literal"><span class="pre">lib</span></tt> search paths using the <tt class="docutils literal"><span class="pre">--include-path</span></tt> and <tt [...]
+<li><p class="first">Configure XMDS2 by typing <code class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></code>.  If XMDS2 is unable to find a library, you can tell XMDS2 where these libraries are located by adding <code class="docutils literal"><span class="pre">include</span></code> and <code class="docutils literal"><span class="pre">lib</span></code> search paths using the <code class="docutils literal"><span class="pre">--include-path</span [...]
 <blockquote>
 <div><ul class="simple">
-<li><tt class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span> <span class="pre">--include-path</span> <span class="pre">/apps/fftw3/include</span> <span class="pre">--lib-path</span> <span class="pre">/apps/fftw3/lib</span></tt>.</li>
+<li><code class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span> <span class="pre">--include-path</span> <span class="pre">/apps/fftw3/include</span> <span class="pre">--lib-path</span> <span class="pre">/apps/fftw3/lib</span></code>.</li>
 </ul>
-<p>If you need to use additional compiler or link flags for XMDS2 to use certain libraries, set the <tt class="docutils literal"><span class="pre">CXXFLAGS</span></tt> or <tt class="docutils literal"><span class="pre">LINKFLAGS</span></tt> environment variables before calling <tt class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></tt>.  For example, to pass the compiler flag <tt class="docutils literal"><span class="pre">-pedantic</span></tt> a [...]
+<p>If you need to use additional compiler or link flags for XMDS2 to use certain libraries, set the <code class="docutils literal"><span class="pre">CXXFLAGS</span></code> or <code class="docutils literal"><span class="pre">LINKFLAGS</span></code> environment variables before calling <code class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></code>.  For example, to pass the compiler flag <code class="docutils literal"><span class="pre">-pedantic [...]
 <ul class="simple">
-<li><tt class="docutils literal"><span class="pre">CXXFLAGS="-pedantic"</span> <span class="pre">LINKFLAGS="-lm"</span> <span class="pre">xmds2</span> <span class="pre">--reconfigure</span></tt>.</li>
+<li><code class="docutils literal"><span class="pre">CXXFLAGS="-pedantic"</span> <span class="pre">LINKFLAGS="-lm"</span> <span class="pre">xmds2</span> <span class="pre">--reconfigure</span></code>.</li>
 </ul>
 </div></blockquote>
 </li>
 </ol>
-<p><strong>Congratulations!</strong> You should now have a fully operational copy of xmds2 and xsil2graphics2.  You can test your copy using examples from the “xmds-2.2.1/examples” directory, and follow the worked examples in the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a> and <a class="reference internal" href="worked_examples.html#workedexamples"><em>Worked Examples</em></a>.</p>
+<p><strong>Congratulations!</strong> You should now have a fully operational copy of xmds2 and xsil2graphics2.  You can test your copy using examples from the “xmds-2.2.3/examples” directory, and follow the worked examples in the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a> and <a class="reference internal" href="worked_examples.html#workedexamples"><span>Worked Examples</span></a>.</p>
 </div>
 </div>
 
@@ -327,7 +328,7 @@ The package ‘numpy’ is one of the optional packages, with installati
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -347,7 +348,7 @@ The package ‘numpy’ is one of the optional packages, with installati
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -364,7 +365,7 @@ The package ‘numpy’ is one of the optional packages, with installati
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -376,13 +377,13 @@ The package ‘numpy’ is one of the optional packages, with installati
         <li class="right" >
           <a href="introduction.html" title="Introduction"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/introduction.html b/documentation/introduction.html
index 61d1338..f39e8e9 100644
--- a/documentation/introduction.html
+++ b/documentation/introduction.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Introduction — XMDS2 2.2.2 documentation</title>
+    <title>Introduction — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Installation" href="installation.html" />
     <link rel="prev" title="Welcome to XMDS2!" href="index.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,25 +42,25 @@
         <li class="right" >
           <a href="index.html" title="Welcome to XMDS2!"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="introduction">
 <h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h1>
-<p>Welcome to <strong>XMDS2</strong> (codenamed <cite>xpdeint</cite>), which is an all-new version of <a class="reference internal" href="#xmdshistory"><em>XMDS</em></a>.  Prepare for fast, easily-extended simulations with minimal code error.</p>
+<p>Welcome to <strong>XMDS2</strong> (codenamed <cite>xpdeint</cite>), which is an all-new version of <a class="reference internal" href="#xmdshistory"><span>XMDS</span></a>.  Prepare for fast, easily-extended simulations with minimal code error.</p>
 <p><strong>Description:</strong>   The purpose of XMDS2 is to simplify the process of creating simulations that solve systems of initial-value first-order partial and ordinary differential equations. Instead of going through the error-prone process of writing by hand thousands of lines of code, XMDS2 enables many problems to be described in a simple XML format. From this XML description XMDS2 writes a C++ simulation that solves the problem using fast algorithms. Anecdotally, the code gen [...]
 <p>XMDS2 can be used to simulate almost any set of (coupled) (partial) (stochastic) differential equations in any number of dimensions.  It can input and output data in a range of data formats, produce programs that can take command-line arguments, and produce parallelised code suitable for either modern computer architectures or distributed clusters.</p>
-<p>If this is your first time with XMDS, then an ideal place to start is the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a>, where we will show you how to write a basic simulation.  <a class="reference internal" href="installation.html#installation"><em>Installation</em></a> instructions should get you up and running and able to start playing with the large library of examples provided. The impatient will probably have good luck bro [...]
-<p>If you are upgrading from <strong>XMDS version 1.x</strong>, then after following the installation instructions (<a class="reference internal" href="installation.html#installation"><em>Installation</em></a>), you might want to have a quick read of the note for upgraders (<a class="reference internal" href="upgrade.html#upgradefromxmds1"><em>Upgrading From XMDS 1.X</em></a>).  The syntax of the XML scripts has changed, but hopefully you will find the new scripts very intuitive.</p>
-<p>Detailed advice on input/output issues, and ways to code more complicated simulations can be found in <a class="reference internal" href="advanced_topics.html#advancedtopics"><em>Advanced Topics</em></a>.</p>
+<p>If this is your first time with XMDS, then an ideal place to start is the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a>, where we will show you how to write a basic simulation.  <a class="reference internal" href="installation.html#installation"><span>Installation</span></a> instructions should get you up and running and able to start playing with the large library of examples provided. The impatient will probably have good  [...]
+<p>If you are upgrading from <strong>XMDS version 1.x</strong>, then after following the installation instructions (<a class="reference internal" href="installation.html#installation"><span>Installation</span></a>), you might want to have a quick read of the note for upgraders (<a class="reference internal" href="upgrade.html#upgradefromxmds1"><span>Upgrading From XMDS 1.X</span></a>).  The syntax of the XML scripts has changed, but hopefully you will find the new scripts very intuitive.</p>
+<p>Detailed advice on input/output issues, and ways to code more complicated simulations can be found in <a class="reference internal" href="advanced_topics.html#advancedtopics"><span>Advanced Topics</span></a>.</p>
 <p>XMDS2 should be cited as <a class="reference external" href="http://dx.doi.org/10.1016/j.cpc.2012.08.016">Comput. Phys. Commun. 184, 201-208 (2013)</a>.</p>
-<p id="xmdshistory"><strong>History:</strong>   <strong>XMDS</strong> was created in 1997 by Peter Drummond and Greg Collecutt, who conceived of the idea of using an XML-based code generator to simplify the process of integrating systems of equations with arbitrary dimension <a class="footnote-reference" href="#f1" id="id1">[1]</a>.  The first version was written in C, and featured a very flexible, strongly convergent stochastic algorithm: the <a class="reference internal" href="referenc [...]
+<p id="xmdshistory"><strong>History:</strong>   <strong>XMDS</strong> was created in 1997 by Peter Drummond and Greg Collecutt, who conceived of the idea of using an XML-based code generator to simplify the process of integrating systems of equations with arbitrary dimension <a class="footnote-reference" href="#f1" id="id1">[1]</a>.  The first version was written in C, and featured a very flexible, strongly convergent stochastic algorithm: the <a class="reference internal" href="referenc [...]
 <p>In 2003, the increased scope of the package prompted a complete rewrite by Greg Collecutt (using C++), which lead to <strong>XMDS 1.0</strong>.  It was placed on sourceforge, and over a dozen developers contributed from 2003-2007 to help XMDS address a wider range of problems with a range of modern algorithms and support for parallel supercomputing.  The documentation and installation method was improved enabling the software to be used in a wider context, and XMDS gained many users f [...]
 <p>In 2008 a second complete rewrite was undertaken, largely by Graham Dennis (using Cheetah templates in python), leading to the current version <strong>XMDS2</strong>.  This restructuring of the internal treatment of XML elements and the generated code allowed a new range of extensions to be explored.  These included possibilities such as integrating multiple fields with different dimensionality, a more general set of differential equations that can be solved efficiently, and multiple  [...]
 <p class="rubric">Footnotes</p>
@@ -82,12 +82,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -104,7 +104,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -116,13 +116,13 @@
         <li class="right" >
           <a href="index.html" title="Welcome to XMDS2!"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/latex/Makefile b/documentation/latex/Makefile
index 6b87ad8..5e6030c 100644
--- a/documentation/latex/Makefile
+++ b/documentation/latex/Makefile
@@ -9,6 +9,10 @@ ARCHIVEPRREFIX =
 # Additional LaTeX options
 LATEXOPTS =
 
+LATEX = latex
+PDFLATEX = pdflatex
+MAKEINDEX = makeindex
+
 all: $(ALLPDF)
 all-pdf: $(ALLPDF)
 all-dvi: $(ALLDVI)
@@ -43,20 +47,20 @@ bz2: tar
 # The number of LaTeX runs is quite conservative, but I don't expect it
 # to get run often, so the little extra time won't hurt.
 %.dvi: %.tex
-	latex $(LATEXOPTS) '$<'
-	latex $(LATEXOPTS) '$<'
-	latex $(LATEXOPTS) '$<'
-	-makeindex -s python.ist '$(basename $<).idx'
-	latex $(LATEXOPTS) '$<'
-	latex $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
+	-$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+	$(LATEX) $(LATEXOPTS) '$<'
+	$(LATEX) $(LATEXOPTS) '$<'
 
 %.pdf: %.tex
-	pdflatex $(LATEXOPTS) '$<'
-	pdflatex $(LATEXOPTS) '$<'
-	pdflatex $(LATEXOPTS) '$<'
-	-makeindex -s python.ist '$(basename $<).idx'
-	pdflatex $(LATEXOPTS) '$<'
-	pdflatex $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	-$(MAKEINDEX) -s python.ist '$(basename $<).idx'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
+	$(PDFLATEX) $(LATEXOPTS) '$<'
 
 clean:
 	rm -f *.dvi *.log *.ind *.aux *.toc *.syn *.idx *.out *.ilg *.pla
diff --git a/documentation/latex/xmds2.aux b/documentation/latex/xmds2.aux
index f498904..4c2dd6f 100644
--- a/documentation/latex/xmds2.aux
+++ b/documentation/latex/xmds2.aux
@@ -24,6 +24,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {1}Introduction}{1}{chapter.1}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{introduction:introduction}{{1}{1}{Introduction}{chapter.1}{}}
 \newlabel{introduction:documentation}{{1}{1}{Introduction}{chapter.1}{}}
 \newlabel{introduction::doc}{{1}{1}{Introduction}{chapter.1}{}}
@@ -32,6 +33,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {2}Installation}{3}{chapter.2}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{installation:installation}{{2}{3}{Installation}{chapter.2}{}}
 \newlabel{installation:index-0}{{2}{3}{Installation}{chapter.2}{}}
 \newlabel{installation::doc}{{2}{3}{Installation}{chapter.2}{}}
@@ -58,6 +60,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {3}Quickstart Tutorial}{9}{chapter.3}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{tutorial:index-0}{{3}{9}{Quickstart Tutorial}{chapter.3}{}}
 \newlabel{tutorial::doc}{{3}{9}{Quickstart Tutorial}{chapter.3}{}}
 \newlabel{tutorial:quickstart-tutorial}{{3}{9}{Quickstart Tutorial}{chapter.3}{}}
@@ -65,6 +68,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {4}Worked Examples}{15}{chapter.4}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{worked_examples:index-0}{{4}{15}{Worked Examples}{chapter.4}{}}
 \newlabel{worked_examples:worked-examples}{{4}{15}{Worked Examples}{chapter.4}{}}
 \newlabel{worked_examples::doc}{{4}{15}{Worked Examples}{chapter.4}{}}
@@ -82,7 +86,7 @@
 \newlabel{worked_examples:fibre-noise}{{4.3}{21}{Fibre Noise}{section.4.3}{}}
 \newlabel{worked_examples:index-5}{{4.3}{21}{Fibre Noise}{section.4.3}{}}
 \@writefile{lof}{\contentsline {figure}{\numberline {4.1}{\ignorespaces The mean value of the real and imaginary components of the z variable for a single path of the simulation.}}{22}{figure.4.1}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation. It agrees within the standard error with the expected result of $\qopname  \relax o{exp}(-t/2)$.}}{22}{figure.4.2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.2}{\ignorespaces The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation. It agrees within the standard error with the expected result of \(\qopname  \relax o{exp}(-t/2)\).}}{22}{figure.4.2}}
 \@writefile{lof}{\contentsline {figure}{\numberline {4.3}{\ignorespaces The momentum space density of the field as a function of time for a single path realisation.}}{25}{figure.4.3}}
 \@writefile{toc}{\contentsline {section}{\numberline {4.4}Integer Dimensions}{25}{section.4.4}}
 \newlabel{worked_examples:integer-dimensions}{{4.4}{25}{Integer Dimensions}{section.4.4}{}}
@@ -95,17 +99,18 @@
 \@writefile{toc}{\contentsline {section}{\numberline {4.6}Finding the Ground State of a BEC (continuous renormalisation)}{31}{section.4.6}}
 \newlabel{worked_examples:groundstatebec}{{4.6}{31}{Finding the Ground State of a BEC (continuous renormalisation)}{section.4.6}{}}
 \newlabel{worked_examples:finding-the-ground-state-of-a-bec-continuous-renormalisation}{{4.6}{31}{Finding the Ground State of a BEC (continuous renormalisation)}{section.4.6}{}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces The shape of the ground state rapidly approaches the lowest eigenstate. For weak nonlinearities, it is nearly Gaussian.}}{35}{figure.4.5}}
 \@writefile{toc}{\contentsline {section}{\numberline {4.7}Finding the Ground State of a BEC again}{35}{section.4.7}}
 \newlabel{worked_examples:finding-the-ground-state-of-a-bec-again}{{4.7}{35}{Finding the Ground State of a BEC again}{section.4.7}{}}
 \newlabel{worked_examples:hermitegaussgroundstatebec}{{4.7}{35}{Finding the Ground State of a BEC again}{section.4.7}{}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.5}{\ignorespaces The shape of the ground state rapidly approaches the lowest eigenstate. For weak nonlinearities, it is nearly Gaussian.}}{36}{figure.4.5}}
-\@writefile{lof}{\contentsline {figure}{\numberline {4.6}{\ignorespaces When the nonlinear term is larger ($U=20$), the ground state is wider and more parabolic.}}{37}{figure.4.6}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4.6}{\ignorespaces When the nonlinear term is larger (\(U=20\)), the ground state is wider and more parabolic.}}{36}{figure.4.6}}
 \@writefile{toc}{\contentsline {section}{\numberline {4.8}Multi-component Schr\IeC {\"o}dinger equation}{39}{section.4.8}}
 \newlabel{worked_examples:dmultistatese}{{4.8}{39}{Multi-component Schrödinger equation}{section.4.8}{}}
 \newlabel{worked_examples:multi-component-schrodinger-equation}{{4.8}{39}{Multi-component Schrödinger equation}{section.4.8}{}}
 \@writefile{toc}{\contentsline {chapter}{\numberline {5}Reference section}{43}{chapter.5}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{reference_index:reference-section}{{5}{43}{Reference section}{chapter.5}{}}
 \newlabel{reference_index::doc}{{5}{43}{Reference section}{chapter.5}{}}
 \@writefile{toc}{\contentsline {section}{\numberline {5.1}Configuration, installation and runtime options}{43}{section.5.1}}
@@ -121,11 +126,11 @@
 \newlabel{reference_schema:index-0}{{5.3}{44}{XMDS2 XML Schema}{section.5.3}{}}
 \newlabel{reference_schema::doc}{{5.3}{44}{XMDS2 XML Schema}{section.5.3}{}}
 \newlabel{reference_schema:referenceschema}{{5.3}{44}{XMDS2 XML Schema}{section.5.3}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {5.4}XMDS2 script elements}{46}{section.5.4}}
-\newlabel{reference_elements:index-0}{{5.4}{46}{XMDS2 script elements}{section.5.4}{}}
-\newlabel{reference_elements:xmds2-script-elements}{{5.4}{46}{XMDS2 script elements}{section.5.4}{}}
-\newlabel{reference_elements::doc}{{5.4}{46}{XMDS2 script elements}{section.5.4}{}}
-\newlabel{reference_elements:referenceelements}{{5.4}{46}{XMDS2 script elements}{section.5.4}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {5.4}XMDS2 script elements}{47}{section.5.4}}
+\newlabel{reference_elements:index-0}{{5.4}{47}{XMDS2 script elements}{section.5.4}{}}
+\newlabel{reference_elements:xmds2-script-elements}{{5.4}{47}{XMDS2 script elements}{section.5.4}{}}
+\newlabel{reference_elements::doc}{{5.4}{47}{XMDS2 script elements}{section.5.4}{}}
+\newlabel{reference_elements:referenceelements}{{5.4}{47}{XMDS2 script elements}{section.5.4}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {5.4.1}Simulation element}{47}{subsection.5.4.1}}
 \newlabel{reference_elements:simulation-element}{{5.4.1}{47}{Simulation element}{subsection.5.4.1}{}}
 \newlabel{reference_elements:simulationelement}{{5.4.1}{47}{Simulation element}{subsection.5.4.1}{}}
@@ -138,14 +143,14 @@
 \newlabel{reference_elements:author-element}{{5.4.3}{47}{Author element}{subsection.5.4.3}{}}
 \newlabel{reference_elements:authorelement}{{5.4.3}{47}{Author element}{subsection.5.4.3}{}}
 \newlabel{reference_elements:index-3}{{5.4.3}{47}{Author element}{subsection.5.4.3}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.4}Description element}{47}{subsection.5.4.4}}
-\newlabel{reference_elements:index-4}{{5.4.4}{47}{Description element}{subsection.5.4.4}{}}
-\newlabel{reference_elements:descriptionelement}{{5.4.4}{47}{Description element}{subsection.5.4.4}{}}
-\newlabel{reference_elements:description-element}{{5.4.4}{47}{Description element}{subsection.5.4.4}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.5}Features Elements}{47}{subsection.5.4.5}}
-\newlabel{reference_elements:features-elements}{{5.4.5}{47}{Features Elements}{subsection.5.4.5}{}}
-\newlabel{reference_elements:featureselement}{{5.4.5}{47}{Features Elements}{subsection.5.4.5}{}}
-\newlabel{reference_elements:index-5}{{5.4.5}{47}{Features Elements}{subsection.5.4.5}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.4}Description element}{48}{subsection.5.4.4}}
+\newlabel{reference_elements:index-4}{{5.4.4}{48}{Description element}{subsection.5.4.4}{}}
+\newlabel{reference_elements:descriptionelement}{{5.4.4}{48}{Description element}{subsection.5.4.4}{}}
+\newlabel{reference_elements:description-element}{{5.4.4}{48}{Description element}{subsection.5.4.4}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.5}Features Elements}{48}{subsection.5.4.5}}
+\newlabel{reference_elements:features-elements}{{5.4.5}{48}{Features Elements}{subsection.5.4.5}{}}
+\newlabel{reference_elements:featureselement}{{5.4.5}{48}{Features Elements}{subsection.5.4.5}{}}
+\newlabel{reference_elements:index-5}{{5.4.5}{48}{Features Elements}{subsection.5.4.5}{}}
 \@writefile{toc}{\contentsline {subsubsection}{Arguments Element}{48}{subsubsection*.5}}
 \newlabel{reference_elements:index-6}{{5.4.5}{48}{Arguments Element}{subsubsection*.5}{}}
 \newlabel{reference_elements:argumentselement}{{5.4.5}{48}{Arguments Element}{subsubsection*.5}{}}
@@ -154,34 +159,34 @@
 \newlabel{reference_elements:argument-element}{{5.4.5}{49}{Argument element}{paragraph*.6}{}}
 \newlabel{reference_elements:index-7}{{5.4.5}{49}{Argument element}{paragraph*.6}{}}
 \newlabel{reference_elements:argumentelement}{{5.4.5}{49}{Argument element}{paragraph*.6}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Auto\_vectorise element}{49}{subsubsection*.7}}
-\newlabel{reference_elements:autovectorise}{{5.4.5}{49}{Auto\_vectorise element}{subsubsection*.7}{}}
-\newlabel{reference_elements:auto-vectorise-element}{{5.4.5}{49}{Auto\_vectorise element}{subsubsection*.7}{}}
-\newlabel{reference_elements:index-9}{{5.4.5}{49}{Auto\_vectorise element}{subsubsection*.7}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Benchmark}{49}{subsubsection*.8}}
-\newlabel{reference_elements:benchmark}{{5.4.5}{49}{Benchmark}{subsubsection*.8}{}}
-\newlabel{reference_elements:index-10}{{5.4.5}{49}{Benchmark}{subsubsection*.8}{}}
-\newlabel{reference_elements:id1}{{5.4.5}{49}{Benchmark}{subsubsection*.8}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Bing}{49}{subsubsection*.9}}
-\newlabel{reference_elements:bing}{{5.4.5}{49}{Bing}{subsubsection*.9}{}}
-\newlabel{reference_elements:id2}{{5.4.5}{49}{Bing}{subsubsection*.9}{}}
-\newlabel{reference_elements:index-11}{{5.4.5}{49}{Bing}{subsubsection*.9}{}}
-\@writefile{toc}{\contentsline {subsubsection}{C Flags}{49}{subsubsection*.10}}
-\newlabel{reference_elements:c-flags}{{5.4.5}{49}{C Flags}{subsubsection*.10}{}}
-\newlabel{reference_elements:index-12}{{5.4.5}{49}{C Flags}{subsubsection*.10}{}}
-\newlabel{reference_elements:cflags}{{5.4.5}{49}{C Flags}{subsubsection*.10}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Auto\_vectorise element}{50}{subsubsection*.7}}
+\newlabel{reference_elements:autovectorise}{{5.4.5}{50}{Auto\_vectorise element}{subsubsection*.7}{}}
+\newlabel{reference_elements:auto-vectorise-element}{{5.4.5}{50}{Auto\_vectorise element}{subsubsection*.7}{}}
+\newlabel{reference_elements:index-9}{{5.4.5}{50}{Auto\_vectorise element}{subsubsection*.7}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Benchmark}{50}{subsubsection*.8}}
+\newlabel{reference_elements:benchmark}{{5.4.5}{50}{Benchmark}{subsubsection*.8}{}}
+\newlabel{reference_elements:index-10}{{5.4.5}{50}{Benchmark}{subsubsection*.8}{}}
+\newlabel{reference_elements:id1}{{5.4.5}{50}{Benchmark}{subsubsection*.8}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Bing}{50}{subsubsection*.9}}
+\newlabel{reference_elements:bing}{{5.4.5}{50}{Bing}{subsubsection*.9}{}}
+\newlabel{reference_elements:id2}{{5.4.5}{50}{Bing}{subsubsection*.9}{}}
+\newlabel{reference_elements:index-11}{{5.4.5}{50}{Bing}{subsubsection*.9}{}}
+\@writefile{toc}{\contentsline {subsubsection}{C Flags}{50}{subsubsection*.10}}
+\newlabel{reference_elements:c-flags}{{5.4.5}{50}{C Flags}{subsubsection*.10}{}}
+\newlabel{reference_elements:index-12}{{5.4.5}{50}{C Flags}{subsubsection*.10}{}}
+\newlabel{reference_elements:cflags}{{5.4.5}{50}{C Flags}{subsubsection*.10}{}}
 \@writefile{toc}{\contentsline {subsubsection}{Chunked Output}{50}{subsubsection*.11}}
 \newlabel{reference_elements:chunked-output}{{5.4.5}{50}{Chunked Output}{subsubsection*.11}{}}
 \newlabel{reference_elements:index-13}{{5.4.5}{50}{Chunked Output}{subsubsection*.11}{}}
 \newlabel{reference_elements:chunkedoutput}{{5.4.5}{50}{Chunked Output}{subsubsection*.11}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Diagnostics}{50}{subsubsection*.12}}
-\newlabel{reference_elements:index-14}{{5.4.5}{50}{Diagnostics}{subsubsection*.12}{}}
-\newlabel{reference_elements:id3}{{5.4.5}{50}{Diagnostics}{subsubsection*.12}{}}
-\newlabel{reference_elements:diagnostics}{{5.4.5}{50}{Diagnostics}{subsubsection*.12}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Error Check}{50}{subsubsection*.13}}
-\newlabel{reference_elements:errorcheck}{{5.4.5}{50}{Error Check}{subsubsection*.13}{}}
-\newlabel{reference_elements:error-check}{{5.4.5}{50}{Error Check}{subsubsection*.13}{}}
-\newlabel{reference_elements:index-15}{{5.4.5}{50}{Error Check}{subsubsection*.13}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Diagnostics}{51}{subsubsection*.12}}
+\newlabel{reference_elements:index-14}{{5.4.5}{51}{Diagnostics}{subsubsection*.12}{}}
+\newlabel{reference_elements:id3}{{5.4.5}{51}{Diagnostics}{subsubsection*.12}{}}
+\newlabel{reference_elements:diagnostics}{{5.4.5}{51}{Diagnostics}{subsubsection*.12}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Error Check}{51}{subsubsection*.13}}
+\newlabel{reference_elements:errorcheck}{{5.4.5}{51}{Error Check}{subsubsection*.13}{}}
+\newlabel{reference_elements:error-check}{{5.4.5}{51}{Error Check}{subsubsection*.13}{}}
+\newlabel{reference_elements:index-15}{{5.4.5}{51}{Error Check}{subsubsection*.13}{}}
 \@writefile{toc}{\contentsline {subsubsection}{Halt\_Non\_Finite}{51}{subsubsection*.14}}
 \newlabel{reference_elements:index-16}{{5.4.5}{51}{Halt\_Non\_Finite}{subsubsection*.14}{}}
 \newlabel{reference_elements:halt-non-finite}{{5.4.5}{51}{Halt\_Non\_Finite}{subsubsection*.14}{}}
@@ -194,14 +199,14 @@
 \newlabel{reference_elements:id4}{{5.4.5}{51}{Globals}{subsubsection*.16}{}}
 \newlabel{reference_elements:globals}{{5.4.5}{51}{Globals}{subsubsection*.16}{}}
 \newlabel{reference_elements:index-19}{{5.4.5}{51}{Globals}{subsubsection*.16}{}}
-\@writefile{toc}{\contentsline {subsubsection}{OpenMP}{51}{subsubsection*.17}}
-\newlabel{reference_elements:openmp}{{5.4.5}{51}{OpenMP}{subsubsection*.17}{}}
-\newlabel{reference_elements:index-20}{{5.4.5}{51}{OpenMP}{subsubsection*.17}{}}
-\newlabel{reference_elements:id5}{{5.4.5}{51}{OpenMP}{subsubsection*.17}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Precision}{51}{subsubsection*.18}}
-\newlabel{reference_elements:id6}{{5.4.5}{51}{Precision}{subsubsection*.18}{}}
-\newlabel{reference_elements:index-21}{{5.4.5}{51}{Precision}{subsubsection*.18}{}}
-\newlabel{reference_elements:precision}{{5.4.5}{51}{Precision}{subsubsection*.18}{}}
+\@writefile{toc}{\contentsline {subsubsection}{OpenMP}{52}{subsubsection*.17}}
+\newlabel{reference_elements:openmp}{{5.4.5}{52}{OpenMP}{subsubsection*.17}{}}
+\newlabel{reference_elements:index-20}{{5.4.5}{52}{OpenMP}{subsubsection*.17}{}}
+\newlabel{reference_elements:id5}{{5.4.5}{52}{OpenMP}{subsubsection*.17}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Precision}{52}{subsubsection*.18}}
+\newlabel{reference_elements:id6}{{5.4.5}{52}{Precision}{subsubsection*.18}{}}
+\newlabel{reference_elements:index-21}{{5.4.5}{52}{Precision}{subsubsection*.18}{}}
+\newlabel{reference_elements:precision}{{5.4.5}{52}{Precision}{subsubsection*.18}{}}
 \@writefile{toc}{\contentsline {subsubsection}{Validation}{52}{subsubsection*.19}}
 \newlabel{reference_elements:index-22}{{5.4.5}{52}{Validation}{subsubsection*.19}{}}
 \newlabel{reference_elements:validation}{{5.4.5}{52}{Validation}{subsubsection*.19}{}}
@@ -209,18 +214,18 @@
 \@writefile{toc}{\contentsline {subsection}{\numberline {5.4.6}Driver Element}{53}{subsection.5.4.6}}
 \newlabel{reference_elements:driver-element}{{5.4.6}{53}{Driver Element}{subsection.5.4.6}{}}
 \newlabel{reference_elements:driverelement}{{5.4.6}{53}{Driver Element}{subsection.5.4.6}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.7}Geometry Element}{53}{subsection.5.4.7}}
-\newlabel{reference_elements:geometry-element}{{5.4.7}{53}{Geometry Element}{subsection.5.4.7}{}}
-\newlabel{reference_elements:index-24}{{5.4.7}{53}{Geometry Element}{subsection.5.4.7}{}}
-\newlabel{reference_elements:geometryelement}{{5.4.7}{53}{Geometry Element}{subsection.5.4.7}{}}
-\newlabel{reference_elements:propagationdimensionelement}{{5.4.7}{53}{Geometry Element}{section*.20}{}}
-\newlabel{reference_elements:transversedimensionselement}{{5.4.7}{53}{Geometry Element}{section*.21}{}}
-\newlabel{reference_elements:dimensionelement}{{5.4.7}{53}{Geometry Element}{section*.22}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.7}Geometry Element}{54}{subsection.5.4.7}}
+\newlabel{reference_elements:geometry-element}{{5.4.7}{54}{Geometry Element}{subsection.5.4.7}{}}
+\newlabel{reference_elements:index-24}{{5.4.7}{54}{Geometry Element}{subsection.5.4.7}{}}
+\newlabel{reference_elements:geometryelement}{{5.4.7}{54}{Geometry Element}{subsection.5.4.7}{}}
+\newlabel{reference_elements:propagationdimensionelement}{{5.4.7}{54}{Geometry Element}{section*.20}{}}
+\newlabel{reference_elements:transversedimensionselement}{{5.4.7}{54}{Geometry Element}{section*.21}{}}
+\newlabel{reference_elements:dimensionelement}{{5.4.7}{54}{Geometry Element}{section*.22}{}}
 \newlabel{reference_elements:transforms}{{5.4.7}{54}{Geometry Element}{section*.23}{}}
-\@writefile{toc}{\contentsline {subsubsection}{The ``dft'' transform}{54}{subsubsection*.24}}
-\newlabel{reference_elements:dft-transform}{{5.4.7}{54}{The ``dft'' transform}{subsubsection*.24}{}}
-\newlabel{reference_elements:the-dft-transform}{{5.4.7}{54}{The ``dft'' transform}{subsubsection*.24}{}}
-\newlabel{reference_elements:index-33}{{5.4.7}{54}{The ``dft'' transform}{subsubsection*.24}{}}
+\@writefile{toc}{\contentsline {subsubsection}{The ``dft'' transform}{55}{subsubsection*.24}}
+\newlabel{reference_elements:dft-transform}{{5.4.7}{55}{The ``dft'' transform}{subsubsection*.24}{}}
+\newlabel{reference_elements:the-dft-transform}{{5.4.7}{55}{The ``dft'' transform}{subsubsection*.24}{}}
+\newlabel{reference_elements:index-33}{{5.4.7}{55}{The ``dft'' transform}{subsubsection*.24}{}}
 \@writefile{toc}{\contentsline {subsubsection}{The ``dct'' transform}{55}{subsubsection*.25}}
 \newlabel{reference_elements:dct-transform}{{5.4.7}{55}{The ``dct'' transform}{subsubsection*.25}{}}
 \newlabel{reference_elements:the-dct-transform}{{5.4.7}{55}{The ``dct'' transform}{subsubsection*.25}{}}
@@ -294,7 +299,7 @@
 \newlabel{reference_elements:index-67}{{5.4.13}{66}{Integrate element}{subsection.5.4.13}{}}
 \newlabel{reference_elements:integrate-element}{{5.4.13}{66}{Integrate element}{subsection.5.4.13}{}}
 \newlabel{reference_elements:integrateelement}{{5.4.13}{66}{Integrate element}{subsection.5.4.13}{}}
-\newlabel{reference_elements:sampleselement}{{5.4.13}{66}{Integrate element}{section*.41}{}}
+\newlabel{reference_elements:sampleselement}{{5.4.13}{67}{Integrate element}{section*.41}{}}
 \@writefile{toc}{\contentsline {subsubsection}{Operators and operator elements}{67}{subsubsection*.42}}
 \newlabel{reference_elements:operatorselement}{{5.4.13}{67}{Operators and operator elements}{subsubsection*.42}{}}
 \newlabel{reference_elements:index-70}{{5.4.13}{67}{Operators and operator elements}{subsubsection*.42}{}}
@@ -306,10 +311,10 @@
 \@writefile{toc}{\contentsline {subsubsection}{Algorithms}{69}{subsubsection*.47}}
 \newlabel{reference_elements:algorithms}{{5.4.13}{69}{Algorithms}{subsubsection*.47}{}}
 \newlabel{reference_elements:id8}{{5.4.13}{69}{Algorithms}{subsubsection*.47}{}}
-\@writefile{toc}{\contentsline {paragraph}{SI and SIC algorithms}{69}{paragraph*.48}}
-\newlabel{reference_elements:si}{{5.4.13}{69}{SI and SIC algorithms}{paragraph*.48}{}}
-\newlabel{reference_elements:index-82}{{5.4.13}{69}{SI and SIC algorithms}{paragraph*.48}{}}
-\newlabel{reference_elements:si-and-sic-algorithms}{{5.4.13}{69}{SI and SIC algorithms}{paragraph*.48}{}}
+\@writefile{toc}{\contentsline {paragraph}{SI and SIC algorithms}{70}{paragraph*.48}}
+\newlabel{reference_elements:si}{{5.4.13}{70}{SI and SIC algorithms}{paragraph*.48}{}}
+\newlabel{reference_elements:index-82}{{5.4.13}{70}{SI and SIC algorithms}{paragraph*.48}{}}
+\newlabel{reference_elements:si-and-sic-algorithms}{{5.4.13}{70}{SI and SIC algorithms}{paragraph*.48}{}}
 \@writefile{toc}{\contentsline {paragraph}{Runge-Kutta algorithms}{70}{paragraph*.49}}
 \newlabel{reference_elements:rk4}{{5.4.13}{70}{Runge-Kutta algorithms}{paragraph*.49}{}}
 \newlabel{reference_elements:runge-kutta-algorithms}{{5.4.13}{70}{Runge-Kutta algorithms}{paragraph*.49}{}}
@@ -357,6 +362,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {6}Advanced Topics}{77}{chapter.6}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{advanced_topics:advancedtopics}{{6}{77}{Advanced Topics}{chapter.6}{}}
 \newlabel{advanced_topics:advanced-topics}{{6}{77}{Advanced Topics}{chapter.6}{}}
 \newlabel{advanced_topics:index-0}{{6}{77}{Advanced Topics}{chapter.6}{}}
@@ -386,6 +392,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {7}Frequently Asked Questions}{83}{chapter.7}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{faq:index-0}{{7}{83}{Frequently Asked Questions}{chapter.7}{}}
 \newlabel{faq:faq}{{7}{83}{Frequently Asked Questions}{chapter.7}{}}
 \newlabel{faq::doc}{{7}{83}{Frequently Asked Questions}{chapter.7}{}}
@@ -414,12 +421,14 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {8}Upgrading From XMDS 1.X}{85}{chapter.8}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{upgrade:upgradefromxmds1}{{8}{85}{Upgrading From XMDS 1.X}{chapter.8}{}}
 \newlabel{upgrade::doc}{{8}{85}{Upgrading From XMDS 1.X}{chapter.8}{}}
 \newlabel{upgrade:upgrading-from-xmds-1-x}{{8}{85}{Upgrading From XMDS 1.X}{chapter.8}{}}
 \@writefile{toc}{\contentsline {chapter}{\numberline {9}Optimisation Hints}{87}{chapter.9}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{optimisation_hints:optimisationhints}{{9}{87}{Optimisation Hints}{chapter.9}{}}
 \newlabel{optimisation_hints::doc}{{9}{87}{Optimisation Hints}{chapter.9}{}}
 \newlabel{optimisation_hints:optimisation-hints}{{9}{87}{Optimisation Hints}{chapter.9}{}}
@@ -448,8 +457,8 @@
 \newlabel{optimisation_hints:auto-vectorisation}{{9.3.3}{90}{Auto-vectorisation}{subsection.9.3.3}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {9.3.4}OpenMP}{90}{subsection.9.3.4}}
 \newlabel{optimisation_hints:openmp}{{9.3.4}{90}{OpenMP}{subsection.9.3.4}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {9.3.5}Parallelisation with MPI}{91}{subsection.9.3.5}}
-\newlabel{optimisation_hints:parallelisation-with-mpi}{{9.3.5}{91}{Parallelisation with MPI}{subsection.9.3.5}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {9.3.5}Parallelisation with MPI}{90}{subsection.9.3.5}}
+\newlabel{optimisation_hints:parallelisation-with-mpi}{{9.3.5}{90}{Parallelisation with MPI}{subsection.9.3.5}{}}
 \@writefile{toc}{\contentsline {section}{\numberline {9.4}Atom-optics-specific hints}{91}{section.9.4}}
 \newlabel{optimisation_hints:atom-optics-specific-hints}{{9.4}{91}{Atom-optics-specific hints}{section.9.4}{}}
 \@writefile{toc}{\contentsline {subsection}{\numberline {9.4.1}Separate out imaginary-time calculation code}{91}{subsection.9.4.1}}
@@ -459,6 +468,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {10}xsil2graphics2}{93}{chapter.10}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{xsil2graphics2:index-0}{{10}{93}{xsil2graphics2}{chapter.10}{}}
 \newlabel{xsil2graphics2:xsil2graphics2}{{10}{93}{xsil2graphics2}{chapter.10}{}}
 \newlabel{xsil2graphics2::doc}{{10}{93}{xsil2graphics2}{chapter.10}{}}
@@ -466,6 +476,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {11}Developer Documentation}{95}{chapter.11}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{developer:developer-documentation}{{11}{95}{Developer Documentation}{chapter.11}{}}
 \newlabel{developer:developerdocumentation}{{11}{95}{Developer Documentation}{chapter.11}{}}
 \newlabel{developer::doc}{{11}{95}{Developer Documentation}{chapter.11}{}}
@@ -524,6 +535,7 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {12}Licensing}{115}{chapter.12}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{licensing:index-0}{{12}{115}{Licensing}{chapter.12}{}}
 \newlabel{licensing::doc}{{12}{115}{Licensing}{chapter.12}{}}
 \newlabel{licensing:licensing}{{12}{115}{Licensing}{chapter.12}{}}
@@ -537,22 +549,27 @@
 \@writefile{toc}{\contentsline {chapter}{\numberline {13}News}{125}{chapter.13}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
+\@writefile{loliteral-block}{\addvspace {10\p@ }}
 \newlabel{news:news}{{13}{125}{News}{chapter.13}{}}
 \newlabel{news:index-0}{{13}{125}{News}{chapter.13}{}}
 \newlabel{news::doc}{{13}{125}{News}{chapter.13}{}}
 \newlabel{news:id1}{{13}{125}{News}{chapter.13}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.1}XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{125}{section.13.1}}
-\newlabel{news:xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014}{{13.1}{125}{XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{section.13.1}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.2}XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{125}{section.13.2}}
-\newlabel{news:xmds-2-2-0-out-of-cheese-error-january-13-2014}{{13.2}{125}{XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{section.13.2}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.3}XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{126}{section.13.3}}
-\newlabel{news:xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013}{{13.3}{126}{XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{section.13.3}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.4}XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{126}{section.13.4}}
-\newlabel{news:xmds-2-1-3-happy-mollusc-june-7-2013}{{13.4}{126}{XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{section.13.4}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.5}XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{126}{section.13.5}}
-\newlabel{news:xmds-2-1-2-happy-mollusc-october-15-2012}{{13.5}{126}{XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{section.13.5}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.6}XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{127}{section.13.6}}
-\newlabel{news:xmds-2-1-happy-mollusc-june-14-2012}{{13.6}{127}{XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{section.13.6}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {13.7}XMDS 2.0 ``Shiny!'' (September 13, 2010)}{127}{section.13.7}}
-\newlabel{news:xmds-2-0-shiny-september-13-2010}{{13.7}{127}{XMDS 2.0 ``Shiny!'' (September 13, 2010)}{section.13.7}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.1}XMDS 2.2.3 ``It came from the deep'' (January 20, 2017)}{125}{section.13.1}}
+\newlabel{news:xmds-2-2-3-it-came-from-the-deep-january-20-2017}{{13.1}{125}{XMDS 2.2.3 ``It came from the deep'' (January 20, 2017)}{section.13.1}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.2}XMDS 2.2.2 ``XMDS2 is a game of two halves'' (October 13, 2014)}{125}{section.13.2}}
+\newlabel{news:xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014}{{13.2}{125}{XMDS 2.2.2 ``XMDS2 is a game of two halves'' (October 13, 2014)}{section.13.2}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.3}XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{125}{section.13.3}}
+\newlabel{news:xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014}{{13.3}{125}{XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{section.13.3}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.4}XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{125}{section.13.4}}
+\newlabel{news:xmds-2-2-0-out-of-cheese-error-january-13-2014}{{13.4}{125}{XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{section.13.4}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.5}XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{126}{section.13.5}}
+\newlabel{news:xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013}{{13.5}{126}{XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{section.13.5}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.6}XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{126}{section.13.6}}
+\newlabel{news:xmds-2-1-3-happy-mollusc-june-7-2013}{{13.6}{126}{XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{section.13.6}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.7}XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{126}{section.13.7}}
+\newlabel{news:xmds-2-1-2-happy-mollusc-october-15-2012}{{13.7}{126}{XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{section.13.7}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.8}XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{127}{section.13.8}}
+\newlabel{news:xmds-2-1-happy-mollusc-june-14-2012}{{13.8}{127}{XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{section.13.8}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {13.9}XMDS 2.0 ``Shiny!'' (September 13, 2010)}{128}{section.13.9}}
+\newlabel{news:xmds-2-0-shiny-september-13-2010}{{13.9}{128}{XMDS 2.0 ``Shiny!'' (September 13, 2010)}{section.13.9}{}}
 \@writefile{toc}{\contentsline {chapter}{Index}{129}{section*.55}}
diff --git a/documentation/latex/xmds2.idx b/documentation/latex/xmds2.idx
index 30224f5..71b87ac 100644
--- a/documentation/latex/xmds2.idx
+++ b/documentation/latex/xmds2.idx
@@ -18,39 +18,39 @@
 \indexentry{Driver examples!distributed-mpi|hyperpage}{30}
 \indexentry{Command line arguments|hyperpage}{30}
 \indexentry{\_SAMPLE\_COMPLEX|hyperpage}{31}
-\indexentry{Computed vectors|hyperpage}{34}
-\indexentry{Aliases|hyperpage}{41}
+\indexentry{Computed vectors|hyperpage}{33}
+\indexentry{Aliases|hyperpage}{40}
 \indexentry{XMDS2 XML schema|hyperpage}{44}
 \indexentry{XML schema|hyperpage}{44}
-\indexentry{Reference|hyperpage}{46}
-\indexentry{XML Elements|hyperpage}{46}
-\indexentry{Script elements|hyperpage}{46}
+\indexentry{Reference|hyperpage}{47}
+\indexentry{XML Elements|hyperpage}{47}
+\indexentry{Script elements|hyperpage}{47}
 \indexentry{XML elements!simulation|hyperpage}{47}
 \indexentry{XML elements!name (of simulation)|hyperpage}{47}
 \indexentry{XML elements!author|hyperpage}{47}
 \indexentry{XML elements!description|hyperpage}{47}
-\indexentry{XML elements!features|hyperpage}{47}
+\indexentry{XML elements!features|hyperpage}{48}
 \indexentry{XML elements!arguments|hyperpage}{48}
 \indexentry{XML elements!argument|hyperpage}{49}
 \indexentry{XML element attributes!name|hyperpage}{49}
 \indexentry{XML element attributes!type|hyperpage}{49}
 \indexentry{XML element attributes!default\_value|hyperpage}{49}
 \indexentry{XML elements!autovectorise|hyperpage}{49}
-\indexentry{XML elements!benchmark|hyperpage}{49}
-\indexentry{XML elements!bing|hyperpage}{49}
-\indexentry{XML elements!cflags|hyperpage}{49}
+\indexentry{XML elements!benchmark|hyperpage}{50}
+\indexentry{XML elements!bing|hyperpage}{50}
+\indexentry{XML elements!cflags|hyperpage}{50}
 \indexentry{XML elements!chunked\_output|hyperpage}{50}
 \indexentry{XML elements!diagnostics|hyperpage}{50}
-\indexentry{XML elements!error\_check|hyperpage}{50}
-\indexentry{XML elements!halt\_non\_finite|hyperpage}{50}
+\indexentry{XML elements!error\_check|hyperpage}{51}
+\indexentry{XML elements!halt\_non\_finite|hyperpage}{51}
 \indexentry{XML elements!fftw|hyperpage}{51}
 \indexentry{XML element attributes!plan|hyperpage}{51}
 \indexentry{XML elements!globals|hyperpage}{51}
-\indexentry{XML elements!openmp|hyperpage}{51}
-\indexentry{Single precision|hyperpage}{51}
-\indexentry{Double precision|hyperpage}{51}
-\indexentry{Precision|hyperpage}{51}
-\indexentry{XML elements!precision|hyperpage}{51}
+\indexentry{XML elements!openmp|hyperpage}{52}
+\indexentry{Single precision|hyperpage}{52}
+\indexentry{Double precision|hyperpage}{52}
+\indexentry{Precision|hyperpage}{52}
+\indexentry{XML elements!precision|hyperpage}{52}
 \indexentry{XML elements!validation|hyperpage}{52}
 \indexentry{XML element attributes!kind|hyperpage}{52}
 \indexentry{XML elements!driver|hyperpage}{53}
@@ -59,27 +59,27 @@
 \indexentry{Drivers!multi-path"|hyperpage}{53}
 \indexentry{Drivers!mpi-multi-path"|hyperpage}{53}
 \indexentry{Drivers!adaptive-mpi-multi-path"|hyperpage}{53}
-\indexentry{XML elements!geometry|hyperpage}{53}
-\indexentry{XML elements!propagation\_dimension|hyperpage}{53}
-\indexentry{XML elements!transverse\_dimensions|hyperpage}{53}
-\indexentry{XML elements!dimension|hyperpage}{53}
-\indexentry{XML element attributes!name (dimension)|hyperpage}{53}
-\indexentry{XML element attributes!type (dimension)|hyperpage}{53}
-\indexentry{XML element attributes!lattice|hyperpage}{53}
-\indexentry{XML element attributes!domain|hyperpage}{53}
-\indexentry{Aliases|hyperpage}{53}
-\indexentry{XML element attributes!aliases|hyperpage}{53}
-\indexentry{Vectors!non-local access|hyperpage}{53}
+\indexentry{XML elements!geometry|hyperpage}{54}
+\indexentry{XML elements!propagation\_dimension|hyperpage}{54}
+\indexentry{XML elements!transverse\_dimensions|hyperpage}{54}
+\indexentry{XML elements!dimension|hyperpage}{54}
+\indexentry{XML element attributes!name (dimension)|hyperpage}{54}
+\indexentry{XML element attributes!type (dimension)|hyperpage}{54}
+\indexentry{XML element attributes!lattice|hyperpage}{54}
+\indexentry{XML element attributes!domain|hyperpage}{54}
+\indexentry{Aliases|hyperpage}{54}
+\indexentry{XML element attributes!aliases|hyperpage}{54}
+\indexentry{Vectors!non-local access|hyperpage}{54}
 \indexentry{XML element attributes!volume\_prefactor|hyperpage}{54}
 \indexentry{XML element attributes!transform|hyperpage}{54}
 \indexentry{Aliases|hyperpage}{54}
-\indexentry{Transforms!dft|hyperpage}{54}
-\indexentry{Boundary conditions (DFT)|hyperpage}{54}
+\indexentry{Transforms!dft|hyperpage}{55}
+\indexentry{Boundary conditions (DFT)|hyperpage}{55}
 \indexentry{Transforms!dct|hyperpage}{55}
 \indexentry{Boundary conditions (DCT)|hyperpage}{55}
 \indexentry{Transforms!dst|hyperpage}{56}
 \indexentry{Boundary conditions (DST)|hyperpage}{56}
-\indexentry{Transforms!bessel|hyperpage}{56}
+\indexentry{Transforms!bessel|hyperpage}{57}
 \indexentry{Boundary conditions (Bessel)|hyperpage}{57}
 \indexentry{Boundary conditions|hyperpage}{57}
 \indexentry{Transforms!spherical-bessel|hyperpage}{58}
@@ -89,7 +89,7 @@
 \indexentry{XML element attributes!name (vector)|hyperpage}{59}
 \indexentry{XML element attributes!type (vector)|hyperpage}{59}
 \indexentry{XML elements!components|hyperpage}{59}
-\indexentry{XML element attributes!initial\_basis (vector)|hyperpage}{60}
+\indexentry{XML element attributes!initial\_basis (vector)|hyperpage}{59}
 \indexentry{XML elements!initialisation|hyperpage}{60}
 \indexentry{XML element attributes!name (vector)|hyperpage}{60}
 \indexentry{Vectors!non-local access|hyperpage}{60}
@@ -128,11 +128,11 @@
 \indexentry{XML element attributes!steps|hyperpage}{66}
 \indexentry{XML element attributes!tolerance|hyperpage}{66}
 \indexentry{Integration algorithms!all|hyperpage}{66}
-\indexentry{XML elements!samples|hyperpage}{66}
+\indexentry{XML elements!samples|hyperpage}{67}
 \indexentry{Operators|hyperpage}{67}
 \indexentry{XML elements!operators|hyperpage}{67}
 \indexentry{XML elements!integration\_vectors|hyperpage}{67}
-\indexentry{Vectors!non-local access|hyperpage}{67}
+\indexentry{Vectors!non-local access|hyperpage}{68}
 \indexentry{XML elements!operator|hyperpage}{68}
 \indexentry{XML element attributes!kind (operator)|hyperpage}{68}
 \indexentry{Operators!IP|hyperpage}{68}
@@ -141,7 +141,7 @@
 \indexentry{EX operators|hyperpage}{68}
 \indexentry{XML element attributes!constant|hyperpage}{68}
 \indexentry{Cross-propagation|hyperpage}{68}
-\indexentry{XML element attributes!cross-propagation|hyperpage}{68}
+\indexentry{XML element attributes!cross-propagation|hyperpage}{69}
 \indexentry{XML elements!boundary\_conditions|hyperpage}{69}
 \indexentry{XML element attributes!kind (boundary\_condition element)|hyperpage}{69}
 \indexentry{Boundary conditions|hyperpage}{69}
@@ -167,7 +167,7 @@
 \indexentry{\_max|hyperpage}{73}
 \indexentry{\_dx|hyperpage}{73}
 \indexentry{XML element attributes!basis (sampling\_group element)|hyperpage}{73}
-\indexentry{Modified midpoint method|hyperpage}{73}
+\indexentry{Modified midpoint method|hyperpage}{74}
 \indexentry{Bulirsch-Stoer algorithm|hyperpage}{74}
 \indexentry{Bulirsch-Stoer error scaling|hyperpage}{75}
 \indexentry{Advanced topics|hyperpage}{76}
diff --git a/documentation/latex/xmds2.ilg b/documentation/latex/xmds2.ilg
index 3b78133..d8017f9 100644
--- a/documentation/latex/xmds2.ilg
+++ b/documentation/latex/xmds2.ilg
@@ -1,7 +1,7 @@
-This is makeindex, version 2.15 [TeX Live 2012] (kpathsea + Thai support).
+This is makeindex, version 2.15 [TeX Live 2015] (kpathsea + Thai support).
 Scanning style file ./python.ist......done (6 attributes redefined, 0 ignored).
 Scanning input file xmds2.idx....done (196 entries accepted, 0 rejected).
-Sorting entries.....done (1561 comparisons).
+Sorting entries.....done (1560 comparisons).
 Generating output file xmds2.ind....done (257 lines written, 0 warnings).
 Output written in xmds2.ind.
 Transcript written in xmds2.ilg.
diff --git a/documentation/latex/xmds2.ind b/documentation/latex/xmds2.ind
index 15e132d..6296d6a 100644
--- a/documentation/latex/xmds2.ind
+++ b/documentation/latex/xmds2.ind
@@ -12,14 +12,14 @@
   \bigletter A
   \item Adding an integrator, \hyperpage{99}
   \item Advanced topics, \hyperpage{76}
-  \item Aliases, \hyperpage{41}, \hyperpage{53, 54}
+  \item Aliases, \hyperpage{40}, \hyperpage{54}
 
   \indexspace
   \bigletter B
   \item Boundary conditions, \hyperpage{57}, \hyperpage{69}
   \item Boundary conditions (Bessel), \hyperpage{57}
   \item Boundary conditions (DCT), \hyperpage{55}
-  \item Boundary conditions (DFT), \hyperpage{54}
+  \item Boundary conditions (DFT), \hyperpage{55}
   \item Boundary conditions (DST), \hyperpage{56}
   \item Bug reports, \hyperpage{83}
   \item Bulirsch-Stoer algorithm, \hyperpage{74}
@@ -29,7 +29,7 @@
   \bigletter C
   \item Citing XMDS2, \hyperpage{83}
   \item Command line arguments, \hyperpage{30}
-  \item Computed vectors, \hyperpage{34}
+  \item Computed vectors, \hyperpage{33}
   \item Convolutions and Fourier transforms, \hyperpage{79}
   \item Cross-propagation, \hyperpage{68}
 
@@ -38,7 +38,7 @@
   \item Dimension aliases, \hyperpage{82}
   \item Distributed MPI, \hyperpage{30}
   \item Documentation format, \hyperpage{96}
-  \item Double precision, \hyperpage{51}
+  \item Double precision, \hyperpage{52}
   \item Driver examples
     \subitem distributed-mpi, \hyperpage{30}
     \subitem mpi-multi-path, \hyperpage{24}
@@ -95,7 +95,7 @@
 
   \indexspace
   \bigletter M
-  \item Modified midpoint method, \hyperpage{73}
+  \item Modified midpoint method, \hyperpage{74}
   \item MPI, \hyperpage{30}
     \subitem non-local vector access, \hyperpage{60}
   \item Multi-path MPI, \hyperpage{24}
@@ -120,26 +120,26 @@
 
   \indexspace
   \bigletter P
-  \item Precision, \hyperpage{51}
+  \item Precision, \hyperpage{52}
 
   \indexspace
   \bigletter R
-  \item Reference, \hyperpage{46}
+  \item Reference, \hyperpage{47}
 
   \indexspace
   \bigletter S
   \item Sampling, \hyperpage{72}
-  \item Script elements, \hyperpage{46}
-  \item Single precision, \hyperpage{51}
+  \item Script elements, \hyperpage{47}
+  \item Single precision, \hyperpage{52}
 
   \indexspace
   \bigletter T
   \item Test scripts, \hyperpage{95}
   \item Time dependence in vectors, \hyperpage{83}
   \item Transforms
-    \subitem bessel, \hyperpage{56}
+    \subitem bessel, \hyperpage{57}
     \subitem dct, \hyperpage{55}
-    \subitem dft, \hyperpage{54}
+    \subitem dft, \hyperpage{55}
     \subitem dst, \hyperpage{56}
     \subitem hermite-gauss, \hyperpage{58}
     \subitem spherical-bessel, \hyperpage{58}
@@ -148,7 +148,7 @@
   \indexspace
   \bigletter V
   \item Vectors
-    \subitem non-local access, \hyperpage{53}, \hyperpage{60}, \hyperpage{67}
+    \subitem non-local access, \hyperpage{54}, \hyperpage{60}, \hyperpage{68}
 
   \indexspace
   \bigletter X
@@ -157,23 +157,23 @@
   \item XMDS2 XML schema, \hyperpage{44}
   \item XML element attributes
     \subitem algorithm, \hyperpage{66}
-    \subitem aliases, \hyperpage{53}
+    \subitem aliases, \hyperpage{54}
     \subitem basis (dependencies element), \hyperpage{61}
     \subitem basis (sampling\_group element), \hyperpage{72, 73}
     \subitem constant, \hyperpage{68}
-    \subitem cross-propagation, \hyperpage{68}
+    \subitem cross-propagation, \hyperpage{69}
     \subitem cycles, \hyperpage{65}
     \subitem default\_value, \hyperpage{49}
     \subitem dimensions (computed vector), \hyperpage{62}
     \subitem dimensions (noise vector), \hyperpage{63}
-    \subitem domain, \hyperpage{53}
+    \subitem domain, \hyperpage{54}
     \subitem filename (breakpoint element), \hyperpage{72}
     \subitem filename (output element), \hyperpage{72}
     \subitem format (breakpoint element), \hyperpage{72}
     \subitem format (output element), \hyperpage{72}
     \subitem geometry\_matching\_mode, \hyperpage{60}
     \subitem initial\_basis (noise vector), \hyperpage{63}
-    \subitem initial\_basis (vector), \hyperpage{60}
+    \subitem initial\_basis (vector), \hyperpage{59}
     \subitem initial\_sample, \hyperpage{72}
     \subitem interval, \hyperpage{66}
     \subitem kind, \hyperpage{52}
@@ -181,12 +181,12 @@
     \subitem kind (initialisation element), \hyperpage{60}
     \subitem kind (noise vector), \hyperpage{63}
     \subitem kind (operator), \hyperpage{68}
-    \subitem lattice, \hyperpage{53}
+    \subitem lattice, \hyperpage{54}
     \subitem length\_scale, \hyperpage{59}
     \subitem method, \hyperpage{63}
     \subitem name, \hyperpage{49}
     \subitem name (computed vector), \hyperpage{62}
-    \subitem name (dimension), \hyperpage{53}
+    \subitem name (dimension), \hyperpage{54}
     \subitem name (driver), \hyperpage{53}
     \subitem name (filter), \hyperpage{66}
     \subitem name (noise vector), \hyperpage{63}
@@ -198,56 +198,56 @@
     \subitem transform, \hyperpage{54}
     \subitem type, \hyperpage{49}
     \subitem type (computed vector), \hyperpage{62}
-    \subitem type (dimension), \hyperpage{53}
+    \subitem type (dimension), \hyperpage{54}
     \subitem type (noise vector), \hyperpage{63}
     \subitem type (vector), \hyperpage{59}
     \subitem volume\_prefactor, \hyperpage{54}
     \subitem where, \hyperpage{71}
-  \item XML Elements, \hyperpage{46}
+  \item XML Elements, \hyperpage{47}
   \item XML elements
     \subitem argument, \hyperpage{49}
     \subitem arguments, \hyperpage{48}
     \subitem author, \hyperpage{47}
     \subitem autovectorise, \hyperpage{49}
-    \subitem benchmark, \hyperpage{49}
-    \subitem bing, \hyperpage{49}
+    \subitem benchmark, \hyperpage{50}
+    \subitem bing, \hyperpage{50}
     \subitem boundary\_conditions, \hyperpage{69}
     \subitem breakpoint, \hyperpage{72}
-    \subitem cflags, \hyperpage{49}
+    \subitem cflags, \hyperpage{50}
     \subitem chunked\_output, \hyperpage{50}
     \subitem components, \hyperpage{59}
     \subitem computed\_vector, \hyperpage{62}
     \subitem dependencies, \hyperpage{61}
     \subitem description, \hyperpage{47}
     \subitem diagnostics, \hyperpage{50}
-    \subitem dimension, \hyperpage{53}
+    \subitem dimension, \hyperpage{54}
     \subitem driver, \hyperpage{53}
-    \subitem error\_check, \hyperpage{50}
+    \subitem error\_check, \hyperpage{51}
     \subitem evaluation, \hyperpage{62}
-    \subitem features, \hyperpage{47}
+    \subitem features, \hyperpage{48}
     \subitem fftw, \hyperpage{51}
     \subitem filename, \hyperpage{60}
     \subitem filter, \hyperpage{66}
     \subitem filters, \hyperpage{71}
-    \subitem geometry, \hyperpage{53}
+    \subitem geometry, \hyperpage{54}
     \subitem globals, \hyperpage{51}
-    \subitem halt\_non\_finite, \hyperpage{50}
+    \subitem halt\_non\_finite, \hyperpage{51}
     \subitem initialisation, \hyperpage{60}
     \subitem integrate, \hyperpage{66}
     \subitem integration\_vectors, \hyperpage{67}
     \subitem name (of simulation), \hyperpage{47}
     \subitem noise\_vector, \hyperpage{63}
-    \subitem openmp, \hyperpage{51}
+    \subitem openmp, \hyperpage{52}
     \subitem operator, \hyperpage{68}
     \subitem operators, \hyperpage{67}
     \subitem output, \hyperpage{72}
-    \subitem precision, \hyperpage{51}
-    \subitem propagation\_dimension, \hyperpage{53}
-    \subitem samples, \hyperpage{66}
+    \subitem precision, \hyperpage{52}
+    \subitem propagation\_dimension, \hyperpage{54}
+    \subitem samples, \hyperpage{67}
     \subitem sampling\_group, \hyperpage{72}
     \subitem sequence, \hyperpage{65}
     \subitem simulation, \hyperpage{47}
-    \subitem transverse\_dimensions, \hyperpage{53}
+    \subitem transverse\_dimensions, \hyperpage{54}
     \subitem validation, \hyperpage{52}
     \subitem vector, \hyperpage{59}
   \item XML schema, \hyperpage{44}
diff --git a/documentation/latex/xmds2.log b/documentation/latex/xmds2.log
index 8d3937e..a1d1f16 100644
--- a/documentation/latex/xmds2.log
+++ b/documentation/latex/xmds2.log
@@ -1,27 +1,17 @@
-This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012) (format=pdflatex 2013.4.1)  14 OCT 2014 08:08
+This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2016.9.22)  21 JAN 2017 16:04
 entering extended mode
  restricted \write18 enabled.
  %&-line parsing enabled.
 **xmds2.tex
 (./xmds2.tex
-LaTeX2e <2011/06/27>
-Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, ge
-rman-x-2012-05-30, ngerman-x-2012-05-30, afrikaans, ancientgreek, ibycus, arabi
-c, armenian, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danis
-h, dutch, ukenglish, usenglishmax, esperanto, estonian, ethiopic, farsi, finnis
-h, french, friulan, galician, german, ngerman, swissgerman, monogreek, greek, h
-ungarian, icelandic, assamese, bengali, gujarati, hindi, kannada, malayalam, ma
-rathi, oriya, panjabi, tamil, telugu, indonesian, interlingua, irish, italian, 
-kurmanji, latin, latvian, lithuanian, mongolian, mongolianlmc, bokmal, nynorsk,
- piedmontese, polish, portuguese, romanian, romansh, russian, sanskrit, serbian
-, serbianc, slovak, slovenian, spanish, swedish, turkish, turkmen, ukrainian, u
-ppersorbian, welsh, loaded.
+LaTeX2e <2016/02/01>
+Babel <3.9q> and hyphenation patterns for 3 language(s) loaded.
 (./sphinxmanual.cls
 Document Class: sphinxmanual 2009/06/02 Document class (Sphinx manual)
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/report.cls
-Document Class: report 2007/10/19 v1.4h Standard LaTeX document class
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option)
+(/usr/share/texlive/texmf-dist/tex/latex/base/report.cls
+Document Class: report 2014/09/29 v1.4h Standard LaTeX document class
+(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
 )
 \c at part=\count79
 \c at chapter=\count80
@@ -36,23 +26,25 @@ File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option)
 \belowcaptionskip=\skip42
 \bibindent=\dimen102
 ))
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/inputenc.sty
-Package: inputenc 2008/03/30 v1.1d Input encoding file
+(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2015/03/17 v1.2c Input encoding file
 \inpenc at prehook=\toks14
 \inpenc at posthook=\toks15
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/utf8.def
-File: utf8.def 2008/04/05 v1.1m UTF-8 support for inputenc
+(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def
+File: utf8.def 2015/12/03 v1.1r UTF-8 support for inputenc
 Now handling font encoding OML ...
 ... no UTF-8 mapping file for font encoding OML
 Now handling font encoding T1 ...
 ... processing UTF-8 mapping file for font encoding T1
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/t1enc.dfu
-File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu
+File: t1enc.dfu 2015/12/03 v1.1r UTF-8 support for inputenc
+   defining Unicode char U+00A0 (decimal 160)
    defining Unicode char U+00A1 (decimal 161)
    defining Unicode char U+00A3 (decimal 163)
    defining Unicode char U+00AB (decimal 171)
+   defining Unicode char U+00AD (decimal 173)
    defining Unicode char U+00BB (decimal 187)
    defining Unicode char U+00BF (decimal 191)
    defining Unicode char U+00C0 (decimal 192)
@@ -117,50 +109,94 @@ File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
    defining Unicode char U+00FD (decimal 253)
    defining Unicode char U+00FE (decimal 254)
    defining Unicode char U+00FF (decimal 255)
+   defining Unicode char U+0100 (decimal 256)
+   defining Unicode char U+0101 (decimal 257)
    defining Unicode char U+0102 (decimal 258)
    defining Unicode char U+0103 (decimal 259)
    defining Unicode char U+0104 (decimal 260)
    defining Unicode char U+0105 (decimal 261)
    defining Unicode char U+0106 (decimal 262)
    defining Unicode char U+0107 (decimal 263)
+   defining Unicode char U+0108 (decimal 264)
+   defining Unicode char U+0109 (decimal 265)
+   defining Unicode char U+010A (decimal 266)
+   defining Unicode char U+010B (decimal 267)
    defining Unicode char U+010C (decimal 268)
    defining Unicode char U+010D (decimal 269)
    defining Unicode char U+010E (decimal 270)
    defining Unicode char U+010F (decimal 271)
    defining Unicode char U+0110 (decimal 272)
    defining Unicode char U+0111 (decimal 273)
+   defining Unicode char U+0112 (decimal 274)
+   defining Unicode char U+0113 (decimal 275)
+   defining Unicode char U+0114 (decimal 276)
+   defining Unicode char U+0115 (decimal 277)
+   defining Unicode char U+0116 (decimal 278)
+   defining Unicode char U+0117 (decimal 279)
    defining Unicode char U+0118 (decimal 280)
    defining Unicode char U+0119 (decimal 281)
    defining Unicode char U+011A (decimal 282)
    defining Unicode char U+011B (decimal 283)
+   defining Unicode char U+011C (decimal 284)
+   defining Unicode char U+011D (decimal 285)
    defining Unicode char U+011E (decimal 286)
    defining Unicode char U+011F (decimal 287)
+   defining Unicode char U+0120 (decimal 288)
+   defining Unicode char U+0121 (decimal 289)
+   defining Unicode char U+0122 (decimal 290)
+   defining Unicode char U+0123 (decimal 291)
+   defining Unicode char U+0124 (decimal 292)
+   defining Unicode char U+0125 (decimal 293)
+   defining Unicode char U+0128 (decimal 296)
+   defining Unicode char U+0129 (decimal 297)
+   defining Unicode char U+012A (decimal 298)
+   defining Unicode char U+012B (decimal 299)
+   defining Unicode char U+012C (decimal 300)
+   defining Unicode char U+012D (decimal 301)
+   defining Unicode char U+012E (decimal 302)
+   defining Unicode char U+012F (decimal 303)
    defining Unicode char U+0130 (decimal 304)
    defining Unicode char U+0131 (decimal 305)
    defining Unicode char U+0132 (decimal 306)
    defining Unicode char U+0133 (decimal 307)
+   defining Unicode char U+0134 (decimal 308)
+   defining Unicode char U+0135 (decimal 309)
+   defining Unicode char U+0136 (decimal 310)
+   defining Unicode char U+0137 (decimal 311)
    defining Unicode char U+0139 (decimal 313)
    defining Unicode char U+013A (decimal 314)
+   defining Unicode char U+013B (decimal 315)
+   defining Unicode char U+013C (decimal 316)
    defining Unicode char U+013D (decimal 317)
    defining Unicode char U+013E (decimal 318)
    defining Unicode char U+0141 (decimal 321)
    defining Unicode char U+0142 (decimal 322)
    defining Unicode char U+0143 (decimal 323)
    defining Unicode char U+0144 (decimal 324)
+   defining Unicode char U+0145 (decimal 325)
+   defining Unicode char U+0146 (decimal 326)
    defining Unicode char U+0147 (decimal 327)
    defining Unicode char U+0148 (decimal 328)
    defining Unicode char U+014A (decimal 330)
    defining Unicode char U+014B (decimal 331)
+   defining Unicode char U+014C (decimal 332)
+   defining Unicode char U+014D (decimal 333)
+   defining Unicode char U+014E (decimal 334)
+   defining Unicode char U+014F (decimal 335)
    defining Unicode char U+0150 (decimal 336)
    defining Unicode char U+0151 (decimal 337)
    defining Unicode char U+0152 (decimal 338)
    defining Unicode char U+0153 (decimal 339)
    defining Unicode char U+0154 (decimal 340)
    defining Unicode char U+0155 (decimal 341)
+   defining Unicode char U+0156 (decimal 342)
+   defining Unicode char U+0157 (decimal 343)
    defining Unicode char U+0158 (decimal 344)
    defining Unicode char U+0159 (decimal 345)
    defining Unicode char U+015A (decimal 346)
    defining Unicode char U+015B (decimal 347)
+   defining Unicode char U+015C (decimal 348)
+   defining Unicode char U+015D (decimal 349)
    defining Unicode char U+015E (decimal 350)
    defining Unicode char U+015F (decimal 351)
    defining Unicode char U+0160 (decimal 352)
@@ -169,10 +205,22 @@ File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
    defining Unicode char U+0163 (decimal 355)
    defining Unicode char U+0164 (decimal 356)
    defining Unicode char U+0165 (decimal 357)
+   defining Unicode char U+0168 (decimal 360)
+   defining Unicode char U+0169 (decimal 361)
+   defining Unicode char U+016A (decimal 362)
+   defining Unicode char U+016B (decimal 363)
+   defining Unicode char U+016C (decimal 364)
+   defining Unicode char U+016D (decimal 365)
    defining Unicode char U+016E (decimal 366)
    defining Unicode char U+016F (decimal 367)
    defining Unicode char U+0170 (decimal 368)
    defining Unicode char U+0171 (decimal 369)
+   defining Unicode char U+0172 (decimal 370)
+   defining Unicode char U+0173 (decimal 371)
+   defining Unicode char U+0174 (decimal 372)
+   defining Unicode char U+0175 (decimal 373)
+   defining Unicode char U+0176 (decimal 374)
+   defining Unicode char U+0177 (decimal 375)
    defining Unicode char U+0178 (decimal 376)
    defining Unicode char U+0179 (decimal 377)
    defining Unicode char U+017A (decimal 378)
@@ -180,6 +228,31 @@ File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
    defining Unicode char U+017C (decimal 380)
    defining Unicode char U+017D (decimal 381)
    defining Unicode char U+017E (decimal 382)
+   defining Unicode char U+01CD (decimal 461)
+   defining Unicode char U+01CE (decimal 462)
+   defining Unicode char U+01CF (decimal 463)
+   defining Unicode char U+01D0 (decimal 464)
+   defining Unicode char U+01D1 (decimal 465)
+   defining Unicode char U+01D2 (decimal 466)
+   defining Unicode char U+01D3 (decimal 467)
+   defining Unicode char U+01D4 (decimal 468)
+   defining Unicode char U+01E2 (decimal 482)
+   defining Unicode char U+01E3 (decimal 483)
+   defining Unicode char U+01E6 (decimal 486)
+   defining Unicode char U+01E7 (decimal 487)
+   defining Unicode char U+01E8 (decimal 488)
+   defining Unicode char U+01E9 (decimal 489)
+   defining Unicode char U+01EA (decimal 490)
+   defining Unicode char U+01EB (decimal 491)
+   defining Unicode char U+01F0 (decimal 496)
+   defining Unicode char U+01F4 (decimal 500)
+   defining Unicode char U+01F5 (decimal 501)
+   defining Unicode char U+0218 (decimal 536)
+   defining Unicode char U+0219 (decimal 537)
+   defining Unicode char U+021A (decimal 538)
+   defining Unicode char U+021B (decimal 539)
+   defining Unicode char U+01E02 (decimal 7682)
+   defining Unicode char U+01E03 (decimal 7683)
    defining Unicode char U+200C (decimal 8204)
    defining Unicode char U+2013 (decimal 8211)
    defining Unicode char U+2014 (decimal 8212)
@@ -198,10 +271,12 @@ File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
 Now handling font encoding OT1 ...
 ... processing UTF-8 mapping file for font encoding OT1
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/ot1enc.dfu
-File: ot1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
+(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu
+File: ot1enc.dfu 2015/12/03 v1.1r UTF-8 support for inputenc
+   defining Unicode char U+00A0 (decimal 160)
    defining Unicode char U+00A1 (decimal 161)
    defining Unicode char U+00A3 (decimal 163)
+   defining Unicode char U+00AD (decimal 173)
    defining Unicode char U+00B8 (decimal 184)
    defining Unicode char U+00BF (decimal 191)
    defining Unicode char U+00C5 (decimal 197)
@@ -219,6 +294,14 @@ File: ot1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
    defining Unicode char U+0142 (decimal 322)
    defining Unicode char U+0152 (decimal 338)
    defining Unicode char U+0153 (decimal 339)
+   defining Unicode char U+0174 (decimal 372)
+   defining Unicode char U+0175 (decimal 373)
+   defining Unicode char U+0176 (decimal 374)
+   defining Unicode char U+0177 (decimal 375)
+   defining Unicode char U+0218 (decimal 536)
+   defining Unicode char U+0219 (decimal 537)
+   defining Unicode char U+021A (decimal 538)
+   defining Unicode char U+021B (decimal 539)
    defining Unicode char U+2013 (decimal 8211)
    defining Unicode char U+2014 (decimal 8212)
    defining Unicode char U+2018 (decimal 8216)
@@ -229,8 +312,8 @@ File: ot1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
 Now handling font encoding OMS ...
 ... processing UTF-8 mapping file for font encoding OMS
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/omsenc.dfu
-File: omsenc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
+(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu
+File: omsenc.dfu 2015/12/03 v1.1r UTF-8 support for inputenc
    defining Unicode char U+00A7 (decimal 167)
    defining Unicode char U+00B6 (decimal 182)
    defining Unicode char U+00B7 (decimal 183)
@@ -255,32 +338,42 @@ Now handling font encoding U ...
 ))
    defining Unicode char U+00A0 (decimal 160)
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/cmap/cmap.sty
+(/usr/share/texlive/texmf-dist/tex/latex/cmap/cmap.sty
 Package: cmap 2008/03/06 v1.0h CMap support: searchable PDF
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/fontenc.sty
+(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
 Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/t1enc.def
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def
 File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
-LaTeX Font Info:    Redeclaring font encoding T1 on input line 43.
+LaTeX Font Info:    Redeclaring font encoding T1 on input line 48.
 )<<t1.cmap>>)
-(/usr/local/texlive/2012/texmf-dist/tex/generic/babel/babel.sty
-Package: babel 2008/07/08 v3.8m The Babel package
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
+\@emptytoks=\toks16
+\symAMSa=\mathgroup4
+\symAMSb=\mathgroup5
+LaTeX Font Info:    Overwriting math alphabet `\mathfrak' in version `bold'
+(Font)                  U/euf/m/n --> U/euf/b/n on input line 106.
+)
+(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2016/02/24 3.9q The Babel package
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/babel/english.ldf
-Language: english 2005/03/30 v3.3o English support from the babel system
+(/usr/share/texlive/texmf-dist/tex/generic/babel-english/english.ldf
+Language: english 2012/08/20 v3.3p English support from the babel system
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/babel/babel.def
-File: babel.def 2008/07/08 v3.8m Babel common definitions
+(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2016/02/24 3.9q Babel common definitions
 \babel at savecnt=\count88
 \U at D=\dimen103
 )
+\l at british = a dialect from \language\l at english 
+\l at UKenglish = a dialect from \language\l at english 
 \l at canadian = a dialect from \language\l at american 
 \l at australian = a dialect from \language\l at british 
 \l at newzealand = a dialect from \language\l at british 
 ))
-(/usr/local/texlive/2012/texmf-dist/tex/latex/psnfss/times.sty
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty
 Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) 
 ) (./fncychap.sty
 Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters)
@@ -293,8 +386,9 @@ Package: fncychap 2007/07/30 v1.34 LaTeX package (Revised chapters)
 \pxx=\skip49
 \c at AlphaCnt=\count89
 \c at AlphaDecCnt=\count90
-) (/usr/local/texlive/2012/texmf-dist/tex/latex/tools/longtable.sty
-Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC)
+)
+(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty
+Package: longtable 2014/10/28 v4.11 Multi-page Table package (DPC)
 \LTleft=\skip50
 \LTright=\skip51
 \LTpre=\skip52
@@ -309,12 +403,11 @@ Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC)
 \LT at rows=\count93
 \c at LT@tables=\count94
 \c at LT@chunks=\count95
-\LT at p@ftn=\toks16
-)
-(./sphinx.sty
+\LT at p@ftn=\toks17
+) (./sphinx.sty
 Package: sphinx 2010/01/15 LaTeX package (Sphinx markup)
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty
+(/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty
 \fancy at headwidth=\skip54
 \f at ncyO@elh=\skip55
 \f at ncyO@erh=\skip56
@@ -325,7 +418,7 @@ Package: sphinx 2010/01/15 LaTeX package (Sphinx markup)
 \f at ncyO@olf=\skip61
 \f at ncyO@orf=\skip62
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/textcomp.sty
+(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty
 Package: textcomp 2005/09/27 v1.99g Standard LaTeX package
 Package textcomp Info: Sub-encoding information:
 (textcomp)               5 = only ISO-Adobe without \textcurrency
@@ -338,15 +431,15 @@ Package textcomp Info: Sub-encoding information:
 (textcomp)             only a restricted character set as indicated.
 (textcomp)             Family '?' is the default used for unknown fonts.
 (textcomp)             See the documentation for details.
-Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 71.
+Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 79.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/ts1enc.def
+(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def
 File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file
 Now handling font encoding TS1 ...
 ... processing UTF-8 mapping file for font encoding TS1
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/ts1enc.dfu
-File: ts1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
+(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu
+File: ts1enc.dfu 2015/12/03 v1.1r UTF-8 support for inputenc
    defining Unicode char U+00A2 (decimal 162)
    defining Unicode char U+00A3 (decimal 163)
    defining Unicode char U+00A4 (decimal 164)
@@ -417,101 +510,102 @@ File: ts1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc
    defining Unicode char U+25EF (decimal 9711)
    defining Unicode char U+266A (decimal 9834)
 ))
-LaTeX Info: Redefining \oldstylenums on input line 266.
-Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 281.
-Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 282.
-Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 283.
-Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 284.
-Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 285.
-Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 286.
-Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 287.
-Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 288.
-Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 289.
-Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 290.
-Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 291.
-Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 292.
-Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 293.
-Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 294.
-Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 295.
-Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 296.
-Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 297.
-Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 298.
-Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 299.
-Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 300.
-Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 301.
-Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 302.
-Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 303.
-Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 304.
-
-Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 305.
-Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 306.
-Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 307.
-Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 308.
-Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 309.
-Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 310.
-Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 311.
-Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 312.
-Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 313.
-Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 314.
-Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 315.
-Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 316.
-Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 317.
-Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 318.
-Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 319.
-Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 320.
-Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 321.
-Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 322.
-Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 323.
-Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 324.
-Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 325.
-Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 326.
-Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 327.
-Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 328.
-Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 329.
-Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 330.
-Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 331.
-Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 332.
-Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 333.
-Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 334.
-Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 335.
-Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 336.
-Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 337.
-Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 338.
-Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 339.
-Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 340.
+LaTeX Info: Redefining \oldstylenums on input line 334.
+Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 349.
+Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 350.
+Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 351.
+Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 352.
+Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 353.
+Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 354.
+Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 355.
+Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 356.
+Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 357.
+Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 358.
+Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 359.
+Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 360.
+Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 361.
+Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 362.
+Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 363.
+Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 364.
+Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 365.
+Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 366.
+Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 367.
+Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 368.
+Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 369.
+Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 370.
+Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 371.
+Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 372.
+
+Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 373.
+Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 374.
+Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 375.
+Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 376.
+Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 377.
+Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 378.
+Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 379.
+Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 380.
+Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 381.
+Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 382.
+Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 383.
+Package textcomp Info: Setting lmtt sub-encoding to TS1/0 on input line 384.
+Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 385.
+Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 386.
+Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 387.
+Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 388.
+Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 389.
+Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 390.
+Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 391.
+Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 392.
+Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 393.
+Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 394.
+Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 395.
+Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 396.
+Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 397.
+Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 398.
+Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 399.
+Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 400.
+Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 401.
+Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 402.
+Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 403.
+Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 404.
+Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 405.
+Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 406.
+Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 407.
+Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 408.
+Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 409.
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/fancybox/fancybox.sty
+(/usr/share/texlive/texmf-dist/tex/latex/fancybox/fancybox.sty
 Package: fancybox 2010/05/15 1.4
 
 Style option: `fancybox' v1.4 <2010/05/15> (tvz)
 \@fancybox=\box30
 \shadowsize=\dimen105
 \@Sbox=\box31
-\do at VerbBox=\toks17
-\the at fancyput=\toks18
-\this at fancyput=\toks19
-\EndVerbatimTokens=\toks20
+\do at VerbBox=\toks18
+\the at fancyput=\toks19
+\this at fancyput=\toks20
+\EndVerbatimTokens=\toks21
 \Verbatim at Outfile=\write3
 \Verbatim at Infile=\read1
-) (/usr/local/texlive/2012/texmf-dist/tex/latex/titlesec/titlesec.sty
-Package: titlesec 2011/12/15 v2.10.0 Sectioning titles
+) (/usr/share/texlive/texmf-dist/tex/latex/titlesec/titlesec.sty
+Package: titlesec 2016/03/15 v2.10.1 Sectioning titles
 \ttl at box=\box32
 \beforetitleunit=\skip63
 \aftertitleunit=\skip64
 \ttl at plus=\dimen106
 \ttl at minus=\dimen107
-\ttl at toksa=\toks21
+\ttl at toksa=\toks22
 \titlewidth=\dimen108
 \titlewidthlast=\dimen109
 \titlewidthfirst=\dimen110
 )
 (./tabulary.sty
-Package: tabulary 2007/10/02 v0.9 tabulary package (DPC)
- (/usr/local/texlive/2012/texmf-dist/tex/latex/tools/array.sty
-Package: array 2008/09/09 v2.4c Tabular extension package (FMi)
+Package: tabulary 2008/12/01 v0.9 tabulary package (DPC)
+ (/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty
+Package: array 2014/10/28 v2.4c Tabular extension package (FMi)
 \col at sep=\dimen111
 \extrarowheight=\dimen112
-\NC at list=\toks22
+\NC at list=\toks23
 \extratabsurround=\skip65
 \backup at length=\skip66
 )
@@ -520,68 +614,69 @@ Package: array 2008/09/09 v2.4c Tabular extension package (FMi)
 \tymin=\dimen114
 \tymax=\dimen115
 \TY at tablewidth=\dimen116
-) (/usr/local/texlive/2012/texmf-dist/tex/latex/amsmath/amsmath.sty
-Package: amsmath 2013/01/14 v2.14 AMS math features
+)
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+Package: amsmath 2016/03/03 v2.15a AMS math features
 \@mathmargin=\skip67
 
 For additional information on amsmath, use the `?' option.
-(/usr/local/texlive/2012/texmf-dist/tex/latex/amsmath/amstext.sty
-Package: amstext 2000/06/29 v2.01
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+Package: amstext 2000/06/29 v2.01 AMS text
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/amsmath/amsgen.sty
-File: amsgen.sty 1999/11/30 v2.0
-\@emptytoks=\toks23
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+File: amsgen.sty 1999/11/30 v2.0 generic functions
+\@emptytoks=\toks24
 \ex@=\dimen117
 ))
-(/usr/local/texlive/2012/texmf-dist/tex/latex/amsmath/amsbsy.sty
-Package: amsbsy 1999/11/29 v1.2d
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+Package: amsbsy 1999/11/29 v1.2d Bold Symbols
 \pmbraise@=\dimen118
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/amsmath/amsopn.sty
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
 Package: amsopn 1999/12/14 v2.01 operator names
 )
 \inf at bad=\count97
-LaTeX Info: Redefining \frac on input line 210.
+LaTeX Info: Redefining \frac on input line 199.
 \uproot@=\count98
 \leftroot@=\count99
-LaTeX Info: Redefining \overline on input line 306.
+LaTeX Info: Redefining \overline on input line 297.
 \classnum@=\count100
 \DOTSCASE@=\count101
-LaTeX Info: Redefining \ldots on input line 378.
-LaTeX Info: Redefining \dots on input line 381.
-LaTeX Info: Redefining \cdots on input line 466.
+LaTeX Info: Redefining \ldots on input line 394.
+LaTeX Info: Redefining \dots on input line 397.
+LaTeX Info: Redefining \cdots on input line 518.
 \Mathstrutbox@=\box33
 \strutbox@=\box34
 \big at size=\dimen119
-LaTeX Font Info:    Redeclaring font encoding OML on input line 566.
-LaTeX Font Info:    Redeclaring font encoding OMS on input line 567.
+LaTeX Font Info:    Redeclaring font encoding OML on input line 630.
+LaTeX Font Info:    Redeclaring font encoding OMS on input line 631.
 \macc at depth=\count102
 \c at MaxMatrixCols=\count103
 \dotsspace@=\muskip10
 \c at parentequation=\count104
 \dspbrk at lvl=\count105
-\tag at help=\toks24
+\tag at help=\toks25
 \row@=\count106
 \column@=\count107
 \maxfields@=\count108
-\andhelp@=\toks25
+\andhelp@=\toks26
 \eqnshift@=\dimen120
 \alignsep@=\dimen121
 \tagshift@=\dimen122
 \tagwidth@=\dimen123
 \totwidth@=\dimen124
 \lineht@=\dimen125
-\@envbody=\toks26
+\@envbody=\toks27
 \multlinegap=\skip68
 \multlinetaggap=\skip69
-\mathdisplay at stack=\toks27
-LaTeX Info: Redefining \[ on input line 2665.
-LaTeX Info: Redefining \] on input line 2666.
+\mathdisplay at stack=\toks28
+LaTeX Info: Redefining \[ on input line 2735.
+LaTeX Info: Redefining \] on input line 2736.
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/makeidx.sty
-Package: makeidx 2000/03/29 v1.0m Standard LaTeX package
+(/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty
+Package: makeidx 2014/09/29 v1.0m Standard LaTeX package
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/framed/framed.sty
+(/usr/share/texlive/texmf-dist/tex/latex/framed/framed.sty
 Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks
 \OuterFrameSep=\skip70
 \fb at frw=\dimen126
@@ -589,36 +684,35 @@ Package: framed 2011/10/22 v 0.96: framed or shaded text with page breaks
 \FrameRule=\dimen128
 \FrameSep=\dimen129
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/base/ifthen.sty
-Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC)
+(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/graphics/color.sty
-Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty
+Package: color 2016/01/03 v1.1b Standard LaTeX Color (DPC)
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/latexconfig/color.cfg
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg
 File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive
 )
-Package color Info: Driver file: pdftex.def on input line 130.
+Package color Info: Driver file: pdftex.def on input line 143.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/pdftex-def/pdftex.def
+(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def
 File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/infwarerr.sty
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty
 Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/ltxcmds.sty
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty
 Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO)
 )
 \Gread at gobject=\count109
 ))
-(/usr/local/texlive/2012/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
+(/usr/share/texlive/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty
 Package: fancyvrb 2008/02/07
 
 Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix 
-<2008/02/07> (tvz)
-(/usr/local/texlive/2012/texmf-dist/tex/latex/graphics/keyval.sty
-Package: keyval 1999/03/16 v1.13 key=value parser (DPC)
-\KV at toks@=\toks28
+<2008/02/07> (tvz) (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
+\KV at toks@=\toks29
 )
 \FV at CodeLineNo=\count110
 \FV at InFile=\read2
@@ -626,44 +720,51 @@ Package: keyval 1999/03/16 v1.13 key=value parser (DPC)
 \c at FancyVerbLine=\count111
 \FV at StepNumber=\count112
 \FV at OutFile=\write4
-)
-(/usr/local/texlive/2012/texmf-dist/tex/latex/threeparttable/threeparttable.sty
+) (/usr/share/texlive/texmf-dist/tex/latex/threeparttable/threeparttable.sty
 Package: threeparttable 2003/06/13  v 3.0
 \@tempboxb=\box36
-) (/usr/local/texlive/2012/texmf-dist/tex/latex/mdwtools/footnote.sty
+)
+(/usr/share/texlive/texmf-dist/tex/latex/mdwtools/footnote.sty
 Package: footnote 1997/01/28 1.13 Save footnotes around boxes
 \fn at notes=\box37
 \fn at width=\dimen130
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/wrapfig/wrapfig.sty
+(/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty
 \wrapoverhang=\dimen131
 \WF at size=\dimen132
 \c at WF@wrappedlines=\count113
 \WF at box=\box38
-\WF at everypar=\toks29
+\WF at everypar=\toks30
 Package: wrapfig 2003/01/31  v 3.6
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/parskip/parskip.sty
+(/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty
 Package: parskip 2001/04/09 non-zero parskip adjustments
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/graphics/graphicx.sty
-Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR)
+(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty
+Package: alltt 1997/06/16 v2.0g defines alltt environment
+)
+(/usr/share/texlive/texmf-dist/tex/latex/upquote/upquote.sty
+Package: upquote 2012/04/19 v1.3 upright-quote and grave-accent glyphs in verba
+tim
+)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
+Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR)
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/graphics/graphics.sty
-Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty
+Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR)
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/graphics/trig.sty
-Package: trig 1999/03/16 v1.09 sin cos tan (DPC)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty
+Package: trig 2016/01/03 v1.10 sin cos tan (DPC)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/latexconfig/graphics.cfg
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg
 File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live
 )
-Package graphics Info: Driver file: pdftex.def on input line 91.
+Package graphics Info: Driver file: pdftex.def on input line 95.
 )
 \Gin at req@height=\dimen133
 \Gin at req@width=\dimen134
 )
-(/usr/local/texlive/2012/texmf-dist/tex/plain/misc/pdfcolor.tex)
+(/usr/share/texlive/texmf-dist/tex/generic/pdftex/pdfcolor.tex)
 \distancetoright=\skip71
 \py at argswidth=\skip72
 \py at noticelength=\skip73
@@ -671,14 +772,14 @@ Package graphics Info: Driver file: pdftex.def on input line 91.
 \image at box=\box39
 \image at width=\dimen135
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/hyperref/hyperref.sty
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty
 Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty
 Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO)
 
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty
 Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO)
 Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO)
 Package hobsub Info: Skipping package `infwarerr' (already loaded).
@@ -719,27 +820,27 @@ Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO)
 Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO)
 Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/generic/ifxetex/ifxetex.sty
+(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty
 Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/auxhook.sty
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty
 Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/kvoptions.sty
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty
 Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO)
 )
 \@linkdim=\dimen136
 \Hy at linkcounter=\count114
 \Hy at pagecounter=\count115
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/hyperref/pd1enc.def
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def
 File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO)
 Now handling font encoding PD1 ...
 ... no UTF-8 mapping file for font encoding PD1
 )
 \Hy at SavedSpaceFactor=\count116
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/latexconfig/hyperref.cfg
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg
 File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive
 )
 Package hyperref Info: Option `colorlinks' set `true' on input line 4319.
@@ -753,9 +854,9 @@ Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
 Package hyperref Info: Bookmarks ON on input line 4688.
 \c at Hy@tempcnt=\count117
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/url/url.sty
+(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty
 \Urlmuskip=\muskip11
-Package: url 2006/04/12  ver 3.3  Verb mode for urls, etc.
+Package: url 2013/09/16  ver 3.4  Verb mode for urls, etc.
 )
 LaTeX Info: Redefining \url on input line 5041.
 \XeTeXLinkMargin=\dimen137
@@ -778,26 +879,55 @@ LaTeX Info: Redefining \pageref on input line 6369.
 
 Package hyperref Message: Driver (autodetected): hpdftex.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/hyperref/hpdftex.def
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def
 File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX
 \Fld at listcount=\count122
 \c at bookmark@seq at number=\count123
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty
 Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO)
 Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2
 82.
 )
 \Hy at SectionHShift=\skip75
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/hypcap.sty
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/hypcap.sty
 Package: hypcap 2011/02/16 v1.11 Adjusting the anchors of captions (HO)
 )
 \DUlineblockindent=\skip76
+
+(/usr/share/texlive/texmf-dist/tex/latex/caption/newfloat.sty
+Package: newfloat 2015/09/17 v1.1-109 Defining new floating environments (AR)
 )
-(/usr/local/texlive/2012/texmf-dist/tex/latex/multirow/multirow.sty
+Package newfloat Info: New float `literal-block' with options `' on input line 
+527.
+\c at literal-block=\count124
+\newfloat at ftype=\count125
+Package newfloat Info: float type `literal-block'=8 on input line 527.
+
+(/usr/share/texlive/texmf-dist/tex/latex/capt-of/capt-of.sty
+Package: capt-of 2009/12/29 v0.2 standard captions outside of floats
+)
+(/usr/share/texlive/texmf-dist/tex/latex/needspace/needspace.sty
+Package: needspace 2010/09/12 v1.3d reserve vertical space
+))
+(/usr/share/texlive/texmf-dist/tex/latex/multirow/multirow.sty
 \bigstrutjot=\dimen140
 )
+(/usr/share/texlive/texmf-dist/tex/latex/eqparbox/eqparbox.sty
+Package: eqparbox 2013/03/15 v4.0 Create equal-widthed boxes
+\eqp at tempdima=\skip77
+\eqp at tempdimb=\skip78
+\eqp at tabular@box=\box40
+\eqp at list@box=\box41
+\eqp at list@indent=\skip79
+
+(/usr/share/texlive/texmf-dist/tex/latex/environ/environ.sty
+Package: environ 2014/05/04 v0.3 A new way to define environments
+
+(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty
+Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
+)))
 \@indexfile=\write5
 \openout5 = `xmds2.idx'.
 
@@ -806,49 +936,49 @@ Writing index file xmds2.idx
 (./xmds2.aux)
 \openout1 = `xmds2.aux'.
 
-LaTeX Font Info:    Checking defaults for OML/cmm/m/it on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for U/cmr/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for TS1/cmr/m/n on input line 117.
-LaTeX Font Info:    Try loading font information for TS1+cmr on input line 117.
-
- (/usr/local/texlive/2012/texmf-dist/tex/latex/base/ts1cmr.fd
-File: ts1cmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+LaTeX Font Info:    Checking defaults for OML/cmm/m/it on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for T1/cmr/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for OT1/cmr/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for OMS/cmsy/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for OMX/cmex/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for U/cmr/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for TS1/cmr/m/n on input line 131.
+LaTeX Font Info:    Try loading font information for TS1+cmr on input line 131.
+
+ (/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd
+File: ts1cmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions
 )
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Checking defaults for PD1/pdf/m/n on input line 117.
-LaTeX Font Info:    ... okay on input line 117.
-LaTeX Font Info:    Try loading font information for T1+ptm on input line 117.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Checking defaults for PD1/pdf/m/n on input line 131.
+LaTeX Font Info:    ... okay on input line 131.
+LaTeX Font Info:    Try loading font information for T1+ptm on input line 131.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/psnfss/t1ptm.fd
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd
 File: t1ptm.fd 2001/06/04 font definitions for T1/ptm.
 )
-(/usr/local/texlive/2012/texmf-dist/tex/context/base/supp-pdf.mkii
+(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii
 [Loading MPS to PDF converter (version 2006.09.02).]
-\scratchcounter=\count124
+\scratchcounter=\count126
 \scratchdimen=\dimen141
-\scratchbox=\box40
-\nofMPsegments=\count125
-\nofMParguments=\count126
-\everyMPshowfont=\toks30
-\MPscratchCnt=\count127
+\scratchbox=\box42
+\nofMPsegments=\count127
+\nofMParguments=\count128
+\everyMPshowfont=\toks31
+\MPscratchCnt=\count129
 \MPscratchDim=\dimen142
-\MPnumerator=\count128
-\makeMPintoPDFobject=\count129
-\everyMPtoPDFconversion=\toks31
-) (/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
+\MPnumerator=\count130
+\makeMPintoPDFobject=\count131
+\everyMPtoPDFconversion=\toks32
+) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
 Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/oberdiek/grfext.sty
+(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty
 Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO)
 )
 Package grfext Info: Graphics extension search list:
@@ -856,157 +986,155 @@ Package grfext Info: Graphics extension search list:
 G,.JBIG2,.JB2,.eps]
 (grfext)             \AppendGraphicsExtensions on input line 452.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
+(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
 File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
 e
 ))
-\AtBeginShipoutBox=\box41
-Package hyperref Info: Link coloring ON on input line 117.
+\AtBeginShipoutBox=\box43
+Package hyperref Info: Link coloring ON on input line 131.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/hyperref/nameref.sty
+(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
 Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section
 
-(/usr/local/texlive/2012/texmf-dist/tex/generic/oberdiek/gettitlestring.sty
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty
 Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO)
 )
-\c at section@level=\count130
+\c at section@level=\count132
 )
-LaTeX Info: Redefining \ref on input line 117.
-LaTeX Info: Redefining \pageref on input line 117.
-LaTeX Info: Redefining \nameref on input line 117.
+LaTeX Info: Redefining \ref on input line 131.
+LaTeX Info: Redefining \pageref on input line 131.
+LaTeX Info: Redefining \nameref on input line 131.
 
 (./xmds2.out) (./xmds2.out)
 \@outlinefile=\write6
 \openout6 = `xmds2.out'.
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 120--120
+Underfull \hbox (badness 10000) in paragraph at lines 134--134
 
  []
 
-<xmds_logo.pdf, id=262, 183.084pt x 183.084pt>
+<xmds_logo.pdf, id=270, 183.084pt x 183.084pt>
 File: xmds_logo.pdf Graphic file (type pdf)
  <use xmds_logo.pdf>
-Package pdftex.def Info: xmds_logo.pdf used on input line 120.
+Package pdftex.def Info: xmds_logo.pdf used on input line 134.
 (pdftex.def)             Requested size: 183.08354pt x 183.08354pt.
 File: xmds_logo.pdf Graphic file (type pdf)
 
 <use xmds_logo.pdf>
-Package pdftex.def Info: xmds_logo.pdf used on input line 120.
+Package pdftex.def Info: xmds_logo.pdf used on input line 134.
 (pdftex.def)             Requested size: 183.08354pt x 183.08354pt.
-LaTeX Font Info:    Try loading font information for T1+phv on input line 120.
-
-(/usr/local/texlive/2012/texmf-dist/tex/latex/psnfss/t1phv.fd
+LaTeX Font Info:    Try loading font information for T1+phv on input line 134.
+ (/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1phv.fd
 File: t1phv.fd 2001/06/04 scalable font definitions for T1/phv.
 )
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <24.88> not available
-(Font)              Font shape `T1/phv/b/n' tried instead on input line 120.
+(Font)              Font shape `T1/phv/b/n' tried instead on input line 134.
 LaTeX Font Info:    Font shape `T1/phv/m/it' in size <17.28> not available
-(Font)              Font shape `T1/phv/m/sl' tried instead on input line 120.
+(Font)              Font shape `T1/phv/m/sl' tried instead on input line 134.
 LaTeX Font Info:    Font shape `T1/phv/bx/it' in size <17.28> not available
-(Font)              Font shape `T1/phv/b/it' tried instead on input line 120.
+(Font)              Font shape `T1/phv/b/it' tried instead on input line 134.
 LaTeX Font Info:    Font shape `T1/phv/b/it' in size <17.28> not available
-(Font)              Font shape `T1/phv/b/sl' tried instead on input line 120.
+(Font)              Font shape `T1/phv/b/sl' tried instead on input line 134.
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <17.28> not available
-(Font)              Font shape `T1/phv/b/n' tried instead on input line 120.
-<<ot1.cmap>><<oml.cmap>><<oms.cmap>><<omx.cmap>> [1
+(Font)              Font shape `T1/phv/b/n' tried instead on input line 134.
+<<ot1.cmap>><<oml.cmap>><<oms.cmap>><<omx.cmap>>
+LaTeX Font Info:    Try loading font information for U+msa on input line 134.
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+File: umsa.fd 2013/01/14 v3.01 AMS symbols A
+)
+LaTeX Font Info:    Try loading font information for U+msb on input line 134.
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+File: umsb.fd 2013/01/14 v3.01 AMS symbols B
+) [1
 
-{/usr/local/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map} <./xmds_
-logo.pdf>] [2
+{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./xmds_logo.pdf>] [2
 
 ] (./xmds2.toc
 LaTeX Font Info:    Font shape `T1/ptm/bx/n' in size <10> not available
 (Font)              Font shape `T1/ptm/b/n' tried instead on input line 2.
 LaTeX Font Info:    Try loading font information for T1+pcr on input line 85.
 
-(/usr/local/texlive/2012/texmf-dist/tex/latex/psnfss/t1pcr.fd
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd
 File: t1pcr.fd 2001/06/04 font definitions for T1/pcr.
 )
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <10> not available
 (Font)              Font shape `T1/phv/b/n' tried instead on input line 97.
-pdfTeX warning (ext4): destination with the same identifier (name{page.i}) has 
-been already used, duplicate ignored
-<to be read again> 
-                   \relax 
-l.97 ...line {9}Optimisation Hints}{87}{chapter.9}
-                                                   [1
+ [1
 
 ])
 \tf at toc=\write7
 \openout7 = `xmds2.toc'.
 
-pdfTeX warning (ext4): destination with the same identifier (name{page.ii}) has
- been already used, duplicate ignored
-<to be read again> 
-                   \relax 
-l.120 \tableofcontents
-                       [2]
+ [2]
 Chapter 1.
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <14.4> not available
-(Font)              Font shape `T1/phv/b/n' tried instead on input line 125.
+(Font)              Font shape `T1/phv/b/n' tried instead on input line 139.
 LaTeX Font Info:    Font shape `T1/ptm/bx/n' in size <14.4> not available
-(Font)              Font shape `T1/ptm/b/n' tried instead on input line 125.
+(Font)              Font shape `T1/ptm/b/n' tried instead on input line 139.
 LaTeX Font Info:    Font shape `T1/ptm/bx/n' in size <24.88> not available
-(Font)              Font shape `T1/ptm/b/n' tried instead on input line 125.
+(Font)              Font shape `T1/ptm/b/n' tried instead on input line 139.
 LaTeX Font Info:    Font shape `T1/ptm/bx/n' in size <8> not available
-(Font)              Font shape `T1/ptm/b/n' tried instead on input line 143.
+(Font)              Font shape `T1/ptm/b/n' tried instead on input line 157.
 [1
 
 
 ] [2]
 Chapter 2.
 
-Package tabulary Warning: No suitable columns! on input line 189.
+Package tabulary Warning: No suitable columns! on input line 203.
 
 [3
 
 ]
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <12> not available
-(Font)              Font shape `T1/phv/b/n' tried instead on input line 228.
+(Font)              Font shape `T1/phv/b/n' tried instead on input line 242.
  [4]
-LaTeX Font Info:    Try loading font information for TS1+ptm on input line 275.
+LaTeX Font Info:    Try loading font information for TS1+ptm on input line 289.
 
- (/usr/local/texlive/2012/texmf-dist/tex/latex/psnfss/ts1ptm.fd
+ (/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1ptm.fd
 File: ts1ptm.fd 2001/06/04 font definitions for TS1/ptm.
 )
-Underfull \hbox (badness 10000) in paragraph at lines 319--322
+Underfull \hbox (badness 10000) in paragraph at lines 334--337
 []\T1/ptm/m/n/10 First cre-ate the path ~/lib/python2.5/site-packages (as-sum-i
 ng you in-stalled
  []
 
 [5]
-Underfull \hbox (badness 10000) in paragraph at lines 400--402
+Underfull \hbox (badness 10000) in paragraph at lines 415--417
 []\T1/ptm/m/n/10 It can be in-stalled with \T1/pcr/m/n/10 sudo
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 414--416
+Underfull \hbox (badness 10000) in paragraph at lines 429--431
 []
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 422--424
+Underfull \hbox (badness 10000) in paragraph at lines 437--439
 []\T1/ptm/m/n/10 h5py
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 434--436
+Underfull \hbox (badness 10000) in paragraph at lines 449--451
 []\T1/pcr/m/n/10 sudo
  []
 
 
-Underfull \hbox (badness 5563) in paragraph at lines 449--452
+Underfull \hbox (badness 5563) in paragraph at lines 464--467
 []\T1/ptm/m/n/10 If you have `numpy' in-stalled, test XMDS2 by typ-ing
  []
 
-
-Underfull \hbox (badness 10000) in paragraph at lines 464--465
+[6]
+Underfull \hbox (badness 10000) in paragraph at lines 479--480
 []\T1/ptm/m/n/10 The gen-er-ated html doc-u-men-ta-tion will then be found at x
 mds-
  []
 
-[6]
-Underfull \hbox (badness 10000) in paragraph at lines 477--478
+
+Underfull \hbox (badness 10000) in paragraph at lines 492--493
 []\T1/pcr/m/n/10 xmds2 --reconfigure --include-path /apps/fftw3/include
  []
 
@@ -1015,249 +1143,232 @@ Underfull \hbox (badness 10000) in paragraph at lines 477--478
 ]
 Chapter 3.
 LaTeX Font Info:    Font shape `T1/pcr/m/it' in size <9> not available
-(Font)              Font shape `T1/pcr/m/sl' tried instead on input line 508.
+(Font)              Font shape `T1/pcr/m/sl' tried instead on input line 523.
 LaTeX Font Info:    Font shape `T1/pcr/bx/n' in size <9> not available
-(Font)              Font shape `T1/pcr/b/n' tried instead on input line 509.
-[9] [10] <lorenz.pdf, id=510, 681.01025pt x 300.322pt>
+(Font)              Font shape `T1/pcr/b/n' tried instead on input line 524.
+LaTeX Font Info:    Try loading font information for TS1+pcr on input line 549.
+
+(/usr/share/texlive/texmf-dist/tex/latex/psnfss/ts1pcr.fd
+File: ts1pcr.fd 2001/06/04 font definitions for TS1/pcr.
+)
+LaTeX Font Info:    Font shape `TS1/pcr/m/it' in size <9> not available
+(Font)              Font shape `TS1/pcr/m/sl' tried instead on input line 549.
+ [9] [10]
+<lorenz.pdf, id=522, 681.01025pt x 300.322pt>
 File: lorenz.pdf Graphic file (type pdf)
  <use lorenz.pdf>
-Package pdftex.def Info: lorenz.pdf used on input line 645.
+Package pdftex.def Info: lorenz.pdf used on input line 660.
 (pdftex.def)             Requested size: 681.00859pt x 300.32127pt.
 File: lorenz.pdf Graphic file (type pdf)
 
 <use lorenz.pdf>
-Package pdftex.def Info: lorenz.pdf used on input line 645.
+Package pdftex.def Info: lorenz.pdf used on input line 660.
 (pdftex.def)             Requested size: 452.96788pt x 199.75745pt.
  [11 <./lorenz.pdf>] [12] [13] [14]
 Chapter 4.
 [15
 
 ]
-Underfull \vbox (badness 10000) detected at line 893
+Underfull \vbox (badness 10000) detected at line 908
  []
 
 
-Underfull \vbox (badness 10000) detected at line 893
+Underfull \vbox (badness 10000) detected at line 908
  []
 
-[16] [17] [18] [19] [20] <kuboSingle.pdf, id=578, 569.32701pt x 349.00288pt>
+[16] [17] [18] [19] [20] <kuboSingle.pdf, id=590, 569.32701pt x 349.00288pt>
 File: kuboSingle.pdf Graphic file (type pdf)
 
 <use kuboSingle.pdf>
-Package pdftex.def Info: kuboSingle.pdf used on input line 1111.
+Package pdftex.def Info: kuboSingle.pdf used on input line 1126.
 (pdftex.def)             Requested size: 569.3256pt x 349.00203pt.
 File: kuboSingle.pdf Graphic file (type pdf)
  <use kuboSingle.pdf>
-Package pdftex.def Info: kuboSingle.pdf used on input line 1111.
+Package pdftex.def Info: kuboSingle.pdf used on input line 1126.
 (pdftex.def)             Requested size: 452.96788pt x 277.67963pt.
 
-<kubo10000.pdf, id=579, 560.49402pt x 346.36702pt>
+<kubo10000.pdf, id=591, 560.49402pt x 346.36702pt>
 File: kubo10000.pdf Graphic file (type pdf)
  <use kubo10000.pdf>
-Package pdftex.def Info: kubo10000.pdf used on input line 1119.
+Package pdftex.def Info: kubo10000.pdf used on input line 1134.
 (pdftex.def)             Requested size: 560.49265pt x 346.36617pt.
 File: kubo10000.pdf Graphic file (type pdf)
 
 <use kubo10000.pdf>
-Package pdftex.def Info: kubo10000.pdf used on input line 1119.
+Package pdftex.def Info: kubo10000.pdf used on input line 1134.
 (pdftex.def)             Requested size: 452.96788pt x 279.9268pt.
  [21] [22 <./kuboSingle.pdf> <./kubo10000.pdf>]
-Underfull \vbox (badness 10000) detected at line 1203
+Underfull \vbox (badness 10000) detected at line 1218
  []
 
 
-Underfull \vbox (badness 10000) detected at line 1203
+Underfull \vbox (badness 10000) detected at line 1218
  []
 
-[23] [24] <fibreSingle.pdf, id=614, 639.99098pt x 481.84819pt>
+[23] <fibreSingle.pdf, id=622, 639.99098pt x 481.84819pt>
 File: fibreSingle.pdf Graphic file (type pdf)
 
 <use fibreSingle.pdf>
-Package pdftex.def Info: fibreSingle.pdf used on input line 1264.
+Package pdftex.def Info: fibreSingle.pdf used on input line 1279.
 (pdftex.def)             Requested size: 639.98943pt x 481.84702pt.
 File: fibreSingle.pdf Graphic file (type pdf)
  <use fibreSingle.pdf>
-Package pdftex.def Info: fibreSingle.pdf used on input line 1264.
+Package pdftex.def Info: fibreSingle.pdf used on input line 1279.
 (pdftex.def)             Requested size: 452.96788pt x 341.04851pt.
-
-<fibre1024.pdf, id=615, 639.99098pt x 482.46848pt>
+ [24]
+<fibre1024.pdf, id=627, 639.99098pt x 482.46848pt>
 File: fibre1024.pdf Graphic file (type pdf)
  <use fibre1024.pdf>
-Package pdftex.def Info: fibre1024.pdf used on input line 1272.
+Package pdftex.def Info: fibre1024.pdf used on input line 1287.
 (pdftex.def)             Requested size: 639.98943pt x 482.4673pt.
 File: fibre1024.pdf Graphic file (type pdf)
 
 <use fibre1024.pdf>
-Package pdftex.def Info: fibre1024.pdf used on input line 1272.
+Package pdftex.def Info: fibre1024.pdf used on input line 1287.
 (pdftex.def)             Requested size: 452.96788pt x 341.48755pt.
  [25 <./fibreSingle.pdf>] [26 <./fibre1024.pdf>] [27]
 [28]
-Underfull \vbox (badness 10000) detected at line 1478
+Underfull \vbox (badness 10000) detected at line 1493
  []
 
 
-Underfull \vbox (badness 10000) detected at line 1478
+Underfull \vbox (badness 10000) detected at line 1493
  []
 
-[29] [30] [31]
+[29] [30]
 LaTeX Font Info:    Font shape `T1/pcr/bx/it' in size <9> not available
-(Font)              Font shape `T1/pcr/b/it' tried instead on input line 1665.
+(Font)              Font shape `T1/pcr/b/it' tried instead on input line 1680.
 LaTeX Font Info:    Font shape `T1/pcr/b/it' in size <9> not available
-(Font)              Font shape `T1/pcr/b/sl' tried instead on input line 1665.
-
-Overfull \vbox (0.87749pt too high) detected at line 1726
- []
-
-[32]
-Underfull \vbox (badness 10000) detected at line 1726
+(Font)              Font shape `T1/pcr/b/sl' tried instead on input line 1680.
+ [31]
+Underfull \vbox (badness 10000) detected at line 1741
  []
 
 
-Underfull \vbox (badness 10000) detected at line 1726
+Underfull \vbox (badness 10000) detected at line 1741
  []
 
-[33] [34] <groundstateU2.pdf, id=683, 467.32591pt x 333.245pt>
+[32] [33] [34] <groundstateU2.pdf, id=696, 467.32591pt x 333.245pt>
 File: groundstateU2.pdf Graphic file (type pdf)
 
 <use groundstateU2.pdf>
-Package pdftex.def Info: groundstateU2.pdf used on input line 1804.
+Package pdftex.def Info: groundstateU2.pdf used on input line 1819.
 (pdftex.def)             Requested size: 467.32477pt x 333.24417pt.
 File: groundstateU2.pdf Graphic file (type pdf)
  <use groundstateU2.pdf>
-Package pdftex.def Info: groundstateU2.pdf used on input line 1804.
+Package pdftex.def Info: groundstateU2.pdf used on input line 1819.
 (pdftex.def)             Requested size: 452.96788pt x 323.01334pt.
 
-<groundstateU20.pdf, id=684, 467.32591pt x 333.245pt>
+<groundstateU20.pdf, id=697, 467.32591pt x 333.245pt>
 File: groundstateU20.pdf Graphic file (type pdf)
  <use groundstateU20.pdf>
-Package pdftex.def Info: groundstateU20.pdf used on input line 1810.
+Package pdftex.def Info: groundstateU20.pdf used on input line 1825.
 (pdftex.def)             Requested size: 467.32477pt x 333.24417pt.
 File: groundstateU20.pdf Graphic file (type pdf)
 
 <use groundstateU20.pdf>
-Package pdftex.def Info: groundstateU20.pdf used on input line 1810.
+Package pdftex.def Info: groundstateU20.pdf used on input line 1825.
 (pdftex.def)             Requested size: 452.96788pt x 323.01334pt.
- [35] [36 <./groundstateU2.pdf>]
-Underfull \vbox (badness 10000) detected at line 1938
+ [35 <./groundstateU2.pdf>] [36 <./groundstateU20.pdf>]
+Underfull \vbox (badness 10000) detected at line 1953
  []
 
 
-Underfull \vbox (badness 10000) detected at line 1938
+Underfull \vbox (badness 10000) detected at line 1953
  []
 
-[37 <./groundstateU20.pdf>]
-Underfull \vbox (badness 10000) detected at line 1938
- []
-
-
-Underfull \vbox (badness 10000) detected at line 1938
- []
-
-[38] [39]
-Underfull \vbox (badness 10000) detected at line 2073
- []
+[37] [38] [39] [40] [41] [42
 
-
-Underfull \vbox (badness 10000) detected at line 2073
- []
-
-[40] [41] [42]
+]
 Chapter 5.
 
-Overfull \hbox (116.47647pt too wide) in paragraph at lines 2127--2127
+Overfull \hbox (116.47647pt too wide) in paragraph at lines 2142--2142
 []
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 2127--2127
-
- []
-
-[43
-
-] [44]
-Underfull \vbox (badness 10000) detected at line 2346
- []
-
+Underfull \hbox (badness 10000) in paragraph at lines 2142--2142
 
-Underfull \vbox (badness 10000) detected at line 2346
  []
 
-[45] [46] [47] [48]
-Underfull \hbox (badness 10000) in paragraph at lines 2525--2526
+[43]
+LaTeX Font Info:    Font shape `T1/pcr/m/it' in size <10> not available
+(Font)              Font shape `T1/pcr/m/sl' tried instead on input line 2220.
+ [44] [45] [46] [47] [48]
+Underfull \hbox (badness 10000) in paragraph at lines 2549--2550
 []\T1/ptm/m/n/10 When the \T1/pcr/m/n/10 arguments_test \T1/ptm/m/n/10 ex-e-cut
 able is run, it will cre-ate out-put files named
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 2525--2526
+Underfull \hbox (badness 10000) in paragraph at lines 2549--2550
 \T1/pcr/m/n/10 arguments_test.number_7.pulse_shape_gaussian.size_20.0.xsil \T1/
 ptm/m/n/10 and
  []
 
 LaTeX Font Info:    Font shape `T1/phv/bx/n' in size <9> not available
-(Font)              Font shape `T1/phv/b/n' tried instead on input line 2529.
+(Font)              Font shape `T1/phv/b/n' tried instead on input line 2553.
 [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63]
 [64] [65] [66] [67] [68] [69] [70] [71] [72] [73]
-<richardsonExtrapolation.png, id=1158, 523.9575pt x 338.26375pt>
+<richardsonExtrapolation.png, id=1186, 523.9575pt x 338.26375pt>
 File: richardsonExtrapolation.png Graphic file (type png)
 
 <use richardsonExtrapolation.png>
-Package pdftex.def Info: richardsonExtrapolation.png used on input line 3768.
+Package pdftex.def Info: richardsonExtrapolation.png used on input line 3794.
 (pdftex.def)             Requested size: 523.95622pt x 338.26291pt.
 File: richardsonExtrapolation.png Graphic file (type png)
  <use richardsonExtrapolation.png>
-Package pdftex.def Info: richardsonExtrapolation.png used on input line 3768.
+Package pdftex.def Info: richardsonExtrapolation.png used on input line 3794.
 (pdftex.def)             Requested size: 452.96788pt x 292.43925pt.
  [74]
-<error_scaling.png, id=1164, 1304.875pt x 978.65625pt>
+<error_scaling.png, id=1192, 1304.875pt x 978.65625pt>
 File: error_scaling.png Graphic file (type png)
  <use error_scaling.png>
-Package pdftex.def Info: error_scaling.png used on input line 3784.
+Package pdftex.def Info: error_scaling.png used on input line 3810.
 (pdftex.def)             Requested size: 1304.87183pt x 978.65387pt.
 File: error_scaling.png Graphic file (type png)
 
 <use error_scaling.png>
-Package pdftex.def Info: error_scaling.png used on input line 3784.
+Package pdftex.def Info: error_scaling.png used on input line 3810.
 (pdftex.def)             Requested size: 452.96788pt x 339.7274pt.
  [75 <./richardsonExtrapolation.png>] [76 <./error_scaling.png (PNG copy)>]
 Chapter 6.
 [77
 
-] [78] [79] <FourierTransformEx1.pdf, id=1191, 337.26pt x 261.97874pt>
+] [78] [79] <FourierTransformEx1.pdf, id=1218, 337.26pt x 261.97874pt>
 File: FourierTransformEx1.pdf Graphic file (type pdf)
 
 <use FourierTransformEx1.pdf>
-Package pdftex.def Info: FourierTransformEx1.pdf used on input line 3973.
+Package pdftex.def Info: FourierTransformEx1.pdf used on input line 3999.
 (pdftex.def)             Requested size: 337.25917pt x 261.9781pt.
 File: FourierTransformEx1.pdf Graphic file (type pdf)
  <use FourierTransformEx1.pdf>
-Package pdftex.def Info: FourierTransformEx1.pdf used on input line 3973.
+Package pdftex.def Info: FourierTransformEx1.pdf used on input line 3999.
 (pdftex.def)             Requested size: 337.25917pt x 261.9781pt.
 
-<FourierTransformEx2.pdf, id=1192, 515.9275pt x 224.84pt>
+<FourierTransformEx2.pdf, id=1219, 515.9275pt x 224.84pt>
 File: FourierTransformEx2.pdf Graphic file (type pdf)
 
 <use FourierTransformEx2.pdf>
-Package pdftex.def Info: FourierTransformEx2.pdf used on input line 3982.
+Package pdftex.def Info: FourierTransformEx2.pdf used on input line 4008.
 (pdftex.def)             Requested size: 515.92624pt x 224.83945pt.
 File: FourierTransformEx2.pdf Graphic file (type pdf)
  <use FourierTransformEx2.pdf>
-Package pdftex.def Info: FourierTransformEx2.pdf used on input line 3982.
+Package pdftex.def Info: FourierTransformEx2.pdf used on input line 4008.
 (pdftex.def)             Requested size: 452.96788pt x 197.40694pt.
- [80 <./FourierTransformEx1.pdf>] <FourierTransformEx3.pdf, id=1260, 515.9275pt
+ [80 <./FourierTransformEx1.pdf>] <FourierTransformEx3.pdf, id=1287, 515.9275pt
  x 255.95625pt>
 File: FourierTransformEx3.pdf Graphic file (type pdf)
 
 <use FourierTransformEx3.pdf>
-Package pdftex.def Info: FourierTransformEx3.pdf used on input line 3993.
+Package pdftex.def Info: FourierTransformEx3.pdf used on input line 4019.
 (pdftex.def)             Requested size: 515.92624pt x 255.95561pt.
 File: FourierTransformEx3.pdf Graphic file (type pdf)
  <use FourierTransformEx3.pdf>
-Package pdftex.def Info: FourierTransformEx3.pdf used on input line 3993.
+Package pdftex.def Info: FourierTransformEx3.pdf used on input line 4019.
 (pdftex.def)             Requested size: 452.96788pt x 224.72664pt.
 LaTeX Font Info:    Font shape `T1/pcr/bx/n' in size <14.4> not available
-(Font)              Font shape `T1/pcr/b/n' tried instead on input line 3999.
+(Font)              Font shape `T1/pcr/b/n' tried instead on input line 4025.
  [81 <./FourierTransformEx2.pdf> <./FourierTransformEx3.pdf>] [82]
 Chapter 7.
 [83
@@ -1279,77 +1390,77 @@ Chapter 10.
 ]
 Chapter 11.
 [95]
-Overfull \hbox (32.81522pt too wide) in paragraph at lines 4445--4447
+Overfull \hbox (32.81522pt too wide) in paragraph at lines 4470--4472
 [][][]\T1/ptm/m/n/10 http://docutils.sourceforge.net/docs/user/rst/quickref.htm
 l[][] [][]http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html[][
 ] 
  []
 
-<IntroduceNewElement.png, id=1599, 364.18411pt x 712.7806pt>
+<IntroduceNewElement.png, id=1626, 364.18411pt x 712.7806pt>
 File: IntroduceNewElement.png Graphic file (type png)
 
 <use IntroduceNewElement.png>
-Package pdftex.def Info: IntroduceNewElement.png used on input line 4458.
+Package pdftex.def Info: IntroduceNewElement.png used on input line 4483.
 (pdftex.def)             Requested size: 364.18321pt x 712.77885pt.
 File: IntroduceNewElement.png Graphic file (type png)
  <use IntroduceNewElement.png>
-Package pdftex.def Info: IntroduceNewElement.png used on input line 4458.
+Package pdftex.def Info: IntroduceNewElement.png used on input line 4483.
 (pdftex.def)             Requested size: 364.18321pt x 712.77885pt.
  [96] [97]
 Overfull \vbox (47.17236pt too high) has occurred while \output is active []
 
 
 [98 <./IntroduceNewElement.png>]
-<IntroduceNewIntegrationTechnique.png, id=1612, 243.73412pt x 772.29706pt>
+<IntroduceNewIntegrationTechnique.png, id=1639, 243.73412pt x 772.29706pt>
 File: IntroduceNewIntegrationTechnique.png Graphic file (type png)
 
 <use IntroduceNewIntegrationTechnique.png>
 Package pdftex.def Info: IntroduceNewIntegrationTechnique.png used on input lin
-e 4483.
+e 4508.
 (pdftex.def)             Requested size: 243.73352pt x 772.29518pt.
 File: IntroduceNewIntegrationTechnique.png Graphic file (type png)
 
 <use IntroduceNewIntegrationTechnique.png>
 Package pdftex.def Info: IntroduceNewIntegrationTechnique.png used on input lin
-e 4483.
+e 4508.
 (pdftex.def)             Requested size: 243.73352pt x 772.29518pt.
 LaTeX Font Info:    Font shape `T1/pcr/bx/n' in size <10> not available
-(Font)              Font shape `T1/pcr/b/n' tried instead on input line 4485.
+(Font)              Font shape `T1/pcr/b/n' tried instead on input line 4510.
  [99] [100]
 Overfull \vbox (124.68869pt too high) has occurred while \output is active []
 
 
 [101 <./IntroduceNewIntegrationTechnique.png>]
-Underfull \hbox (badness 10000) in paragraph at lines 4487--4488
+Underfull \hbox (badness 10000) in paragraph at lines 4512--4513
 []\T1/ptm/m/n/10 Navigate to the \T1/pcr/m/n/10 xpdeint/Segments/Integrators \T
 1/ptm/m/n/10 di-rec-tory. Cre-ate a file called
  []
 
-<Overall_Flowchart.png, id=1626, 323.08942pt x 753.87529pt>
+<Overall_Flowchart.png, id=1654, 323.08942pt x 753.87529pt>
 File: Overall_Flowchart.png Graphic file (type png)
 
 <use Overall_Flowchart.png>
-Package pdftex.def Info: Overall_Flowchart.png used on input line 4524.
+Package pdftex.def Info: Overall_Flowchart.png used on input line 4549.
 (pdftex.def)             Requested size: 323.08862pt x 753.87344pt.
 File: Overall_Flowchart.png Graphic file (type png)
  <use Overall_Flowchart.png>
-Package pdftex.def Info: Overall_Flowchart.png used on input line 4524.
+Package pdftex.def Info: Overall_Flowchart.png used on input line 4549.
 (pdftex.def)             Requested size: 323.08862pt x 753.87344pt.
  [102] [103]
 Overfull \vbox (81.02339pt too high) has occurred while \output is active []
 
 
 [104 <./Overall_Flowchart.png>]
-<Subprocess3_ParsingXMLFile.png, id=1641, 717.03177pt x 1296.60883pt>
+<Subprocess3_ParsingXMLFile.png, id=1669, 717.03177pt x 1296.60883pt>
 File: Subprocess3_ParsingXMLFile.png Graphic file (type png)
 
 <use Subprocess3_ParsingXMLFile.png>
-Package pdftex.def Info: Subprocess3_ParsingXMLFile.png used on input line 4531
+Package pdftex.def Info: Subprocess3_ParsingXMLFile.png used on input line 4556
 .
 (pdftex.def)             Requested size: 717.03001pt x 1296.60567pt.
 File: Subprocess3_ParsingXMLFile.png Graphic file (type png)
  <use Subprocess3_ParsingXMLFile.png>
-Package pdftex.def Info: Subprocess3_ParsingXMLFile.png used on input line 4531
+Package pdftex.def Info: Subprocess3_ParsingXMLFile.png used on input line 4556
 .
 (pdftex.def)             Requested size: 452.96788pt x 819.12334pt.
 
@@ -1358,79 +1469,79 @@ Overfull \vbox (146.27328pt too high) has occurred while \output is active []
 
 
 [107 <./Subprocess3_ParsingXMLFile.png>]
-<Subprocess3_4_parseXMLDocument.png, id=1657, 443.53941pt x 1091.1353pt>
+<Subprocess3_4_parseXMLDocument.png, id=1684, 443.53941pt x 1091.1353pt>
 File: Subprocess3_4_parseXMLDocument.png Graphic file (type png)
 
 <use Subprocess3_4_parseXMLDocument.png>
 Package pdftex.def Info: Subprocess3_4_parseXMLDocument.png used on input line 
-4538.
+4563.
 (pdftex.def)             Requested size: 443.53831pt x 1091.13263pt.
 File: Subprocess3_4_parseXMLDocument.png Graphic file (type png)
 
 <use Subprocess3_4_parseXMLDocument.png>
 Package pdftex.def Info: Subprocess3_4_parseXMLDocument.png used on input line 
-4538.
+4563.
 (pdftex.def)             Requested size: 443.53831pt x 1091.13263pt.
  [108] [109]
 Overfull \vbox (432.28258pt too high) has occurred while \output is active []
 
 
 [110 <./Subprocess3_4_parseXMLDocument.png>]
-<Subprocess3_4_11_ParseTopLvlSeqElements.png, id=1671, 1071.29646pt x 919.67117
+<Subprocess3_4_11_ParseTopLvlSeqElements.png, id=1698, 1071.29646pt x 919.67117
 pt>
 File: Subprocess3_4_11_ParseTopLvlSeqElements.png Graphic file (type png)
  <use Subprocess3_4_11_ParseTopLvlSeqElements.png>
 Package pdftex.def Info: Subprocess3_4_11_ParseTopLvlSeqElements.png used on in
-put line 4545.
+put line 4570.
 (pdftex.def)             Requested size: 1071.29385pt x 919.66893pt.
 File: Subprocess3_4_11_ParseTopLvlSeqElements.png Graphic file (type png)
 
 <use Subprocess3_4_11_ParseTopLvlSeqElements.png>
 Package pdftex.def Info: Subprocess3_4_11_ParseTopLvlSeqElements.png used on in
-put line 4545.
+put line 4570.
 (pdftex.def)             Requested size: 452.96788pt x 388.85538pt.
 
-<Subprocess3_4_11_2_ParseIntegrateElement.png, id=1672, 1016.03117pt x 1358.959
+<Subprocess3_4_11_2_ParseIntegrateElement.png, id=1699, 1016.03117pt x 1358.959
 41pt>
 File: Subprocess3_4_11_2_ParseIntegrateElement.png Graphic file (type png)
  <use Subprocess3_4_11_2_ParseIntegrateElement.png>
 Package pdftex.def Info: Subprocess3_4_11_2_ParseIntegrateElement.png used on i
-nput line 4552.
+nput line 4577.
 (pdftex.def)             Requested size: 1016.0287pt x 1358.9561pt.
 File: Subprocess3_4_11_2_ParseIntegrateElement.png Graphic file (type png)
 
 <use Subprocess3_4_11_2_ParseIntegrateElement.png>
 Package pdftex.def Info: Subprocess3_4_11_2_ParseIntegrateElement.png used on i
-nput line 4552.
+nput line 4577.
 (pdftex.def)             Requested size: 452.96788pt x 605.86516pt.
  [111 <./Subprocess3_4_11_ParseTopLvlSeqElements.png>] [112 <./Subprocess3_4_11
 _2_ParseIntegrateElement.png>]
-Overfull \hbox (34.13051pt too wide) in paragraph at lines 4568--4568
+Overfull \hbox (34.13051pt too wide) in paragraph at lines 4593--4593
 []
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 4568--4568
+Underfull \hbox (badness 10000) in paragraph at lines 4593--4593
 
  []
 
 
-Overfull \hbox (216.03926pt too wide) in paragraph at lines 4583--4583
+Overfull \hbox (216.03926pt too wide) in paragraph at lines 4608--4608
 []
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 4583--4583
+Underfull \hbox (badness 10000) in paragraph at lines 4608--4608
 
  []
 
 
-Overfull \hbox (58.00885pt too wide) in paragraph at lines 4592--4592
+Overfull \hbox (58.00885pt too wide) in paragraph at lines 4617--4617
 []
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 4592--4592
+Underfull \hbox (badness 10000) in paragraph at lines 4617--4617
 
  []
 
@@ -1448,48 +1559,50 @@ Chapter 13.
 ] [130] [131
 
 ])
-Package atveryend Info: Empty hook `BeforeClearDocument' on input line 5279.
-Package atveryend Info: Empty hook `AfterLastShipout' on input line 5279.
+Package atveryend Info: Empty hook `BeforeClearDocument' on input line 5334.
+Package atveryend Info: Empty hook `AfterLastShipout' on input line 5334.
  (./xmds2.aux)
-Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 5279.
-Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 5279.
+Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 5334.
+Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 5334.
 
 Package rerunfilecheck Info: File `xmds2.out' has not changed.
-(rerunfilecheck)             Checksum: 1B84A7C91A90F86D42D95E438D3F05AC;4808.
-Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 5279.
+(rerunfilecheck)             Checksum: 29042C09C5E3D3D0E626E2E81301EB07;5028.
+Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 5334.
  ) 
 Here is how much of TeX's memory you used:
- 9940 strings out of 493481
- 145389 string characters out of 3140966
- 261412 words of memory out of 3000000
- 12572 multiletter control sequences out of 15000+200000
- 87153 words of font info for 100 fonts, out of 3000000 for 9000
- 958 hyphenation exceptions out of 8191
- 36i,28n,49p,7668b,658s stack positions out of 5000i,500n,10000p,200000b,50000s
-{/usr/local/texlive/2012/texmf-dist/fonts/enc/dvips/base/8r.enc}</usr/local/t
-exlive/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/local/te
-xlive/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/local/tex
-live/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/local/texl
-ive/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/local/texliv
-e/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/local/texlive/
-2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/local/texlive/20
-12/texmf-dist/fonts/type1/public/amsfonts/cm/cmr5.pfb></usr/local/texlive/2012/
-texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb></usr/local/texlive/2012/tex
-mf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/local/texlive/2012/texm
-f-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/local/texlive/2012/texmf-
-dist/fonts/type1/urw/courier/ucrb8a.pfb></usr/local/texlive/2012/texmf-dist/fon
-ts/type1/urw/courier/ucrbo8a.pfb></usr/local/texlive/2012/texmf-dist/fonts/type
-1/urw/courier/ucrr8a.pfb></usr/local/texlive/2012/texmf-dist/fonts/type1/urw/co
-urier/ucrro8a.pfb></usr/local/texlive/2012/texmf-dist/fonts/type1/urw/helvetic/
-uhvb8a.pfb></usr/local/texlive/2012/texmf-dist/fonts/type1/urw/helvetic/uhvbo8a
-.pfb></usr/local/texlive/2012/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb></
-usr/local/texlive/2012/texmf-dist/fonts/type1/urw/times/utmb8a.pfb></usr/local/
-texlive/2012/texmf-dist/fonts/type1/urw/times/utmr8a.pfb></usr/local/texlive/20
-12/texmf-dist/fonts/type1/urw/times/utmri8a.pfb>
-Output written on xmds2.pdf (135 pages, 7007925 bytes).
+ 10563 strings out of 494953
+ 154161 string characters out of 6180977
+ 265027 words of memory out of 5000000
+ 13110 multiletter control sequences out of 15000+600000
+ 91676 words of font info for 119 fonts, out of 8000000 for 9000
+ 15 hyphenation exceptions out of 8191
+ 36i,28n,49p,1198b,658s stack positions out of 5000i,500n,10000p,200000b,80000s
+{/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc}</usr/share/texliv
+e/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></usr/share/texlive/texm
+f-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></usr/share/texlive/texmf-dist
+/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texlive/texmf-dist/fonts
+/type1/public/amsfonts/cm/cmmi5.pfb></usr/share/texlive/texmf-dist/fonts/type1/
+public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/
+amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfont
+s/cm/cmr5.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr
+7.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb>
+</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/s
+hare/texlive/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10.pfb></usr/sh
+are/texlive/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm5.pfb></usr/shar
+e/texlive/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm7.pfb></usr/share/
+texlive/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb></usr/share/texlive/texmf
+-dist/fonts/type1/urw/courier/ucrbo8a.pfb></usr/share/texlive/texmf-dist/fonts/
+type1/urw/courier/ucrr8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/cou
+rier/ucrro8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvb8a
+.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvbo8a.pfb></usr/
+share/texlive/texmf-dist/fonts/type1/urw/helvetic/uhvr8a.pfb></usr/share/texliv
+e/texmf-dist/fonts/type1/urw/times/utmb8a.pfb></usr/share/texlive/texmf-dist/fo
+nts/type1/urw/times/utmr8a.pfb></usr/share/texlive/texmf-dist/fonts/type1/urw/t
+imes/utmri8a.pfb>
+Output written on xmds2.pdf (135 pages, 7020428 bytes).
 PDF statistics:
- 2145 PDF objects out of 2487 (max. 8388607)
- 1867 compressed objects within 19 object streams
- 365 named destinations out of 1000 (max. 500000)
- 633 words of extra memory for PDF output out of 10000 (max. 10000000)
+ 2181 PDF objects out of 2487 (max. 8388607)
+ 1900 compressed objects within 19 object streams
+ 369 named destinations out of 1000 (max. 500000)
+ 649 words of extra memory for PDF output out of 10000 (max. 10000000)
 
diff --git a/documentation/latex/xmds2.out b/documentation/latex/xmds2.out
index 65d3f69..1656c85 100644
--- a/documentation/latex/xmds2.out
+++ b/documentation/latex/xmds2.out
@@ -54,11 +54,13 @@
 \BOOKMARK [1][-]{section.12.1}{GNU General Public License}{chapter.12}% 54
 \BOOKMARK [1][-]{section.12.2}{GNU Free Documentation License}{chapter.12}% 55
 \BOOKMARK [0][-]{chapter.13}{News}{}% 56
-\BOOKMARK [1][-]{section.13.1}{XMDS 2.2.1 ``XMDS2 is a game of two halves'' \(September 30, 2014\)}{chapter.13}% 57
-\BOOKMARK [1][-]{section.13.2}{XMDS 2.2.0 ``Out of cheese error'' \(January 13, 2014\)}{chapter.13}% 58
-\BOOKMARK [1][-]{section.13.3}{XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' \(September 27, 2013\)}{chapter.13}% 59
-\BOOKMARK [1][-]{section.13.4}{XMDS 2.1.3 ``Happy Mollusc'' \(June 7, 2013\)}{chapter.13}% 60
-\BOOKMARK [1][-]{section.13.5}{XMDS 2.1.2 ``Happy Mollusc'' \(October 15, 2012\)}{chapter.13}% 61
-\BOOKMARK [1][-]{section.13.6}{XMDS 2.1 ``Happy Mollusc'' \(June 14, 2012\)}{chapter.13}% 62
-\BOOKMARK [1][-]{section.13.7}{XMDS 2.0 ``Shiny!'' \(September 13, 2010\)}{chapter.13}% 63
-\BOOKMARK [0][-]{section*.55}{Index}{}% 64
+\BOOKMARK [1][-]{section.13.1}{XMDS 2.2.3 ``It came from the deep'' \(January 20, 2017\)}{chapter.13}% 57
+\BOOKMARK [1][-]{section.13.2}{XMDS 2.2.2 ``XMDS2 is a game of two halves'' \(October 13, 2014\)}{chapter.13}% 58
+\BOOKMARK [1][-]{section.13.3}{XMDS 2.2.1 ``XMDS2 is a game of two halves'' \(September 30, 2014\)}{chapter.13}% 59
+\BOOKMARK [1][-]{section.13.4}{XMDS 2.2.0 ``Out of cheese error'' \(January 13, 2014\)}{chapter.13}% 60
+\BOOKMARK [1][-]{section.13.5}{XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' \(September 27, 2013\)}{chapter.13}% 61
+\BOOKMARK [1][-]{section.13.6}{XMDS 2.1.3 ``Happy Mollusc'' \(June 7, 2013\)}{chapter.13}% 62
+\BOOKMARK [1][-]{section.13.7}{XMDS 2.1.2 ``Happy Mollusc'' \(October 15, 2012\)}{chapter.13}% 63
+\BOOKMARK [1][-]{section.13.8}{XMDS 2.1 ``Happy Mollusc'' \(June 14, 2012\)}{chapter.13}% 64
+\BOOKMARK [1][-]{section.13.9}{XMDS 2.0 ``Shiny!'' \(September 13, 2010\)}{chapter.13}% 65
+\BOOKMARK [0][-]{section*.55}{Index}{}% 66
diff --git a/documentation/latex/xmds2.pdf b/documentation/latex/xmds2.pdf
index eef74b8..cfac439 100644
Binary files a/documentation/latex/xmds2.pdf and b/documentation/latex/xmds2.pdf differ
diff --git a/documentation/latex/xmds2.tex b/documentation/latex/xmds2.tex
index 0e60810..8713881 100644
--- a/documentation/latex/xmds2.tex
+++ b/documentation/latex/xmds2.tex
@@ -5,20 +5,29 @@
 \DeclareUnicodeCharacter{00A0}{\nobreakspace}
 \usepackage{cmap}
 \usepackage[T1]{fontenc}
+\usepackage{amsfonts}
 \usepackage{babel}
 \usepackage{times}
 \usepackage[Bjarne]{fncychap}
 \usepackage{longtable}
 \usepackage{sphinx}
 \usepackage{multirow}
+\usepackage{eqparbox}
+
+
+\addto\captionsenglish{\renewcommand{\figurename}{Fig. }}
+\addto\captionsenglish{\renewcommand{\tablename}{Table }}
+\SetupFloatingEnvironment{literal-block}{name=Listing }
+
 
 
 \title{XMDS2 Documentation}
-\date{October 14, 2014}
-\release{2.2.2}
+\date{January 21, 2017}
+\release{2.2.3}
 \author{Graham Dennis, Joe Hope and Mattias Johnsson}
 \newcommand{\sphinxlogo}{\includegraphics{xmds_logo.pdf}\par}
 \renewcommand{\releasename}{Release}
+\setcounter{tocdepth}{1}
 \makeindex
 
 \makeatletter
@@ -33,7 +42,7 @@
 \def\PYG#1#2{\PYG at reset\PYG at toks#1+\relax+\PYG at do{#2}}
 
 \expandafter\def\csname PYG at tok@gu\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}}
-\expandafter\def\csname PYG at tok@gt\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
+\expandafter\def\csname PYG at tok@ch\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
 \expandafter\def\csname PYG at tok@gs\endcsname{\let\PYG at bf=\textbf}
 \expandafter\def\csname PYG at tok@gr\endcsname{\def\PYG at tc##1{\textcolor[rgb]{1.00,0.00,0.00}{##1}}}
 \expandafter\def\csname PYG at tok@cm\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
@@ -42,7 +51,7 @@
 \expandafter\def\csname PYG at tok@mh\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@cs\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}\def\PYG at bc##1{\setlength{\fboxsep}{0pt}\colorbox[rgb]{1.00,0.94,0.94}{\strut ##1}}}
 \expandafter\def\csname PYG at tok@ge\endcsname{\let\PYG at it=\textit}
-\expandafter\def\csname PYG at tok@gd\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
+\expandafter\def\csname PYG at tok@gt\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}}
 \expandafter\def\csname PYG at tok@il\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@go\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.20,0.20,0.20}{##1}}}
 \expandafter\def\csname PYG at tok@cp\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
@@ -59,32 +68,35 @@
 \expandafter\def\csname PYG at tok@ne\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@nf\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.02,0.16,0.49}{##1}}}
 \expandafter\def\csname PYG at tok@si\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.44,0.63,0.82}{##1}}}
-\expandafter\def\csname PYG at tok@s2\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
+\expandafter\def\csname PYG at tok@kp\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@vi\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
 \expandafter\def\csname PYG at tok@nt\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.02,0.16,0.45}{##1}}}
 \expandafter\def\csname PYG at tok@nv\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
 \expandafter\def\csname PYG at tok@s1\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
+\expandafter\def\csname PYG at tok@kd\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@vc\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.73,0.38,0.84}{##1}}}
 \expandafter\def\csname PYG at tok@sh\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
 \expandafter\def\csname PYG at tok@ow\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@sx\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}}
 \expandafter\def\csname PYG at tok@bp\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\expandafter\def\csname PYG at tok@s2\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
 \expandafter\def\csname PYG at tok@c1\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
+\expandafter\def\csname PYG at tok@o\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
 \expandafter\def\csname PYG at tok@kc\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@c\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
 \expandafter\def\csname PYG at tok@mf\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@err\endcsname{\def\PYG at bc##1{\setlength{\fboxsep}{0pt}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}
-\expandafter\def\csname PYG at tok@kd\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\expandafter\def\csname PYG at tok@mb\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@ss\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
 \expandafter\def\csname PYG at tok@sr\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.14,0.33,0.53}{##1}}}
 \expandafter\def\csname PYG at tok@mo\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@kn\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@mi\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.13,0.50,0.31}{##1}}}
 \expandafter\def\csname PYG at tok@gp\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.78,0.36,0.04}{##1}}}
-\expandafter\def\csname PYG at tok@o\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}}
+\expandafter\def\csname PYG at tok@cpf\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.25,0.50,0.56}{##1}}}
 \expandafter\def\csname PYG at tok@kr\endcsname{\let\PYG at bf=\textbf\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
 \expandafter\def\csname PYG at tok@s\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
-\expandafter\def\csname PYG at tok@kp\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.00,0.44,0.13}{##1}}}
+\expandafter\def\csname PYG at tok@gd\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}}
 \expandafter\def\csname PYG at tok@w\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}}
 \expandafter\def\csname PYG at tok@kt\endcsname{\def\PYG at tc##1{\textcolor[rgb]{0.56,0.13,0.00}{##1}}}
 \expandafter\def\csname PYG at tok@sc\endcsname{\let\PYG at it=\textit\def\PYG at tc##1{\textcolor[rgb]{0.32,0.47,0.09}{##1}}}
@@ -114,6 +126,8 @@
 \def\PYGZrb{]}
 \makeatother
 
+\renewcommand\PYGZsq{\textquotesingle}
+
 \begin{document}
 
 \maketitle
@@ -138,9 +152,9 @@ Detailed advice on input/output issues, and ways to code more complicated simula
 
 XMDS2 should be cited as \href{http://dx.doi.org/10.1016/j.cpc.2012.08.016}{Comput. Phys. Commun. 184, 201-208 (2013)}.
 \phantomsection\label{introduction:xmdshistory}
-\textbf{History:}   \textbf{XMDS} was created in 1997 by Peter Drummond and Greg Collecutt, who conceived of the idea of using an XML-based code generator to simplify the process of integrating systems of equations with arbitrary dimension \footnote{
+\textbf{History:}   \textbf{XMDS} was created in 1997 by Peter Drummond and Greg Collecutt, who conceived of the idea of using an XML-based code generator to simplify the process of integrating systems of equations with arbitrary dimension \footnote[1]{
 G.R.Collecutt and P.D.Drummond, \emph{Xmds: eXtensible multi-dimensional simulator}, Comput. Phys. Commun. \textbf{142}, 219 (2001).
-}.  The first version was written in C, and featured a very flexible, strongly convergent stochastic algorithm: the {\hyperref[reference_elements:si]{\emph{semi-implicit algorithm}}} \footnote{
+}.  The first version was written in C, and featured a very flexible, strongly convergent stochastic algorithm: the {\hyperref[reference_elements:si]{\emph{semi-implicit algorithm}}} \footnote[2]{
 M.J.Werner and P.D.Drummond, \emph{Robust algorithms for solving stochastic partial differential equations}, J. Comput. Phys. \textbf{132}, 312 (1997).
 }.  Released under a public licence, it began to receive attention across several research groups.  Over the next few years several people helped add new algorithms and features.
 
@@ -172,21 +186,21 @@ Linux (Ubuntu/Debian/Fedora/RedHat)
  & 
 \href{http://svn.code.sf.net/p/xmds/code/trunk/xpdeint/admin/linux\_installer.sh}{Download Linux shell script installer}
  & 
-{\hyperref[installation:linux-installation]{\emph{Learn more}}}
-\\\hline
-
+{\hyperref[installation:linux\string-installation]{\emph{Learn more}}}
+\\
+\hline
 OS X 10.6 / 10.7 / 10.8 / 10.9
  & 
 \href{http://sourceforge.net/projects/xmds/files}{Download OS X Installer}
  & 
-{\hyperref[installation:mac-installation]{\emph{Learn more}}}
-\\\hline
-
+{\hyperref[installation:mac\string-installation]{\emph{Learn more}}}
+\\
+\hline
 Other systems
  & 
 {\hyperref[installation:manualinstallation]{\emph{Install from source}}}
- & \\\hline
-\end{tabulary}
+ & \\
+\hline\end{tabulary}
 
 
 If you have one of the supported operating systems listed above, but you find the installer doesn't work for you, please let us know by emailing xmds-devel \textless{}at\textgreater{} lists.sourceforge.net. If you'd like to tweak the linux installer to work on a distribution we haven't tested, we'd love you to do that and let us know!
@@ -276,8 +290,9 @@ Download this file, and expand it in a directory where you want to keep the prog
 Developer-only instructions: You can instead check out a working copy of the source using SVN.
 In a directory where you want to check out the repository, run:
 \code{svn checkout https://svn.code.sf.net/p/xmds/code/trunk/xpdeint .}
-
 (Only do this once.  To update your copy, type \code{svn up} or \code{make update} in the same directory, and then repeat any developer-only instructions below).
+A checkout with read/write permissions requires a checkout with your login details.  e.g.:
+\code{svn checkout -{-}username=myusername https://myusername@svn.code.sf.net/p/xmds/code/trunk/xpdeint .}
 
 \end{itemize}
 
@@ -431,7 +446,7 @@ After downloading the source, execute \code{python ./setup.py build} in the sour
 \end{enumerate}
 
 \item {} \begin{description}
-\item[{Install XMDS2 into your python path by running (in the xmds-2.2.1/ directory):}] \leavevmode
+\item[{Install XMDS2 into your python path by running (in the xmds-2.2.3/ directory):}] \leavevmode
 \code{sudo ./setup.py develop}
 
 If you want to install it into your home directory, type \code{./setup.py develop -{-}prefix=\textasciitilde{}}
@@ -441,13 +456,13 @@ This step requires access to the net, as it downloads any dependent packages.  I
 \item {} \begin{description}
 \item[{Developer only instructions:}] \leavevmode
 The Cheetah templates (*.tmpl) must be compiled into python.
-To do this, run \code{make} in the xmds-2.2.1/ directory.
+To do this, run \code{make} in the xmds-2.2.3/ directory.
 
 \end{description}
 
 \item {} \begin{description}
 \item[{Developer-only instructions:}] \leavevmode
-If you have `numpy' installed, test XMDS2 by typing \code{./run\_tests.py} in the xmds-2.2.1/ directory.
+If you have `numpy' installed, test XMDS2 by typing \code{./run\_tests.py} in the xmds-2.2.3/ directory.
 The package `numpy' is one of the optional packages, with installation instructions below.
 
 \end{description}
@@ -457,11 +472,11 @@ The package `numpy' is one of the optional packages, with installation instructi
 To build the user documentation, you first need to install sphinx, either via your package manager or:
 \code{sudo easy\_install Sphinx}
 
-Then, to build the documentation, in the xmds-2.2.1/admin/userdoc-source/ directory run: \code{make html}
+Then, to build the documentation, in the xmds-2.2.3/admin/userdoc-source/ directory run: \code{make html}
 
 If this results in an error, you may need to run \code{sudo ./setup.py develop}
 
-The generated html documentation will then be found at xmds-2.2.1/documentation/index.html
+The generated html documentation will then be found at xmds-2.2.3/documentation/index.html
 
 \end{description}
 
@@ -488,7 +503,7 @@ If you need to use additional compiler or link flags for XMDS2 to use certain li
 
 \end{enumerate}
 
-\textbf{Congratulations!} You should now have a fully operational copy of xmds2 and xsil2graphics2.  You can test your copy using examples from the ``xmds-2.2.1/examples'' directory, and follow the worked examples in the {\hyperref[tutorial:quickstarttutorial]{\emph{Quickstart Tutorial}}} and {\hyperref[worked_examples:workedexamples]{\emph{Worked Examples}}}.
+\textbf{Congratulations!} You should now have a fully operational copy of xmds2 and xsil2graphics2.  You can test your copy using examples from the ``xmds-2.2.3/examples'' directory, and follow the worked examples in the {\hyperref[tutorial:quickstarttutorial]{\emph{Quickstart Tutorial}}} and {\hyperref[worked_examples:workedexamples]{\emph{Worked Examples}}}.
 
 \index{Tutorial}
 
@@ -498,9 +513,9 @@ In this tutorial, we will create an XMDS2 script to solve the Lorenz Attractor,
 \begin{gather}
 \begin{split}\frac{dx}{dt} &= \sigma (y - x)\\
 \frac{dy}{dt} &= x (\rho - z) - y\\
-\frac{dz}{dt} &= xy - \beta z\end{split}\notag\\\begin{split}\end{split}\notag
+\frac{dz}{dt} &= xy - \beta z\end{split}\notag
 \end{gather}
-where we will solve with the parameters $\sigma=10$, $\rho=28$, $\beta = \frac{8}{3}$ and the initial condition $x(0) = y(0) = z(0) = 1$.
+where we will solve with the parameters \(\sigma=10\), \(\rho=28\), \(\beta = \frac{8}{3}\) and the initial condition \(x(0) = y(0) = z(0) = 1\).
 
 Below is a script that solves this problem (it's also saved as examples/lorenz.xmds in your XMDS2 directory). Don't worry if it doesn't make sense yet, soon we'll break it down into easily digestible parts.
 
@@ -642,7 +657,7 @@ ListPointPlot3D[ll]
 \end{Verbatim}
 \end{quote}
 
-{\hfill\includegraphics{lorenz.pdf}\hfill}
+{\hspace*{\fill}\includegraphics{{lorenz}.pdf}\hspace*{\fill}}
 
 ...and we see the lobes of the strange attractor.  Now let us examine the code that produced this simulation.
 
@@ -731,7 +746,7 @@ Now we come to the heart of the simulation, where we define the evolution of our
 
 Here our sequence consists of a single \code{\textless{}integrate\textgreater{}} element.  It contains several important pieces of information.  At the heart, the \code{\textless{}operators\textgreater{}} element contains the equations of motion as described above, written in a very human-readable fashion.  It also contains an \code{\textless{}integration\_vectors\textgreater{}} element, which defines which vectors are used in this integrate block.  We have only one vector defined in thi [...]
 
-All integrate blocks must define which algorithm is to be used - in this case the 8th (embedded 9th) order adaptive Runge-Kutta method, called ``ARK89''.  The details of different algorithms will be described later (FIXME: Link!), but for now all we need to know is that this algorithm requires a tolerance, and that smaller means more accurate, so we'll make it $10^{-7}$ by setting \code{tolerance="1.0e-7"}.  Finally, any integration will proceed a certain length in the propagation dimens [...]
+All integrate blocks must define which algorithm is to be used - in this case the 8th (embedded 9th) order adaptive Runge-Kutta method, called ``ARK89''.  The details of different algorithms will be described later (FIXME: Link!), but for now all we need to know is that this algorithm requires a tolerance, and that smaller means more accurate, so we'll make it \(10^{-7}\) by setting \code{tolerance="1.0e-7"}.  Finally, any integration will proceed a certain length in the propagation dime [...]
 
 The \code{\textless{}samples\textgreater{}} element says that the values of the output groups will be sampled 5000 times during this interval.  The nature of the output is defined in the last element in the simulation: the \code{\textless{}output\textgreater{}} element.
 
@@ -787,9 +802,9 @@ All of these scripts are available in the included ``examples'' folder, along wi
 \label{worked_examples:nonlinearschrodingerequation}\label{worked_examples:the-nonlinear-schrodinger-equation}\label{worked_examples:index-1}
 This worked example will show a range of new features that can be used in an \textbf{XMDS2} script, and we will also examine our first partial differential equation.  We will take the one dimensional nonlinear Schrödinger equation, which is a common nonlinear wave equation.  The equation describing this problem is:
 \begin{gather}
-\begin{split}\frac{\partial \phi}{\partial \xi} = \frac{i}{2}\frac{\partial^2 \phi}{\partial \tau^2} - \Gamma(\tau)\phi+i|\phi|^2 \phi\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial \phi}{\partial \xi} = \frac{i}{2}\frac{\partial^2 \phi}{\partial \tau^2} - \Gamma(\tau)\phi+i|\phi|^2 \phi\end{split}\notag
 \end{gather}
-where $\phi$ is a complex-valued field, and $\Gamma(\tau)$ is a $\tau$-dependent damping term.  Let us look at an XMDS2 script that integrates this equation, and then examine it in detail.
+where \(\phi\) is a complex-valued field, and \(\Gamma(\tau)\) is a \(\tau\)-dependent damping term.  Let us look at an XMDS2 script that integrates this equation, and then examine it in detail.
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -936,7 +951,7 @@ The \code{\textless{}integrate\textgreater{}} element for a partial differential
 
 There are some trivial changes from the tutorial script, such as the fact that we are using the ARK45 algorithm rather than ARK89.  Higher order algorithms are often better, but not always.  Also, since this script has multiple output groups, we have to specify how many times each of these output groups are sampled in the \code{\textless{}samples\textgreater{}} element, so there are three numbers there.  Besides the vectors that are to be integrated, we also specify that we want to use t [...]
 
-The equation of motion as written in the CDATA block looks almost identical to our desired equation of motion, except for the term based on the second derivative, which introduces an important new concept.  Inside the \code{\textless{}operators\textgreater{}} element, we can define any number of operators.  Operators are used to define functions in the transformed space of each dimension, which in this case is Fourier space.  The derivative of a function is equivalent to multiplying by $ [...]
+The equation of motion as written in the CDATA block looks almost identical to our desired equation of motion, except for the term based on the second derivative, which introduces an important new concept.  Inside the \code{\textless{}operators\textgreater{}} element, we can define any number of operators.  Operators are used to define functions in the transformed space of each dimension, which in this case is Fourier space.  The derivative of a function is equivalent to multiplying by \ [...]
 
 Operators can be explicit (\code{kind="ex"}) or in the interaction picture (\code{kind="ip"}).  The interaction picture can be more efficient, but it restricts the possible syntax of the equation of motion.  Safe utilisation of interaction picture operators will be described later, but for now let us emphasise that \textbf{explicit operators should be used} unless the user is clear what they are doing.  That said, \textbf{XMDS2} will generate an error if the user tries to use interaction [...]
 
@@ -968,7 +983,7 @@ If the lattice parameter is set to zero points, then the corresponding dimension
 \PYG{n+nt}{\PYGZlt{}/sampling\PYGZus{}group\PYGZgt{}}
 \end{Verbatim}
 
-This second output group samples the normalisation of the wavefunction $\int d\tau |\phi(\tau)|^2$ over the domain of $\tau$.  This output requires only a single real number per sample, so in the integrate element we have chosen to sample it many more times than the vectors themselves.
+This second output group samples the normalisation of the wavefunction \(\int d\tau |\phi(\tau)|^2\) over the domain of \(\tau\).  This output requires only a single real number per sample, so in the integrate element we have chosen to sample it many more times than the vectors themselves.
 
 Finally, functions of the vectors can be sampled with their dimensions in Fourier space.
 
@@ -990,11 +1005,11 @@ The final output group above samples the mod square of the Fourier-space wavefun
 \label{worked_examples:kubo}\label{worked_examples:kubo-oscillator}\label{worked_examples:index-2}
 This example demonstrates the integration of a stochastic differential equation.  We examine the Kubo oscillator, which is a complex variable whose phase is evolving according to a Wiener noise.  In a suitable rotating frame, the equation of motion for the variable is
 \begin{gather}
-\begin{split}\frac{dz}{dt} = i z \;\eta\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{dz}{dt} = i z \;\eta\end{split}\notag
 \end{gather}
-where $\eta(t)$ is the Wiener differential, and we interpret this as a Stratonovich equation.  In other common notation, this is sometimes written:
+where \(\eta(t)\) is the Wiener differential, and we interpret this as a Stratonovich equation.  In other common notation, this is sometimes written:
 \begin{gather}
-\begin{split}dz = i z \;\circ dW\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}dz = i z \;\circ dW\end{split}\notag
 \end{gather}
 Most algorithms employed by XMDS require the equations to be input in the Stratonovich form.  Ito differential equations can always be transformed into Stratonovich equations, and in this case the difference is equivalent to the choice of rotating frame.  This equation is solved by the following XMDS2 script:
 
@@ -1108,7 +1123,7 @@ The maximum step error in each moment group is given in absolute terms.  This is
 \centering
 \capstart
 
-\includegraphics{kuboSingle.pdf}
+\includegraphics{{kuboSingle}.pdf}
 \caption{The mean value of the real and imaginary components of the z variable for a single path of the simulation.}\end{figure}
 
 The average over multiple paths can be increasingly smooth.
@@ -1116,8 +1131,8 @@ The average over multiple paths can be increasingly smooth.
 \centering
 \capstart
 
-\includegraphics{kubo10000.pdf}
-\caption{The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation.  It agrees within the standard error with the expected result of $\exp(-t/2)$.}\end{figure}
+\includegraphics{{kubo10000}.pdf}
+\caption{The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation.  It agrees within the standard error with the expected result of \(\exp(-t/2)\).}\end{figure}
 
 \index{Fibre noise}
 
@@ -1125,9 +1140,9 @@ The average over multiple paths can be increasingly smooth.
 \label{worked_examples:fibre}\label{worked_examples:fibre-noise}\label{worked_examples:index-5}
 This simulation is a stochastic partial differential equation, in which a one-dimensional damped field is subject to a complex noise. This script can be found in \code{examples/fibre.xmds}.
 \begin{gather}
-\begin{split}\frac{\partial \psi}{\partial t} = -i \frac{\partial^2 \psi}{\partial x^2} -\gamma \psi+\beta \frac{1}{\sqrt{2}}\left(\eta_1(x)+i\eta_2(x)\right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial \psi}{\partial t} = -i \frac{\partial^2 \psi}{\partial x^2} -\gamma \psi+\beta \frac{1}{\sqrt{2}}\left(\eta_1(x)+i\eta_2(x)\right)\end{split}\notag
 \end{gather}
-where the noise terms $\eta_j(x,t)$ are Wiener differentials and the equation is interpreted as a Stratonovich differential equation.  On a finite grid, these increments have variance $\frac{1}{\Delta x \Delta t}$.
+where the noise terms \(\eta_j(x,t)\) are Wiener differentials and the equation is interpreted as a Stratonovich differential equation.  On a finite grid, these increments have variance \(\frac{1}{\Delta x \Delta t}\).
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -1254,14 +1269,14 @@ In this example we used four processors.  The different processors are labelled
 
 The analytic solution to the stochastic averages of this equation is given by
 \begin{gather}
-\begin{split}\langle |\psi(k,t)|^2 \rangle = \exp(-2\gamma t)|\psi(k,0)|^2 +\frac{\beta^2 L_x}{4\pi \gamma} \left(1-\exp(-2\gamma t)\right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\langle |\psi(k,t)|^2 \rangle = \exp(-2\gamma t)|\psi(k,0)|^2 +\frac{\beta^2 L_x}{4\pi \gamma} \left(1-\exp(-2\gamma t)\right)\end{split}\notag
 \end{gather}
-where $L_x$ is the length of the x domain.  We see that a single integration of these equations is quite chaotic:
+where \(L_x\) is the length of the x domain.  We see that a single integration of these equations is quite chaotic:
 \begin{figure}[htbp]
 \centering
 \capstart
 
-\includegraphics{fibreSingle.pdf}
+\includegraphics{{fibreSingle}.pdf}
 \caption{The momentum space density of the field as a function of time for a single path realisation.}\end{figure}
 
 while an average of 1024 paths (change \code{paths="8"} to \code{paths="1024"} in the \code{\textless{}driver\textgreater{}} element) converges nicely to the analytic solution:
@@ -1269,7 +1284,7 @@ while an average of 1024 paths (change \code{paths="8"} to \code{paths="1024"} i
 \centering
 \capstart
 
-\includegraphics{fibre1024.pdf}
+\includegraphics{{fibre1024}.pdf}
 \caption{The momentum space density of the field as a function of time for an average of 1024 paths.}\end{figure}
 
 \index{Integer dimensions}
@@ -1278,9 +1293,9 @@ while an average of 1024 paths (change \code{paths="8"} to \code{paths="1024"} i
 \label{worked_examples:integer-dimensions}\label{worked_examples:integerdimensionexample}\label{worked_examples:index-8}
 This example shows how to handle systems with integer-valued transverse dimensions.  We will integrate the following set of equations
 \begin{gather}
-\begin{split}\frac{dx_j}{dt} = x_j \left(x_{j-1}-x_{j+1}\right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{dx_j}{dt} = x_j \left(x_{j-1}-x_{j+1}\right)\end{split}\notag
 \end{gather}
-where $x_j$ are complex-valued variables defined on a ring, such that $j\in \{0,j_{max}\}$ and the $x_{j_{max}+1}$ variable is identified with the variable $x_{0}$, and the variable $x_{-1}$ is identified with the variable $x_{j_{max}}$.
+where \(x_j\) are complex-valued variables defined on a ring, such that \(j\in \{0,j_{max}\}\) and the \(x_{j_{max}+1}\) variable is identified with the variable \(x_{0}\), and the variable \(x_{-1}\) is identified with the variable \(x_{j_{max}}\).
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -1353,7 +1368,7 @@ x = 1.0e\PYGZhy{}3;
 x(j =\PYGZgt{} 0) = 1.0;
 \end{Verbatim}
 
-where the syntax \code{x(j =\textgreater{} 0)} is used to reference the variable $x_0$ directly.  We see a more elaborate example in the integrate CDATA block:
+where the syntax \code{x(j =\textgreater{} 0)} is used to reference the variable \(x_0\) directly.  We see a more elaborate example in the integrate CDATA block:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 dx\PYGZus{}dt(j =\PYGZgt{} j) = x(j =\PYGZgt{} j)*(x(j =\PYGZgt{} j\PYGZus{}minus\PYGZus{}one) \PYGZhy{} x(j =\PYGZgt{} j\PYGZus{}plus\PYGZus{}one));
@@ -1371,7 +1386,7 @@ This example integrates the two-dimensional partial differential equation
 - y \frac{\partial}{\partial x}\right)\\
 &\phantom{=\Bigg[} - \frac{U_{int}}{16 \hbar}\left(x\left(\frac{\partial^3}{\partial x^2 \partial y}
 +\frac{\partial^3}{\partial y^3}\right)-y\left(\frac{\partial^3}{\partial y^2 \partial x}+\frac{\partial^3}{\partial x^3}\right)\right)\Bigg]W(x,y,t)
-\end{split}\end{split}\notag\\\begin{split}\end{split}\notag
+\end{split}\end{split}\notag
 \end{gather}
 with the added restriction that the derivative is forced to zero outside a certain radius.  This extra condition helps maintain the long-term stability of the integration. The script can be found in \code{examples/wigner\_arguments\_mpi.xmds} under your XMDS2 installation directory.
 
@@ -1586,13 +1601,13 @@ which is short for
 \label{worked_examples:groundstatebec}\label{worked_examples:finding-the-ground-state-of-a-bec-continuous-renormalisation}
 This simulation solves another partial differential equation, but introduces several powerful new features in XMDS2.  The nominal problem is the calculation of the lowest energy eigenstate of a non-linear Schrödinger equation:
 \begin{gather}
-\begin{split}\frac{\partial \phi}{\partial t} = i \left[\frac{1}{2}\frac{\partial^2}{\partial y^2} - V(y) - U_{int}|\phi|^2\right]\phi\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial \phi}{\partial t} = i \left[\frac{1}{2}\frac{\partial^2}{\partial y^2} - V(y) - U_{int}|\phi|^2\right]\phi\end{split}\notag
 \end{gather}
 which can be found by evolving the above equation in imaginary time while keeping the normalisation constant.  This causes eigenstates to exponentially decay at the rate of their eigenvalue, so after a short time only the state with the lowest eigenvalue remains.  The evolution equation is straightforward:
 \begin{gather}
-\begin{split}\frac{\partial \phi}{\partial t} = \left[\frac{1}{2}\frac{\partial^2}{\partial y^2} - V(y) - U_{int}|\phi|^2\right]\phi\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial \phi}{\partial t} = \left[\frac{1}{2}\frac{\partial^2}{\partial y^2} - V(y) - U_{int}|\phi|^2\right]\phi\end{split}\notag
 \end{gather}
-but we will need to use new XMDS2 features to manage the normalisation of the function $\phi(y,t)$.  The normalisation for a non-linear Schrödinger equation is given by $\int dy |\phi(y,t)|^2 = N_{particles}$, where $N_{particles}$ is the number of particles described by the wavefunction.
+but we will need to use new XMDS2 features to manage the normalisation of the function \(\phi(y,t)\).  The normalisation for a non-linear Schrödinger equation is given by \(\int dy |\phi(y,t)|^2 = N_{particles}\), where \(N_{particles}\) is the number of particles described by the wavefunction.
 
 The code for this simulation can be found in \code{examples/groundstate\_workedexamples.xmds}:
 
@@ -1768,7 +1783,7 @@ This filter block merely prints a string into the output when the generated prog
 \PYG{n+nt}{\PYGZlt{}/filter\PYGZgt{}}
 \end{Verbatim}
 
-Since this filter depends on a vector with the transverse dimension ``y'', this filter will execute for each point in ``y''.  This code multiplies the value of the field ``phi'' by the factor required to produce a normalised function in the sense that  $\int dy |\phi(y,t)|^2 = N_{particles}$.
+Since this filter depends on a vector with the transverse dimension ``y'', this filter will execute for each point in ``y''.  This code multiplies the value of the field ``phi'' by the factor required to produce a normalised function in the sense that  \(\int dy |\phi(y,t)|^2 = N_{particles}\).
 
 The next usage of a \code{\textless{}filter\textgreater{}} element in this program is inside the \code{\textless{}integrate\textgreater{}} element, where all filters are placed inside a \code{\textless{}filters\textgreater{}} element.
 
@@ -1801,27 +1816,27 @@ This program begins with a very crude guess to the ground state, but it rapidly
 \centering
 \capstart
 
-\includegraphics{groundstateU2.pdf}
+\includegraphics{{groundstateU2}.pdf}
 \caption{The shape of the ground state rapidly approaches the lowest eigenstate.  For weak nonlinearities, it is nearly Gaussian.}\end{figure}
 \begin{figure}[htbp]
 \centering
 \capstart
 
-\includegraphics{groundstateU20.pdf}
-\caption{When the nonlinear term is larger ($U=20$), the ground state is wider and more parabolic.}\end{figure}
+\includegraphics{{groundstateU20}.pdf}
+\caption{When the nonlinear term is larger (\(U=20\)), the ground state is wider and more parabolic.}\end{figure}
 
 
 \section{Finding the Ground State of a BEC again}
 \label{worked_examples:finding-the-ground-state-of-a-bec-again}\label{worked_examples:hermitegaussgroundstatebec}
 Here we repeat the same simulation as in the {\hyperref[worked_examples:groundstatebec]{\emph{Finding the Ground State of a BEC (continuous renormalisation)}}} example, using a different transform basis.  While spectral methods are very effective, and Fourier transforms are typically very efficient due to the Fast Fourier transform algorithm, it is often desirable to describe nonlocal evolution in bases other than the Fourier basis.  The previous calculation was the Schrödinger equation  [...]
 \begin{gather}
-\begin{split}\left[-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\right]\phi_n(x) = E_n \phi_n(x)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\left[-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\right]\phi_n(x) = E_n \phi_n(x)\end{split}\notag
 \end{gather}
 where
 \begin{gather}
-\begin{split}\phi_n(x,t) = \sqrt{\frac{1}{2^n n!}} \left(\frac{m \omega}{\hbar \pi}\right)^\frac{1}{4} e^{-\frac{m \omega x^2}{2\hbar}} H_n\left(\sqrt{\frac{m \omega}{\hbar}x}\right),\;\;\;\;\;\;E_n = \left(n+\frac{1}{2}\right) \omega\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\phi_n(x,t) = \sqrt{\frac{1}{2^n n!}} \left(\frac{m \omega}{\hbar \pi}\right)^\frac{1}{4} e^{-\frac{m \omega x^2}{2\hbar}} H_n\left(\sqrt{\frac{m \omega}{\hbar}x}\right),\;\;\;\;\;\;E_n = \left(n+\frac{1}{2}\right) \omega\end{split}\notag
 \end{gather}
-where $H_n(u)$ are the physicist's version of the Hermite polynomials.  Rather than describing the derivatives as diagonal terms in Fourier space, we therefore have the option of describing the entire $-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2$ term as a diagonal term in the Hermite-Gaussian basis.  Here is an XMDS2 simulation that performs the integration in this basis. The following is a simplified version of the \code{examples/hermitegauss\_groundstat [...]
+where \(H_n(u)\) are the physicist's version of the Hermite polynomials.  Rather than describing the derivatives as diagonal terms in Fourier space, we therefore have the option of describing the entire \(-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\) term as a diagonal term in the Hermite-Gaussian basis.  Here is an XMDS2 simulation that performs the integration in this basis. The following is a simplified version of the \code{examples/hermitegauss\_ground [...]
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -1958,9 +1973,9 @@ which disables many of these checks at the time of writing the C-code.
 \label{worked_examples:dmultistatese}\label{worked_examples:multi-component-schrodinger-equation}
 This example demonstrates a simple method for doing matrix calculations in XMDS2.  We are solving the multi-component PDE
 \begin{gather}
-\begin{split}\frac{\partial \phi_j(x,y)}{\partial t} = \frac{i}{2}\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right)\phi_j(x,y) - i U(x,y) \sum_k V_{j k}\phi_k(x,y)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial \phi_j(x,y)}{\partial t} = \frac{i}{2}\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right)\phi_j(x,y) - i U(x,y) \sum_k V_{j k}\phi_k(x,y)\end{split}\notag
 \end{gather}
-where the last term is more commonly written as a matrix multiplication.  Writing this term out explicitly is feasible for a small number of components, but when the number of components becomes large, or perhaps $V_{j k}$ should be precomputed for efficiency reasons, it is useful to be able to perform this sum over the integer dimensions automatically.  This example show how this can be done naturally using a computed vector.  The XMDS2 script is as follows:
+where the last term is more commonly written as a matrix multiplication.  Writing this term out explicitly is feasible for a small number of components, but when the number of components becomes large, or perhaps \(V_{j k}\) should be precomputed for efficiency reasons, it is useful to be able to perform this sum over the integer dimensions automatically.  This example show how this can be done naturally using a computed vector.  The XMDS2 script is as follows:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -2073,7 +2088,7 @@ where the last term is more commonly written as a matrix multiplication.  Writin
 \end{Verbatim}
 
 \index{Aliases}
-The only truly new feature in this script is the ``aliases'' option on a dimension.  The integer-valued dimension in this script indexes the components of the PDE (in this case only two).  The  $V_{j k}$ term is required to be a square array of dimension of this number of components.  If we wrote the k-index of $V_{j k}$ using a separate \code{\textless{}dimension\textgreater{}} element, then we would not be enforcing the requirement that the matrix be square.  Instead, we note that we w [...]
+The only truly new feature in this script is the ``aliases'' option on a dimension.  The integer-valued dimension in this script indexes the components of the PDE (in this case only two).  The  \(V_{j k}\) term is required to be a square array of dimension of this number of components.  If we wrote the k-index of \(V_{j k}\) using a separate \code{\textless{}dimension\textgreater{}} element, then we would not be enforcing the requirement that the matrix be square.  Instead, we note that  [...]
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}dimension} \PYG{n+na}{name=}\PYG{l+s}{\PYGZdq{}j\PYGZdq{}} \PYG{n+na}{type=}\PYG{l+s}{\PYGZdq{}integer\PYGZdq{}} \PYG{n+na}{lattice=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}} \PYG{n+na}{domain=}\PYG{l+s}{\PYGZdq{}(0,1)\PYGZdq{}} \PYG{n+na}{aliases=}\PYG{l+s}{\PYGZdq{}k\PYGZdq{}}\PYG{n+nt}{/\PYGZgt{}}
@@ -2098,7 +2113,7 @@ This means that we can use the index ``k'', which will have exactly the same pro
 
 Since the output dimensions of the computed vector do not include a ``k'' index, this index is integrated.  The volume element for this summation is the spacing between neighbouring values of ``j'', and since this spacing is one, this integration is just a sum over k, as required.
 
-This example also demonstrates an optimisation for the IP operators by separating the $x$ and $y$ parts of the operator (see {\hyperref[optimisation_hints:optimisingipoperators]{\emph{Optimising with the Interaction Picture (IP) operator}}}).  This gives an approximately 30\% speed improvement over the more straightforward implementation:
+This example also demonstrates an optimisation for the IP operators by separating the \(x\) and \(y\) parts of the operator (see {\hyperref[optimisation_hints:optimisingipoperators]{\emph{Optimising with the Interaction Picture (IP) operator}}}).  This gives an approximately 30\% speed improvement over the more straightforward implementation:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}operator} \PYG{n+na}{kind=}\PYG{l+s}{\PYGZdq{}ip\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -2147,15 +2162,15 @@ Contents:
 It also has commands to configure XMDS2 and recheck the installation.  If your program requires extra paths to compile, you can configure XMDS2 to include those paths by default.  Simply use the command
 
 \begin{Verbatim}[commandchars=\\\{\}]
-\PYG{n+nv}{\PYGZdl{} }xmds2 \PYGZhy{}\PYGZhy{}configure \PYGZhy{}\PYGZhy{}include\PYGZhy{}path /path/to/include \PYGZhy{}\PYGZhy{}lib\PYGZhy{}path /path/to/lib
+\PYGZdl{} xmds2 \PYGZhy{}\PYGZhy{}configure \PYGZhy{}\PYGZhy{}include\PYGZhy{}path /path/to/include \PYGZhy{}\PYGZhy{}lib\PYGZhy{}path /path/to/lib
 \end{Verbatim}
 
 Alternatively, you can set the \code{CXXFLAGS} or \code{LINKFLAGS} environment variables before calling \code{xmds2 -{-}reconfigure}.  For example, to pass the compiler flag \code{-pedantic} and the link flag \code{-lm} using the bash shell, use:
 
 \begin{Verbatim}[commandchars=\\\{\}]
-\PYG{n+nv}{\PYGZdl{} }\PYG{n+nb}{export }\PYG{n+nv}{CXXFLAGS}\PYG{o}{=}\PYG{l+s+s2}{\PYGZdq{}\PYGZhy{}pedantic\PYGZdq{}}
-\PYG{n+nv}{\PYGZdl{} }\PYG{n+nb}{export }\PYG{n+nv}{LINKFLAGS}\PYG{o}{=}\PYG{l+s+s2}{\PYGZdq{}\PYGZhy{}lm\PYGZdq{}}
-\PYG{n+nv}{\PYGZdl{} }xmds2 \PYGZhy{}\PYGZhy{}reconfigure\PYG{l+s+sb}{{}`}\PYG{l+s+sb}{{}`}
+\PYGZdl{} \PYG{n+nb}{export} \PYG{n+nv}{CXXFLAGS}\PYG{o}{=}\PYG{l+s+s2}{\PYGZdq{}\PYGZhy{}pedantic\PYGZdq{}}
+\PYGZdl{} \PYG{n+nb}{export} \PYG{n+nv}{LINKFLAGS}\PYG{o}{=}\PYG{l+s+s2}{\PYGZdq{}\PYGZhy{}lm\PYGZdq{}}
+\PYGZdl{} xmds2 \PYGZhy{}\PYGZhy{}reconfigure\PYG{l+s+sb}{{}`}\PYG{l+s+sb}{{}`}
 \end{Verbatim}
 
 This method can also be used to change the default compilers for standard and parallel processing, using the CXX and MPICXX flags respectively.
@@ -2163,7 +2178,7 @@ This method can also be used to change the default compilers for standard and pa
 Running XMDS2 with the `--configure' option also searches for packages that have been installed since you last installed or configured XMDS2.  If you wish to run `xmds2 --configure' with the same extra options as last time, simply use the command:
 
 \begin{Verbatim}[commandchars=\\\{\}]
-\PYG{n+nv}{\PYGZdl{} }xmds2 \PYGZhy{}\PYGZhy{}reconfigure
+\PYGZdl{} xmds2 \PYGZhy{}\PYGZhy{}reconfigure
 \end{Verbatim}
 
 A detailed log of the checks is saved in the file `\textasciitilde{}/.xmds/waf\_configure/config.log'.  This can be used to identify issues with packages that XMDS2 is not recognised, but you think that you have successfully installed on your system.
@@ -2200,150 +2215,159 @@ There are many, many XML tags that can make up an XMDS2 script. Most of them are
 The syntax \textless{}element /\textgreater{} can be used for lowest-level elements that have attributes but no content, and are shorthand for \textless{}element\textgreater{} \textless{}/element\textgreater{}. This shorthand notation can also be used for elements which can only contain the content ``yes'' or ``no''; in this case the presence of \textless{}element /\textgreater{} is equivalent to \textless{}element\textgreater{} yes \textless{}/element\textgreater{}, and the absence of s [...]
 
 The possible attributes and attribute values for each element are not shown; see the individual entries in the Reference section for details.
-{\hyperref[reference_elements:simulationelement]{\emph{}}}{\hyperref[reference_elements:nameelement]{\emph{}}}{\hyperref[reference_elements:nameelement]{\emph{}}}{\hyperref[reference_elements:authorelement]{\emph{}}}{\hyperref[reference_elements:authorelement]{\emph{}}}{\hyperref[reference_elements:descriptionelement]{\emph{}}}{\hyperref[reference_elements:descriptionelement]{\emph{}}}{\hyperref[reference_elements:featureselement]{\emph{}}}{\hyperref[reference_elements:argumentselement]{ [...]
-\begin{Verbatim}[commandchars=\\\{\}]
-\PYG{c+cp}{\PYGZlt{}?xml version=\PYGZdq{}1.0\PYGZdq{} encoding=\PYGZdq{}UTF\PYGZhy{}8\PYGZdq{}?\PYGZgt{}}
-\PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}name}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/name\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}author}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}author}\PYG{n+nt}{\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}description}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/description\PYGZgt{}}
-
-  \PYG{n+nt}{\PYGZlt{}features}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}arguments}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}argument} \PYG{n+nt}{/\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}argument} \PYG{n+nt}{/\PYGZgt{}}
+\begin{alltt}
+\textless{}?xml version=''1.0'' encoding=''UTF-8''?\textgreater{}
+\textless{}{\hyperref[reference_elements:simulationelement]{\emph{simulation}}} xmds-version=''2''\textgreater{}
+  \textless{}{\hyperref[reference_elements:nameelement]{\emph{name}}}\textgreater{} \textless{}{\hyperref[reference_elements:nameelement]{\emph{/name}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:authorelement]{\emph{author}}}\textgreater{} \textless{}{\hyperref[reference_elements:authorelement]{\emph{author}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:descriptionelement]{\emph{description}}}\textgreater{} \textless{}{\hyperref[reference_elements:descriptionelement]{\emph{/description}}}\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:featureselement]{\emph{features}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:argumentselement]{\emph{arguments}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:argumentelement]{\emph{argument}}} /\textgreater{}
+      \textless{}{\hyperref[reference_elements:argumentelement]{\emph{argument}}} /\textgreater{}
       ...
-    \PYG{n+nt}{\PYGZlt{}/arguments\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}auto\PYGZus{}vectorise} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}benchmark} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}bing} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}cflags}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/cflags\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}chunked\PYGZus{}output} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}diagnostics} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}error\PYGZus{}check} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}halt\PYGZus{}non\PYGZus{}finite} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}fftw} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}globals}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/globals\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}openmp} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}precision}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/precision\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}validation} \PYG{n+nt}{/\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}/features\PYGZgt{}}
-
-  \PYG{n+nt}{\PYGZlt{}driver} \PYG{n+nt}{/\PYGZgt{}}
-
-  \PYG{n+nt}{\PYGZlt{}geometry}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}propagation\PYGZus{}dimension}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/propagation\PYGZus{}dimension\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}transverse\PYGZus{}dimensions}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dimension} \PYG{n+nt}{/\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dimension} \PYG{n+nt}{/\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:argumentselement]{\emph{/arguments}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:autovectorise]{\emph{auto\_vectorise}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:benchmark]{\emph{benchmark}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:bing]{\emph{bing}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:cflags]{\emph{cflags}}}\textgreater{} \textless{}{\hyperref[reference_elements:cflags]{\emph{/cflags}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:chunkedoutput]{\emph{chunked\_output}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:diagnostics]{\emph{diagnostics}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:errorcheck]{\emph{error\_check}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:haltnonfinite]{\emph{halt\_non\_finite}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:fftw]{\emph{fftw}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:globals]{\emph{globals}}}\textgreater{} \textless{}{\hyperref[reference_elements:globals]{\emph{/globals}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:openmp]{\emph{openmp}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:precision]{\emph{precision}}}\textgreater{} \textless{}{\hyperref[reference_elements:precision]{\emph{/precision}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:validation]{\emph{validation}}} /\textgreater{}
+  \textless{}{\hyperref[reference_elements:featureselement]{\emph{/features}}}\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:driverelement]{\emph{driver}}} /\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:geometryelement]{\emph{geometry}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:propagationdimensionelement]{\emph{propagation\_dimension}}}\textgreater{} \textless{}{\hyperref[reference_elements:propagationdimensionelement]{\emph{/propagation\_dimension}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:transversedimensionselement]{\emph{transverse\_dimensions}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dimensionelement]{\emph{dimension}}} /\textgreater{}
+      \textless{}{\hyperref[reference_elements:dimensionelement]{\emph{dimension}}} /\textgreater{}
       ...
-    \PYG{n+nt}{\PYGZlt{}/transverse\PYGZus{}dimensions\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}/geometry\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:transversedimensionselement]{\emph{/transverse\_dimensions}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:geometryelement]{\emph{/geometry}}}\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:vectorelement]{\emph{vector}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:componentselement]{\emph{components}}}\textgreater{} \textless{}{\hyperref[reference_elements:componentselement]{\emph{/components}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:initialisationelement]{\emph{initialisation}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:filenameelement]{\emph{filename}}}\textgreater{}
+      \textless{}!{[}{\hyperref[reference_elements:initialisationelement]{\emph{CDATA}}} {[}
+      {]}{]}\textgreater{}
+    \textless{}{\hyperref[reference_elements:initialisationelement]{\emph{/initialisation}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:vectorelement]{\emph{/vector}}}\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:vectorelement]{\emph{vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:vectorelement]{\emph{/vector}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:vectorelement]{\emph{vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:vectorelement]{\emph{/vector}}}\textgreater{}
+  ...
 
-  \PYG{n+nt}{\PYGZlt{}vector}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}components}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/components\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}initialisation}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}filename}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{      ]]\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}/initialisation\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}/vector\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+    \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+    {]}{]}\textgreater{}
+  \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
 
-  \PYG{n+nt}{\PYGZlt{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/vector\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/vector\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
   ...
 
-  \PYG{n+nt}{\PYGZlt{}computed\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}components}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/components\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}evaluation}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-      \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{      ]]\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}/evaluation\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}/computed\PYGZus{}vector\PYGZgt{}}
-
-  \PYG{n+nt}{\PYGZlt{}computed\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/computed\PYGZus{}vector\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}computed\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/computed\PYGZus{}vector\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{computed\_vector}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:componentselement]{\emph{components}}}\textgreater{} \textless{}{\hyperref[reference_elements:componentselement]{\emph{/components}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:evaluationelement]{\emph{evaluation}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+      \textless{}!{[}{\hyperref[reference_elements:initialisationelement]{\emph{CDATA}}} {[}
+      {]}{]}\textgreater{}
+    \textless{}{\hyperref[reference_elements:evaluationelement]{\emph{/evaluation}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{/computed\_vector}}}\textgreater{}
+
+  \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{computed\_vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{/computed\_vector}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{computed\_vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{/computed\_vector}}}\textgreater{}
   ...
 
-  \PYG{n+nt}{\PYGZlt{}noise\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}components}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/components\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}/noise\PYGZus{}vector\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{noise\_vector}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:componentselement]{\emph{components}}}\textgreater{} \textless{}{\hyperref[reference_elements:componentselement]{\emph{/components}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{/noise\_vector}}}\textgreater{}
 
-  \PYG{n+nt}{\PYGZlt{}noise\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/noise\PYGZus{}vector\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}noise\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/noise\PYGZus{}vector\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{noise\_vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{/noise\_vector}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{noise\_vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:noisevectorelement]{\emph{/noise\_vector}}}\textgreater{}
   ...
 
-  \PYG{n+nt}{\PYGZlt{}sequence}\PYG{n+nt}{\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:sequenceelement]{\emph{sequence}}}\textgreater{}
 
-    \PYG{n+nt}{\PYGZlt{}filter}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-      \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{      ]]\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}/filter\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+      \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+      {]}{]}\textgreater{}
+    \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
 
-    \PYG{n+nt}{\PYGZlt{}integrate}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}samples}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/samples\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:integrateelement]{\emph{integrate}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:sampleselement]{\emph{samples}}}\textgreater{} \textless{}{\hyperref[reference_elements:sampleselement]{\emph{/samples}}}\textgreater{}
 
-      \PYG{n+nt}{\PYGZlt{}computed\PYGZus{}vector}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/computed\PYGZus{}vector\PYGZgt{}}
+      \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{computed\_vector}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:computedvectorelement]{\emph{/computed\_vector}}}\textgreater{}
 
-      \PYG{n+nt}{\PYGZlt{}filters}\PYG{n+nt}{\PYGZgt{}}
-        \PYG{n+nt}{\PYGZlt{}filter}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/filter\PYGZgt{}}
-        \PYG{n+nt}{\PYGZlt{}filter}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/filter\PYGZgt{}}
+      \textless{}{\hyperref[reference_elements:filterselement]{\emph{filters}}}\textgreater{}
+        \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
+        \textless{}{\hyperref[reference_elements:filterelement]{\emph{filter}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:filterelement]{\emph{/filter}}}\textgreater{}
         ...
-      \PYG{n+nt}{\PYGZlt{}/filters\PYGZgt{}}
-
-      \PYG{n+nt}{\PYGZlt{}operators}\PYG{n+nt}{\PYGZgt{}}
-
-        \PYG{n+nt}{\PYGZlt{}operator}\PYG{n+nt}{\PYGZgt{}}
-          \PYG{n+nt}{\PYGZlt{}boundary\PYGZus{}condition}\PYG{n+nt}{\PYGZgt{}}
-            \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-            \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{            ]]\PYGZgt{}}
-          \PYG{n+nt}{\PYGZlt{}/boundary\PYGZus{}condition\PYGZgt{}}
-          \PYG{n+nt}{\PYGZlt{}operator\PYGZus{}names}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/operator\PYGZus{}names\PYGZgt{}}
-          \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-          \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{          ]]\PYGZgt{}}
-        \PYG{n+nt}{\PYGZlt{}/operator\PYGZgt{}}
-
-        \PYG{n+nt}{\PYGZlt{}operator}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/operator\PYGZgt{}}
-        \PYG{n+nt}{\PYGZlt{}operator}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/operator\PYGZgt{}}
+      \textless{}{\hyperref[reference_elements:filterselement]{\emph{/filters}}}\textgreater{}
+
+      \textless{}{\hyperref[reference_elements:operatorselement]{\emph{operators}}}\textgreater{}
+
+        \textless{}{\hyperref[reference_elements:operatorelement]{\emph{operator}}}\textgreater{}
+          \textless{}{\hyperref[reference_elements:boundaryconditionelement]{\emph{boundary\_condition}}}\textgreater{}
+            \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+            \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+            {]}{]}\textgreater{}
+          \textless{}{\hyperref[reference_elements:boundaryconditionelement]{\emph{/boundary\_condition}}}\textgreater{}
+          \textless{}{\hyperref[reference_elements:operatornameselement]{\emph{operator\_names}}}\textgreater{} \textless{}{\hyperref[reference_elements:operatornameselement]{\emph{/operator\_names}}}\textgreater{}
+          \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+          \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+          {]}{]}\textgreater{}
+        \textless{}{\hyperref[reference_elements:operatorelement]{\emph{/operator}}}\textgreater{}
+
+        \textless{}{\hyperref[reference_elements:operatorelement]{\emph{operator}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:operatorelement]{\emph{/operator}}}\textgreater{}
+        \textless{}{\hyperref[reference_elements:operatorelement]{\emph{operator}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:operatorelement]{\emph{/operator}}}\textgreater{}
         ...
 
-        \PYG{n+nt}{\PYGZlt{}integration\PYGZus{}vectors}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/integration\PYGZus{}vectors\PYGZgt{}}
-        \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-        \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{        ]]\PYGZgt{}}
+        \textless{}{\hyperref[reference_elements:integrationvectorselement]{\emph{integration\_vectors}}}\textgreater{} \textless{}{\hyperref[reference_elements:integrationvectorselement]{\emph{/integration\_vectors}}}\textgreater{}
+        \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+        \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+        {]}{]}\textgreater{}
 
-      \PYG{n+nt}{\PYGZlt{}/operators\PYGZgt{}}
+      \textless{}{\hyperref[reference_elements:operatorselement]{\emph{/operators}}}\textgreater{}
 
-    \PYG{n+nt}{\PYGZlt{}/integrate\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:integrateelement]{\emph{/integrate}}}\textgreater{}
 
-    \PYG{n+nt}{\PYGZlt{}breakpoint}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}/breakpoint\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:breakpointelement]{\emph{breakpoint}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:breakpointelement]{\emph{/breakpoint}}}\textgreater{}
 
-  \PYG{n+nt}{\PYGZlt{}/sequence\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:sequenceelement]{\emph{/sequence}}}\textgreater{}
 
-  \PYG{n+nt}{\PYGZlt{}output}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}sampling\PYGZus{}group}\PYG{n+nt}{\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}dependencies}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/dependencies\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}moments}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/moments\PYGZgt{}}
-      \PYG{n+nt}{\PYGZlt{}operator}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/operator\PYGZgt{}}
-      \PYG{c+cp}{\PYGZlt{}![CDATA [}
-\PYG{c+cp}{      ]]\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}/sampling\PYGZus{}group\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:outputelement]{\emph{output}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{sampling\_group}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:dependencies]{\emph{dependencies}}}\textgreater{} \textless{}{\hyperref[reference_elements:dependencies]{\emph{/dependencies}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{moments}}}\textgreater{} \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{/moments}}}\textgreater{}
+      \textless{}{\hyperref[reference_elements:operatorelement]{\emph{operator}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:operatorelement]{\emph{/operator}}}\textgreater{}
+      \textless{}!{[}{\hyperref[reference_elements:xmdscsyntax]{\emph{CDATA}}} {[}
+      {]}{]}\textgreater{}
+    \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{/sampling\_group}}}\textgreater{}
 
-    \PYG{n+nt}{\PYGZlt{}sampling\PYGZus{}group}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/sampling\PYGZus{}group\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}sampling\PYGZus{}group}\PYG{n+nt}{\PYGZgt{}} ... \PYG{n+nt}{\PYGZlt{}/sampling\PYGZus{}group\PYGZgt{}}
+    \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{sampling\_group}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{/sampling\_group}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{sampling\_group}}}\textgreater{} ... \textless{}{\hyperref[reference_elements:samplinggroupelement]{\emph{/sampling\_group}}}\textgreater{}
     ...
 
-  \PYG{n+nt}{\PYGZlt{}/output\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:outputelement]{\emph{/output}}}\textgreater{}
 
-\PYG{n+nt}{\PYGZlt{}/simulation\PYGZgt{}}
-\end{Verbatim}
+\textless{}{\hyperref[reference_elements:simulationelement]{\emph{/simulation}}}\textgreater{}
+\end{alltt}
 
 \index{Reference}\index{XML Elements}\index{Script elements}
 
@@ -2816,7 +2840,7 @@ The ``dft'' transform is performed using the the normal discrete Fourier transfo
 The discrete Fourier transform has no information about the domain of the lattice, so the XMDS2 transform is equivalent to
 \begin{gather}
 \begin{split}\tilde{\mathcal{F}}\left[f(x)\right](k) &= \frac{1}{\sqrt{2\pi}}\int_{x_\text{min}}^{x_\text{max}} f(x) e^{-i k (x+ x_\text{min})} dx \\
-&= e^{-i x_\text{min} k} \mathcal{F}\left[f(x)\right](k)\end{split}\notag\\\begin{split}\end{split}\notag
+&= e^{-i x_\text{min} k} \mathcal{F}\left[f(x)\right](k)\end{split}\notag
 \end{gather}
 The standard usage in an XMDS simulation involves moving to Fourier space, applying a transformation, and then moving back.  For this purpose, the two transformations are entirely equivalent as the extra phase factor cancels.  However, when fields are explicitly defined in Fourier space, care must be taken to include this phase factor explicitly.  See section {\hyperref[advanced_topics:convolutions]{\emph{Convolutions and Fourier transforms}}} in the Advanced Topics section.
 
@@ -2824,9 +2848,9 @@ When a dimension uses the ``dft'' transform, then the Fourier space variable is
 
 Fourier transforms allow easy calculation of derivatives, as the n$^{\text{th}}$ derivative of a field is proportional to the n$^{\text{th}}$ moment of the field in Fourier space:
 \begin{gather}
-\begin{split}\mathcal{F}\left[\frac{\partial^n f(x)}{\partial x^n}\right](k_x) = \left(i \;k_x\right)^n \mathcal{F}\left[f(x)\right](k_x)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{F}\left[\frac{\partial^n f(x)}{\partial x^n}\right](k_x) = \left(i \;k_x\right)^n \mathcal{F}\left[f(x)\right](k_x)\end{split}\notag
 \end{gather}
-This identity can be used to write the differential operator $\mathcal{L} = \frac{\partial}{\partial x}$ as an \code{IP} or \code{EX} operator as \code{L = i*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
+This identity can be used to write the differential operator \(\mathcal{L} = \frac{\partial}{\partial x}\) as an \code{IP} or \code{EX} operator as \code{L = i*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
 
 Example syntax:
 
@@ -2851,13 +2875,13 @@ The ``dct'' (discrete cosine transform) is a Fourier-based transform that implie
 
 As the DCT transform can be defined on real data rather only complex data, it can also be superior to DFT-based spectral methods for simulations of real-valued fields where boundary conditions are artificial.
 
-XMDS labels the cosine transform space variables the same as for {\hyperref[reference_elements:dft-transform]{\emph{Fourier transforms}}} and all the even derivatives can be calculated the same way.  Odd moments of the cosine-space variables are in fact \emph{not} related to the corresponding odd derivatives by an inverse cosine transform.
+XMDS labels the cosine transform space variables the same as for {\hyperref[reference_elements:dft\string-transform]{\emph{Fourier transforms}}} and all the even derivatives can be calculated the same way.  Odd moments of the cosine-space variables are in fact \emph{not} related to the corresponding odd derivatives by an inverse cosine transform.
 
 Discrete cosine transforms allow easy calculation of even-order derivatives, as the 2n$^{\text{th}}$ derivative of a field is proportional to the 2n$^{\text{th}}$ moment of the field in DCT-space:
 \begin{gather}
-\begin{split}\mathcal{F}_\text{DCT}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DCT}\left[f(x)\right](k_x)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{F}_\text{DCT}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DCT}\left[f(x)\right](k_x)\end{split}\notag
 \end{gather}
-This identity can be used to write the differential operator $\mathcal{L} = \frac{\partial^2}{\partial x^2}$ as an \code{IP} or \code{EX} operator as \code{L = -kx*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
+This identity can be used to write the differential operator \(\mathcal{L} = \frac{\partial^2}{\partial x^2}\) as an \code{IP} or \code{EX} operator as \code{L = -kx*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
 
 For problems where you are defining the simulation domain over only half of the physical domain to take advantage of reflection symmetry, consider using \code{volume\_prefactor="2.0"} so that all volume integrals are over the entire physical domain, not just the simulation domain. i.e. integrals would be over -1 to 1 instead of 0 to 1 if the domain was specified as \code{domain="(0,1)"}.
 
@@ -2885,13 +2909,13 @@ The ``dst'' (discrete sine transform) is a counterpart to the DCT transform.  XM
 \index{Boundary conditions (DST)}
 The DST transform can be defined on real-valued vectors.  As odd-valued functions are zero at the boundaries, this is a natural transform to use when implementing zero Dirichlet boundary conditions.
 
-XMDS labels the sine transform space variables the same as for {\hyperref[reference_elements:dft-transform]{\emph{Fourier transforms}}} and all the even derivatives can be calculated the same way.  Odd moments of the sine-space variables are in fact \emph{not} related to the corresponding odd derivatives by an inverse sine transform.
+XMDS labels the sine transform space variables the same as for {\hyperref[reference_elements:dft\string-transform]{\emph{Fourier transforms}}} and all the even derivatives can be calculated the same way.  Odd moments of the sine-space variables are in fact \emph{not} related to the corresponding odd derivatives by an inverse sine transform.
 
 Discrete sine transforms allow easy calculation of even-order derivatives, as the 2n$^{\text{th}}$ derivative of a field is proportional to the 2n$^{\text{th}}$ moment of the field in DST-space:
 \begin{gather}
-\begin{split}\mathcal{F}_\text{DST}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DST}\left[f(x)\right](k_x)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{F}_\text{DST}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DST}\left[f(x)\right](k_x)\end{split}\notag
 \end{gather}
-This identity can be used to write the differential operator $\mathcal{L} = \frac{\partial^2}{\partial x^2}$ as an \code{IP} or \code{EX} operator as \code{L = -kx*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
+This identity can be used to write the differential operator \(\mathcal{L} = \frac{\partial^2}{\partial x^2}\) as an \code{IP} or \code{EX} operator as \code{L = -kx*kx;} (see {\hyperref[reference_elements:operatorselement]{\emph{Operators and operator elements}}} for more details).
 
 Example syntax:
 
@@ -2910,32 +2934,32 @@ Example syntax:
 
 \subsubsection{The ``bessel'' and ``bessel-neumann'' transforms}
 \label{reference_elements:the-bessel-and-bessel-neumann-transforms}\label{reference_elements:index-39}\label{reference_elements:besseltransform}
-Just as the Fourier basis is useful for finding derivatives in Euclidean geometry, the basis of Bessel functions is useful for finding certain common operators in cylindrical co-ordinates.  In particular, we use the Bessel functions of the first kind, $J_m(u)$.  The relevant transform is the Hankel transform:
+Just as the Fourier basis is useful for finding derivatives in Euclidean geometry, the basis of Bessel functions is useful for finding certain common operators in cylindrical co-ordinates.  In particular, we use the Bessel functions of the first kind, \(J_m(u)\).  The relevant transform is the Hankel transform:
 \begin{gather}
-\begin{split}F_m(k) = \mathcal{H}_m \left[f\right](k) = \int_0^\infty r f(r) J_m(k r) dr\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}F_m(k) = \mathcal{H}_m \left[f\right](k) = \int_0^\infty r f(r) J_m(k r) dr\end{split}\notag
 \end{gather}
 which has the inverse transform:
 \begin{gather}
-\begin{split}f(r) = \mathcal{H}^{-1}_m \left[F_m\right](r) = \int_0^\infty k F_m(k) J_m(k r) dk\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}f(r) = \mathcal{H}^{-1}_m \left[F_m\right](r) = \int_0^\infty k F_m(k) J_m(k r) dk\end{split}\notag
 \end{gather}
 This transform pair has the useful property that the Laplacian in cylindrical co-ordinates is diagonal in this basis:
 \begin{gather}
-\begin{split}\nabla^2 \left(f(r) e^{i m \theta}\right) &= \left(\frac{\partial^2 f}{\partial r^2} +\frac{1}{r}\frac{\partial f}{\partial r} -\frac{m^2}{r^2} f \right) e^{i m \theta} = \left\{\mathcal{H}^{-1}_m \left[(-k^2) F_m(k)\right](r) \right\} e^{i m \theta}\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\nabla^2 \left(f(r) e^{i m \theta}\right) &= \left(\frac{\partial^2 f}{\partial r^2} +\frac{1}{r}\frac{\partial f}{\partial r} -\frac{m^2}{r^2} f \right) e^{i m \theta} = \left\{\mathcal{H}^{-1}_m \left[(-k^2) F_m(k)\right](r) \right\} e^{i m \theta}\end{split}\notag
 \end{gather}
-XMDS labels the variables in the transformed space with a prefix of `k', just as for {\hyperref[reference_elements:dft-transform]{\emph{Fourier transforms}}}.  The order $m$ of the transform is defined by the \code{order} attribute in the \code{\textless{}dimension\textgreater{}} element, which must be assigned as a non-negative integer.  If the order is not specified, it defaults to zero which corresponds to the solution being independent of the angular coordinate $\theta$.
+XMDS labels the variables in the transformed space with a prefix of `k', just as for {\hyperref[reference_elements:dft\string-transform]{\emph{Fourier transforms}}}.  The order \(m\) of the transform is defined by the \code{order} attribute in the \code{\textless{}dimension\textgreater{}} element, which must be assigned as a non-negative integer.  If the order is not specified, it defaults to zero which corresponds to the solution being independent of the angular coordinate \(\theta\).
 
 \index{Boundary conditions (Bessel)}\index{Boundary conditions}
-The difference between the ``bessel'' and ``bessel-neumann'' transforms is that the ``bessel'' transform enforces Dirichlet boundary conditions at the edge of the computational domain ($f(R) = 0$), while ``bessel-neumann'' enforces Neumann boundary conditions ($\left.\frac{\partial}{\partial r}f(r) \right|_{r=R} = 0$).
+The difference between the ``bessel'' and ``bessel-neumann'' transforms is that the ``bessel'' transform enforces Dirichlet boundary conditions at the edge of the computational domain (\(f(R) = 0\)), while ``bessel-neumann'' enforces Neumann boundary conditions (\(\left.\frac{\partial}{\partial r}f(r) \right|_{r=R} = 0\)).
 
 It can often be useful to have a different sampling in normal space and Hankel space.  Reducing the number of modes in either space dramatically speeds simulations.  To set the number of lattice points in Hankel space to be different to the number of lattice points for the field in its original space, use the attribute \code{spectral\_lattice}.  The Bessel space lattice is chosen such that the boundary condition at the edge of the domain is zero.  This ensures that all of the Bessel mode [...]
 
 Hankel transforms allow easy calculation of the Laplacian of fields with cylindrical symmetry.  Applying the operator \code{L = -kr*kr} in Hankel space is therefore equivalent to applying the operator
 \begin{gather}
-\begin{split}\mathcal{L} = \left(\frac{\partial^2}{\partial r^2} +\frac{1}{r}\frac{\partial}{\partial r} -\frac{m^2}{r^2} \right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{L} = \left(\frac{\partial^2}{\partial r^2} +\frac{1}{r}\frac{\partial}{\partial r} -\frac{m^2}{r^2} \right)\end{split}\notag
 \end{gather}
 in coordinate space.
 
-In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in cylindrical co-ordinates with a radial co-ordinate `r', integrals over this dimension have a volume element $r dr$.  When performing integrals along a dimension specified by the ``bessel'' transform, the factor of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration.  For example, for a two-dimensional volume in cylind [...]
+In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in cylindrical co-ordinates with a radial co-ordinate `r', integrals over this dimension have a volume element \(r dr\).  When performing integrals along a dimension specified by the ``bessel'' transform, the factor of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration.  For example, for a two-dimensional volume in cyli [...]
 
 Example syntax:
 
@@ -2954,23 +2978,23 @@ Example syntax:
 
 \subsubsection{The ``spherical-bessel'' transform}
 \label{reference_elements:the-spherical-bessel-transform}\label{reference_elements:index-41}\label{reference_elements:spherical-bessel-transform}
-When working in spherical coordinates, it is often useful to use the spherical Bessel functions $j_l(x)=\sqrt{\frac{\pi}{2x}}J_{l+\frac{1}{2}}(x)$ as a basis.  These are eigenfunctions of the radial component of Laplace's equation in spherical coordinates:
+When working in spherical coordinates, it is often useful to use the spherical Bessel functions \(j_l(x)=\sqrt{\frac{\pi}{2x}}J_{l+\frac{1}{2}}(x)\) as a basis.  These are eigenfunctions of the radial component of Laplace's equation in spherical coordinates:
 \begin{gather}
-\begin{split}\nabla^2 \left[j_l(k r)\; Y^m_l(\theta, \phi)\right] &= \left[\frac{\partial^2 }{\partial r^2} +\frac{2}{r}\frac{\partial }{\partial r} -\frac{l(l+1)}{r^2}\right] j_l(k r) \; Y^m_l(\theta, \phi) = -k^2 j_l(k r)\; Y^m_l(\theta, \phi)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\nabla^2 \left[j_l(k r)\; Y^m_l(\theta, \phi)\right] &= \left[\frac{\partial^2 }{\partial r^2} +\frac{2}{r}\frac{\partial }{\partial r} -\frac{l(l+1)}{r^2}\right] j_l(k r) \; Y^m_l(\theta, \phi) = -k^2 j_l(k r)\; Y^m_l(\theta, \phi)\end{split}\notag
 \end{gather}
-Just as the Bessel basis above, the transformed dimensions are prefixed with a `k', and it is possible (and usually wise) to use the \code{spectral\_lattice} attribute to specify a different lattice size in the transformed space.  Also, the spacing of these lattices are again chosen in a non-uniform manner to Gaussian quadrature methods for spectrally accurate transforms.  Finally, the \code{order} attribute can be used to specify the order $l$ of the spherical Bessel functions used.
+Just as the Bessel basis above, the transformed dimensions are prefixed with a `k', and it is possible (and usually wise) to use the \code{spectral\_lattice} attribute to specify a different lattice size in the transformed space.  Also, the spacing of these lattices are again chosen in a non-uniform manner to Gaussian quadrature methods for spectrally accurate transforms.  Finally, the \code{order} attribute can be used to specify the order \(l\) of the spherical Bessel functions used.
 
-If we denote the transformation to and from this basis by $\mathcal{SH}$, then we can write the useful property:
+If we denote the transformation to and from this basis by \(\mathcal{SH}\), then we can write the useful property:
 \begin{gather}
-\begin{split}\frac{\partial^2 f}{\partial r^2} +\frac{2}{r}\frac{\partial f}{\partial r} -\frac{l (l+1)}{r^2} = \mathcal{SH}^{-1}_l \left[(-k^2) F_l(k)\right](r)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\frac{\partial^2 f}{\partial r^2} +\frac{2}{r}\frac{\partial f}{\partial r} -\frac{l (l+1)}{r^2} = \mathcal{SH}^{-1}_l \left[(-k^2) F_l(k)\right](r)\end{split}\notag
 \end{gather}
 Spherical Bessel transforms allow easy calculation of the Laplacian of fields with spherical symmetry. Applying the operator \code{L = -kr*kr} in Spherical Bessel space is therefore equivalent to applying the operator
 \begin{gather}
-\begin{split}\mathcal{L} = \left( \frac{\partial^2}{\partial r^2} +\frac{2}{r}\frac{\partial}{\partial r} -\frac{l (l+1)}{r^2} \right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{L} = \left( \frac{\partial^2}{\partial r^2} +\frac{2}{r}\frac{\partial}{\partial r} -\frac{l (l+1)}{r^2} \right)\end{split}\notag
 \end{gather}
 in coordinate space.
 
-In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in spherical co-ordinates with a radial co-ordinate `r', integrals over this dimension have a volume element $r^2 dr$.  When performing integrals along a dimension specified by the ``spherical-bessel'' transform, the factor of the square of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration.  For example, for a three-di [...]
+In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in spherical co-ordinates with a radial co-ordinate `r', integrals over this dimension have a volume element \(r^2 dr\).  When performing integrals along a dimension specified by the ``spherical-bessel'' transform, the factor of the square of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration.  For example, for a three- [...]
 
 Example syntax:
 
@@ -2989,30 +3013,30 @@ Example syntax:
 
 \subsubsection{The ``hermite-gauss'' transform}
 \label{reference_elements:hermite-gauss-transform}\label{reference_elements:the-hermite-gauss-transform}\label{reference_elements:index-42}
-The ``hermite-gauss'' transform allows transformations to and from the basis of Hermite functions $\psi_n(x)$:
+The ``hermite-gauss'' transform allows transformations to and from the basis of Hermite functions \(\psi_n(x)\):
 \begin{gather}
-\begin{split}\psi_n(x) = \left(2^n n! \sigma \sqrt{\pi}\right)^{-1/2} e^{-x^2/2\sigma^2} H_n(\sigma x)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\psi_n(x) = \left(2^n n! \sigma \sqrt{\pi}\right)^{-1/2} e^{-x^2/2\sigma^2} H_n(\sigma x)\end{split}\notag
 \end{gather}
-where the functions $H_n(x)$ are the Hermite polynomials:
+where the functions \(H_n(x)\) are the Hermite polynomials:
 \begin{gather}
-\begin{split}H_n(x) &= (-1)^n e^{x^2} \frac{d^n}{dx^n} \left(e^{-x^2}\right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}H_n(x) &= (-1)^n e^{x^2} \frac{d^n}{dx^n} \left(e^{-x^2}\right)\end{split}\notag
 \end{gather}
 which are eigenfunctions of the Schroedinger equation for a harmonic oscillator:
 \begin{gather}
-\begin{split}- \frac{\hbar^2}{2 m} \frac{\partial^2 \psi_n}{\partial x^2} + \frac{1}{2} m \omega^2 x^2 \psi_n(x) = \hbar \omega\left(n+\frac{1}{2}\right) \psi_n(x),\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}- \frac{\hbar^2}{2 m} \frac{\partial^2 \psi_n}{\partial x^2} + \frac{1}{2} m \omega^2 x^2 \psi_n(x) = \hbar \omega\left(n+\frac{1}{2}\right) \psi_n(x),\end{split}\notag
 \end{gather}
-with $\sigma = \sqrt{\frac{\hbar}{m \omega}}$.
+with \(\sigma = \sqrt{\frac{\hbar}{m \omega}}\).
 
 \index{XML element attributes!length\_scale}
-This transform is different to the others in that it requires a \code{length\_scale} attribute rather than a \code{domain} attribute, as the range of the lattice will depend on the number of basis functions used. The \code{length\_scale} attribute defines the scale of the domain as the standard deviation $\sigma$ of the lowest order Hermite function $\psi_0(x)$:
+This transform is different to the others in that it requires a \code{length\_scale} attribute rather than a \code{domain} attribute, as the range of the lattice will depend on the number of basis functions used. The \code{length\_scale} attribute defines the scale of the domain as the standard deviation \(\sigma\) of the lowest order Hermite function \(\psi_0(x)\):
 \begin{gather}
-\begin{split}\psi_0(x) = (\sigma^2 \pi)^{-1/4} e^{-x^2/2 \sigma^2}\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\psi_0(x) = (\sigma^2 \pi)^{-1/4} e^{-x^2/2 \sigma^2}\end{split}\notag
 \end{gather}
 When a dimension uses the ``hermite-gauss'' transform, then the variable indexing the basis functions is defined as the name of the dimension prefixed with an ``n''.  For example, when referencing the basis function indices for the dimensions ``x'', ``y'', ``z'' and ``tau'', use the variable ``nx'', ``ny'', ``nz'' and ``ntau''.
 
 Applying the operator \code{L = nx + 0.5} in Hermite space is therefore equivalent to applying the operator
 \begin{gather}
-\begin{split}\mathcal{L} = \left(- \frac{\sigma^2}{2}\frac{\partial^2}{\partial x^2} + \frac{1}{2 \sigma^2} x^2 \right)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}\mathcal{L} = \left(- \frac{\sigma^2}{2}\frac{\partial^2}{\partial x^2} + \frac{1}{2 \sigma^2} x^2 \right)\end{split}\notag
 \end{gather}
 in coordinate space.
 
@@ -3275,7 +3299,7 @@ Example syntax:
 
 \subsubsection{Gaussian noise}
 \label{reference_elements:gaussiannoise}\label{reference_elements:gaussian-noise}\label{reference_elements:index-60}
-Noise generated with the ``gaussian'' method is gaussian distributed with zero mean.  For a real-valued noise vector, the variance at each point is the inverse of the volume element of the transverse dimensions in the vector.  This volume element for a single transverse dimension is that used to perform integrals over that dimension.  For example, it would include a factor of $r^2$ for a dimension ``r'' defined with a \code{spherical-bessel} transform.  It can be non-uniform for dimensio [...]
+Noise generated with the ``gaussian'' method is gaussian distributed with zero mean.  For a real-valued noise vector, the variance at each point is the inverse of the volume element of the transverse dimensions in the vector.  This volume element for a single transverse dimension is that used to perform integrals over that dimension.  For example, it would include a factor of \(r^2\) for a dimension ``r'' defined with a \code{spherical-bessel} transform.  It can be non-uniform for dimens [...]
 
 This lattice-dependent variance is typical in most applications of partial differential equations with stochastic initial conditions, as the physical quantity is the variance of the field over some finite volume, which does not change if the variance at each lattice site varies as described above.
 
@@ -3371,10 +3395,12 @@ Example syntax:
 
 \subsection{Filter element}
 \label{reference_elements:index-65}\label{reference_elements:filterelement}\label{reference_elements:filter-element}
-A \code{\textless{}filter\textgreater{}} element can be placed inside a \code{\textless{}sequence\textgreater{}} element or an {\hyperref[reference_elements:integrateelement]{\emph{\textless{}integrate\textgreater{}}}} element.  It contains a `CDATA' block and an optional {\hyperref[reference_elements:dependencies]{\emph{\textless{}dependencies\textgreater{}}}} element, which may give access to variables in other \code{\textless{}vector\textgreater{}}, \code{\textless{}computed\_vector\t [...]
+A \code{\textless{}filter\textgreater{}} element can be placed inside the \code{\textless{}simulation\textgreater{}} element, a {\hyperref[reference_elements:sequenceelement]{\emph{\textless{}sequence\textgreater{}}}} element, or an {\hyperref[reference_elements:integrateelement]{\emph{\textless{}integrate\textgreater{}}}} element.  It contains a `CDATA' block and an optional {\hyperref[reference_elements:dependencies]{\emph{\textless{}dependencies\textgreater{}}}} element, which may giv [...]
 
 \index{XML element attributes!name (filter)}
-Sometimes it is desirable to apply a filter conditionally.  The most efficient way of doing this is to call the function from the piece of code that contains the conditional statement (likely another \code{\textless{}filter\textgreater{}} element) rather than embed the conditional function in the filter itself, as the latter method can involve the conditional statement being evaluated multiple times over the transverse dimensions.  For this reason, it is possible to give a filter a \code [...]
+If a \code{\textless{}filter\textgreater{}} element is placed in a \code{\textless{}sequence\textgreater{}} element, then it executes once at that point in the sequence.  If it is placed in an \code{\textless{}integrate\textgreater{}} element, then it is executed each integration step as described in the description of the {\hyperref[reference_elements:filterselement]{\emph{\textless{}filters\textgreater{}}}} element.
+
+If a filter is placed in the \code{\textless{}simulation\textgreater{}} element, it must be given a name with the \code{name} attribute.  It can thenceforth be called in CDATA blocks by that name.  For example: \code{\textless{}filter name="filterName"\textgreater{}} allows the function to be called using the C-function \code{filterName()}.  Other filters that are given names can also be called in that fashion. This is useful for applying a filter conditionally.  The most efficient way o [...]
 
 One of the common uses of a filter element is to apply discontinuous changes to the vectors and variables of the simulation.
 
@@ -3533,7 +3559,7 @@ Example syntax:
 \label{reference_elements:algorithms}\label{reference_elements:id8}
 The stability, efficiency and even convergence of a numerical integration can depend on the method.  Due to the varying properties of different sets of equations, it is impossible to define the best method for all equations, so XMDS provides an option to use different algorithms.  These include fixed step algorithms, which divide the integration region into equal steps, and adaptive stepsize algorithms, which attempt to estimate the error in the simulation in order to choose an appropria [...]
 
-For the purposes of the descriptions below, we will assume that we are considering the following set of coupled differential equations for the vector of variables $\mathbf{x}(t)$:
+For the purposes of the descriptions below, we will assume that we are considering the following set of coupled differential equations for the vector of variables \(\mathbf{x}(t)\):
 \begin{gather}
 \begin{split}\frac{d x_j}{dt} = f_j(\mathbf{x}(t),t)\end{split}\notag
 \end{gather}
@@ -3738,20 +3764,20 @@ The step size of a dimension is \code{dx}, and if it is constant, also available
 \label{bulirschStoer:modified-midpoint-method}\label{bulirschStoer:index-0}\label{bulirschStoer::doc}\label{bulirschStoer:mmdetail}
 Although the modified midpoint can be used standalone as an ordinary differential equation integrator, it is regarded as much more powerful when used as a stepper to complement the Bulirsch-Stoer technique.
 
-The modified midpoint method advances a vector of dependent variables $y(x)$ from a point $x$, to a point $x + H$ by a sequence of $n$ substeps, each of size $h=H/n$.
+The modified midpoint method advances a vector of dependent variables \(y(x)\) from a point \(x\), to a point \(x + H\) by a sequence of \(n\) substeps, each of size \(h=H/n\).
 
-The number of right-hand side evaluations required by the modified midpoint method is $n+1$.  The formulas for the method are
+The number of right-hand side evaluations required by the modified midpoint method is \(n+1\).  The formulas for the method are
 \begin{gather}
 \begin{split}z_0 &= y(x) \\
 z_1 &= z_0 + h f(x, z_0) \\
 z_{m+1} &= z_{m-1} + 2 h f(x + m h, z_m)\; \text{ for } m = 1, 2, \dots, n-1 \\
-y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \right]\end{split}\notag\\\begin{split}\end{split}\notag
+y(x+H) \approx y_n &= \frac{1}{2} \left[ z_n + z_{n-1} + h f(x + H, z_n) \right]\end{split}\notag
 \end{gather}
-The error of this, expressed as a power series in $h$, the stepsize, contains only even powers of $h$:
+The error of this, expressed as a power series in \(h\), the stepsize, contains only even powers of \(h\):
 \begin{gather}
-\begin{split}y_n - y(x + H) &= \sum_{i=1}^{\infty} \alpha_i h^{2i}\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}y_n - y(x + H) &= \sum_{i=1}^{\infty} \alpha_i h^{2i}\end{split}\notag
 \end{gather}
-where $H$ is held constant, but $h$ changes $y$ by varing the $n$ in $h = H/n$.
+where \(H\) is held constant, but \(h\) changes \(y\) by varing the \(n\) in \(h = H/n\).
 
 The importance of this even power series is that using Richardson Extrapolation to combine steps and knock out higher-order error terms gains us two orders at a time.
 
@@ -3765,15 +3791,15 @@ The Bulirsch-Stoer algorithm utilizes three core concepts in its design.
 
 First, the usage of Richardson Extrapolation.
 
-{\hfill\includegraphics{richardsonExtrapolation.png}\hfill}
+{\hspace*{\fill}\includegraphics{{richardsonExtrapolation}.png}\hspace*{\fill}}
 
-Richardson Extrapolation considers the final answer of a numerical calculation as being an analytic function of an adjustable parameter such as the stepsize $h$. That analytic function can be probed by performing the calculation with various values of $h$, none of them being necessarily small enough to yield the accuracy that we desire. When we know enough about the function, we fit it to some analytic form and then evaluate it at the point where $h = 0$.
+Richardson Extrapolation considers the final answer of a numerical calculation as being an analytic function of an adjustable parameter such as the stepsize \(h\). That analytic function can be probed by performing the calculation with various values of \(h\), none of them being necessarily small enough to yield the accuracy that we desire. When we know enough about the function, we fit it to some analytic form and then evaluate it at the point where \(h = 0\).
 
-Secondly, the usage of rational function extrapolation in Richardson-type applications. Rational function fits can remain good approximations to analytic functions even after the various terms in powers of $h$, all have comparable magnitudes. In other words, $h$ can be so large as to make the whole notion of the “order” of the method meaningless — and the method can still work superbly.
+Secondly, the usage of rational function extrapolation in Richardson-type applications. Rational function fits can remain good approximations to analytic functions even after the various terms in powers of \(h\), all have comparable magnitudes. In other words, \(h\) can be so large as to make the whole notion of the “order” of the method meaningless — and the method can still work superbly.
 
-The third idea is to use an integration method whose error function is strictly even, allowing the rational function or polynomial approximation to be in terms of the variable $h^2$ instead of just $h$.
+The third idea is to use an integration method whose error function is strictly even, allowing the rational function or polynomial approximation to be in terms of the variable \(h^2\) instead of just \(h\).
 
-These three ideas give us the Bulirsch-Stoer method, where a single step takes us from $x$ to $x + H$, where $H$ is supposed to be a significantly large distance. That single step consists of many substeps of the modified midpoint method, which is then extrapolated to zero stepsize.
+These three ideas give us the Bulirsch-Stoer method, where a single step takes us from \(x\) to \(x + H\), where \(H\) is supposed to be a significantly large distance. That single step consists of many substeps of the modified midpoint method, which is then extrapolated to zero stepsize.
 
 (Excerpts derived from \textbf{Numerical Recipes: The Art of Scientific Computing}, Third Edition (2007), p1256; Cambridge University Press; ISBN-10: 0521880688, \href{http://www.nr.com/}{http://www.nr.com/})
 
@@ -3781,7 +3807,7 @@ These three ideas give us the Bulirsch-Stoer method, where a single step takes u
 
 \section{Error Scaling Behaviour}
 \label{bulirschStoer:errorscaling}\label{bulirschStoer:index-2}\label{bulirschStoer:error-scaling-behaviour}
-{\hfill\includegraphics{error_scaling.png}\hfill}
+{\hspace*{\fill}\includegraphics{{error_scaling}.png}\hspace*{\fill}}
 
 The graph above shows the error scaling behaviour for the Bulirsch-Stoer method. This was generated using data from XMDS2 for a simple problem whose analytical solution was known. For more information and to generate this plot yourself see the testsuite/integrators/richardson\_extrapolation/error\_scaling directory. There you will find the .xmds files for generating the data and a python script to generate the plot above (requires gnuplot).
 
@@ -3805,7 +3831,7 @@ There are many cases where it is advantageous to import previously acquired data
 
 Suppose we want to import the following function into XMDS2:
 \begin{gather}
-\begin{split}f(x) = x^2.\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}f(x) = x^2.\end{split}\notag
 \end{gather}
 The first step is to create an hdf5 file, from XMDS2, which specifies the dimensions of the grid for the x dimension. Create and save a new XMDS2 file. For the purposes of this tutorial we shall call it ``grid\_specifier.xmds'' with name ``grid\_specifier''. Within this file, enter the following ``dummy'' vector - which we shall call ``gen\_dummy'' - which depends on the x dimension:
 
@@ -3820,7 +3846,7 @@ The first step is to create an hdf5 file, from XMDS2, which specifies the dimens
 \PYG{n+nt}{\PYGZlt{}/vector\PYGZgt{}}
 \end{Verbatim}
 
-What ``dummy'' is is not actually important. It is only necessary that it is a function of $x$. However, it is important that the domain and lattice for the $x$ dimension are identical to those in the XMDS2 you plan to import the function into. We output the following xsil file (in hdf5 format) by placing a breakpoint in the sequence block as follows:
+What ``dummy'' is is not actually important. It is only necessary that it is a function of \(x\). However, it is important that the domain and lattice for the \(x\) dimension are identical to those in the XMDS2 you plan to import the function into. We output the following xsil file (in hdf5 format) by placing a breakpoint in the sequence block as follows:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}sequence}\PYG{n+nt}{\PYGZgt{}}
@@ -3831,7 +3857,7 @@ What ``dummy'' is is not actually important. It is only necessary that it is a f
   \PYG{n+nt}{\PYGZlt{}/breakpoint\PYGZgt{}}
 \end{Verbatim}
 
-In terminal, compile the file ``grid\_specifier.xmds'' in XMDS2 and run the C code as usual. This creates two files - ``grid.xsil'' and ``grid.h5''. The file ``grid.h5'' contains the list of points which make up the grids for the x dimensions. This data can now be used to ensure that the function $f(x)$ which we will import into XMDS2 is compatible with the the specified grid in your primary XMDS2 file.
+In terminal, compile the file ``grid\_specifier.xmds'' in XMDS2 and run the C code as usual. This creates two files - ``grid.xsil'' and ``grid.h5''. The file ``grid.h5'' contains the list of points which make up the grids for the x dimensions. This data can now be used to ensure that the function \(f(x)\) which we will import into XMDS2 is compatible with the the specified grid in your primary XMDS2 file.
 
 In order to read the ``grid.h5'' data into Mathematica version 6.0, type the following command into terminal:.. code-block:
 
@@ -3839,7 +3865,7 @@ In order to read the ``grid.h5'' data into Mathematica version 6.0, type the fol
 xsil2graphics2 \PYGZhy{}e grid.xsil
 \end{Verbatim}
 
-This creates the Mathematica notebook ``grid.nb''. Open this notebook in Mathematica and evaluate the first set of cells. This has loaded the grid information into Mathematica. For example, suppose you have specified that the $x$ dimension has a lattice of 128 points and a domain of (-32, 32). Then calling ``x1'' in Mathematica should return the following list:
+This creates the Mathematica notebook ``grid.nb''. Open this notebook in Mathematica and evaluate the first set of cells. This has loaded the grid information into Mathematica. For example, suppose you have specified that the \(x\) dimension has a lattice of 128 points and a domain of (-32, 32). Then calling ``x1'' in Mathematica should return the following list:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYGZob{}\PYGZhy{}32., \PYGZhy{}31.5, \PYGZhy{}31., \PYGZhy{}30.5, \PYGZhy{}30., \PYGZhy{}29.5, \PYGZhy{}29., \PYGZhy{}28.5, \PYGZhy{}28., \PYGZhy{}27.5,
@@ -3858,13 +3884,13 @@ This creates the Mathematica notebook ``grid.nb''. Open this notebook in Mathema
 
 This is, of course, the list of points which define our grid.
 
-We are now in a position to define the function $f(x)$ in Mathematica. Type the following command into a cell in the Mathematica notebook ``grid.nb'':
+We are now in a position to define the function \(f(x)\) in Mathematica. Type the following command into a cell in the Mathematica notebook ``grid.nb'':
 
 \begin{Verbatim}[commandchars=\\\{\}]
 f[x\PYGZus{}]:= x\PYGZca{}2
 \end{Verbatim}
 
-At this stage this is an abstract mathematical function as defined in Mathematica. What we need is a list of values for $f(x)$ corresponding to the specified grid points. We will call this list ``func''. This achieved by simply acting the function on the list of grid points ``x1'':
+At this stage this is an abstract mathematical function as defined in Mathematica. What we need is a list of values for \(f(x)\) corresponding to the specified grid points. We will call this list ``func''. This achieved by simply acting the function on the list of grid points ``x1'':
 
 \begin{Verbatim}[commandchars=\\\{\}]
 func := f[x1]
@@ -3908,11 +3934,11 @@ The final step is to import the file ``func.h5'' into your primary XMDS2 file. T
 \PYG{n+nt}{\PYGZlt{}/vector\PYGZgt{}}
 \end{Verbatim}
 
-You're now done. Anytime you want to use $f(x)$ you can simply refer to ``function\_x'' in the vector ``gen\_function\_x''.
+You're now done. Anytime you want to use \(f(x)\) you can simply refer to ``function\_x'' in the vector ``gen\_function\_x''.
 
 The situation is slightly more complicated if the function you wish to import depends on more than one dimension. For example, consider
 \begin{gather}
-\begin{split}g(x,y) = x \sin(y)\end{split}\notag\\\begin{split}\end{split}\notag
+\begin{split}g(x,y) = x \sin(y)\end{split}\notag
 \end{gather}
 As for the single dimensional case, we need to export an hdf5 file from XMDS2 which specifies the dimensions of the grid. As in the one dimensional case, this is done by creating a dummy vector which depends on all the relevant dimensions:
 
@@ -3954,7 +3980,7 @@ and imported into XMDS2 as outlined above.
 
 \section{Convolutions and Fourier transforms}
 \label{advanced_topics:convolutions-and-fourier-transforms}\label{advanced_topics:convolutions}\label{advanced_topics:index-2}
-When evaluating a numerical Fourier transform, XMDS2 doesn't behave as expected. While many simulations have ranges in their spatial coordinate (here assumed to be x) that range from some negative value $x_\text{min}$ to some positive value $x_\text{max}$, the Fourier transform used in XMDS2 treats all spatial coordinates as starting at zero. The result of this is that a phase factor of the form $e^{-i x_\text{min} k}$ is applied to the Fourier space functions after all forward (from rea [...]
+When evaluating a numerical Fourier transform, XMDS2 doesn't behave as expected. While many simulations have ranges in their spatial coordinate (here assumed to be x) that range from some negative value \(x_\text{min}\) to some positive value \(x_\text{max}\), the Fourier transform used in XMDS2 treats all spatial coordinates as starting at zero. The result of this is that a phase factor of the form \(e^{-i x_\text{min} k}\) is applied to the Fourier space functions after all forward (fr [...]
 
 The standard Fourier transform is
 \begin{gather}
@@ -3963,14 +3989,14 @@ The standard Fourier transform is
 The XMDS2 Fourier transform is
 \begin{gather}
 \begin{split}\tilde{\mathcal{F}}\left[f(x)\right](k) &= \frac{1}{\sqrt{2\pi}}\int_{x_\text{min}}^{x_\text{max}} f(x) e^{-i (x+ x_\text{min}) k} dx \\
-&= e^{-i x_\text{min} k} \mathcal{F}\left[f(x)\right](k)\end{split}\notag\\\begin{split}\end{split}\notag
+&= e^{-i x_\text{min} k} \mathcal{F}\left[f(x)\right](k)\end{split}\notag
 \end{gather}
 When the number of forward Fourier transforms and backwards Fourier transforms are unequal a phase factor is required. Some examples of using Fourier transforms in XMDS2 are shown below.
 
 
 \subsection{Example 1}
 \label{advanced_topics:example-1}
-{\hfill\includegraphics{FourierTransformEx1.pdf}\hfill}
+{\hspace*{\fill}\includegraphics{{FourierTransformEx1}.pdf}\hspace*{\fill}}
 
 When data is input in Fourier space and output in real space there is one backwards Fourier transform is required. Therefore the Fourier space data must be multiplied by a phase factor before the backwards Fourier transform is applied.
 \begin{gather}
@@ -3979,18 +4005,18 @@ When data is input in Fourier space and output in real space there is one backwa
 
 \subsection{Example 2}
 \label{advanced_topics:example-2}
-{\hfill\includegraphics{FourierTransformEx2.pdf}\hfill}
+{\hspace*{\fill}\includegraphics{{FourierTransformEx2}.pdf}\hspace*{\fill}}
 
-Functions of the form $h(x) = \int f(x') g(x-x') dx'$ can be evaluated using the convolution theorem:
+Functions of the form \(h(x) = \int f(x') g(x-x') dx'\) can be evaluated using the convolution theorem:
 \begin{gather}
 \begin{split}\mathcal{F}[h(x)](k) = \mathcal{F}[f(x)](k) \times \mathcal{F}[g(x)](k)\end{split}\notag
 \end{gather}
-This requires two forward Fourier transforms to get the two functions f and g into Fourier space, and one backwards Fourier transform to get the resulting product back into real space. Thus in Fourier space the product needs to be multiplied by a phase factor $e^{-i x_\text{min} k}$
+This requires two forward Fourier transforms to get the two functions f and g into Fourier space, and one backwards Fourier transform to get the resulting product back into real space. Thus in Fourier space the product needs to be multiplied by a phase factor \(e^{-i x_\text{min} k}\)
 
 
 \subsection{Example 3}
 \label{advanced_topics:example-3}
-{\hfill\includegraphics{FourierTransformEx3.pdf}\hfill}
+{\hspace*{\fill}\includegraphics{{FourierTransformEx3}.pdf}\hspace*{\fill}}
 
 Sometimes when the convolution theorem is used one of the forward Fourier transforms is calculated analytically and input in Fourier space. In this case only one forward numerical Fourier transform and one backward numerical Fourier transform is used. The number of forward and backward transforms are equal, so no phase factor is required.
 
@@ -4006,7 +4032,7 @@ Dimension aliases specify that two or more dimensions have exactly the same \cod
 
 Dimension aliases are not just a short-hand for defining an additional dimension, they also permit dimensions to be accessed {\hyperref[reference_elements:referencingnonlocal]{\emph{non-locally}}}, which is essential when computing spatial correlation functions.
 
-Here is how to compute a spatial correlation function $g^{(1)}(x, x') = \psi^*(x) \psi(x')$ of the quantity \code{psi}:
+Here is how to compute a spatial correlation function \(g^{(1)}(x, x') = \psi^*(x) \psi(x')\) of the quantity \code{psi}:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}simulation} \PYG{n+na}{xmds\PYGZhy{}version=}\PYG{l+s}{\PYGZdq{}2\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -4100,7 +4126,7 @@ Also note that for some multi-dimensional spaces using different transforms, XMD
 \label{faq:index-5}\label{faq:when-can-i-use-ip-operators-and-why-should-i-and-when-must-i-use-ex-operators}
 An {\hyperref[reference_elements:operatornameselement]{\emph{\textless{}operator\textgreater{}}}} that specifies named operators to be used in integration equations can have the \code{kind="IP"} or \code{kind="EX"} attribute, standing for `interaction picture' and `explicit' operators respectively.  Explicit operators can be used in all situations, and simply construct and calculate a new vector of the form in the square brackets.  IP operators use less memory and can improve speed by al [...]
 
-Some explanation is in order.  The IP algorithm applies the operator separately to the rest of the evolution.  The reason this can be so effective is that the separate evolution can be performed exactly.  The solution of the equation $\frac{d \psi}{dt} = L \psi$ is $\psi(t+\Delta t) = exp(L \Delta t) \psi(t)$ for arbitrarily large timestep $\Delta t$.  For a diagonal linear \code{L}, the matrix exponential is straightforward.  Also, when it is constant, then the exponential can be comput [...]
+Some explanation is in order.  The IP algorithm applies the operator separately to the rest of the evolution.  The reason this can be so effective is that the separate evolution can be performed exactly.  The solution of the equation \(\frac{d \psi}{dt} = L \psi\) is \(\psi(t+\Delta t) = exp(L \Delta t) \psi(t)\) for arbitrarily large timestep \(\Delta t\).  For a diagonal linear \code{L}, the matrix exponential is straightforward.  Also, when it is constant, then the exponential can be  [...]
 
 Therefore, the limitations of IP operators themselves means that they can only be applied to to named components of one of the integration vectors, and not functions of those components.  Furthermore, an IP operator acting on a component must only be used in the derivative for that particular component.  Secondly, due to the implementation of IP operators in XMDS2, it is not safe to use them in comments, or in conjunction with declared variables.  It is also not safe to multiply or divid [...]
 
@@ -4139,7 +4165,7 @@ Dimensions using matrix transforms should be first for performance reasons.  Unl
 
 \section{Reduce code complexity}
 \label{optimisation_hints:reduce-code-complexity}
-Avoid transcendental functions like $\sin(x)$ or $\exp(x)$ in inner loops. Not all operations are made equal, use multiplication over division.
+Avoid transcendental functions like \(\sin(x)\) or \(\exp(x)\) in inner loops. Not all operations are made equal, use multiplication over division.
 
 
 \subsection{Optimising with the Interaction Picture (IP) operator}
@@ -4147,7 +4173,7 @@ Avoid transcendental functions like $\sin(x)$ or $\exp(x)$ in inner loops. Not a
 You should use the IP operator when you can. Only use the EX operator when you have to. If you must use the EX operator, consider making it \code{constant="no"}. It uses less memory.
 When you use the IP operator, make sure you know what it's doing.  Do not pre- or post-multiply that term in your equations, XMDS will do a fairly thorough check to see you aren't using the IP operator improperly, but it is possible to confuse XMDS's check.
 
-If your simulation uses two or more dimensions, check to see if your IP operator is separable, i.e. can be written in the form $f(kx) + g(ky)$ (this is frequently possible in atom-optics simulations). If your IP operator is separable, create separate IP operators for each dimension.  This provides a significant speedup (\textasciitilde{}30\%) for simulations using an adaptive integrator.  For example, instead of using the IP operator:
+If your simulation uses two or more dimensions, check to see if your IP operator is separable, i.e. can be written in the form \(f(kx) + g(ky)\) (this is frequently possible in atom-optics simulations). If your IP operator is separable, create separate IP operators for each dimension.  This provides a significant speedup (\textasciitilde{}30\%) for simulations using an adaptive integrator.  For example, instead of using the IP operator:
 
 \begin{Verbatim}[commandchars=\\\{\}]
 \PYG{n+nt}{\PYGZlt{}operator} \PYG{n+na}{kind=}\PYG{l+s}{\PYGZdq{}ip\PYGZdq{}}\PYG{n+nt}{\PYGZgt{}}
@@ -4189,12 +4215,12 @@ When using the IP operator, check if your operator is purely real or purely imag
 Evolution equations do not need to be written in the position basis.  If your equations are diagonal in the spectral basis, then it makes more sense to compute the time derivative terms in that basis.  For example, if you have the system
 \begin{gather}
 \begin{split}\frac{d\psi_1(x)}{dt} &= i \frac{\hbar}{2M} \frac{d^2\psi_1(x)}{dx^2} - i \Omega \psi_2(x)\\
-\frac{d\psi_2(x)}{dt} &= i \frac{\hbar}{2M} \frac{d^2\psi_2(x)}{dx^2} - i \Omega \psi_1(x)\end{split}\notag\\\begin{split}\end{split}\notag
+\frac{d\psi_2(x)}{dt} &= i \frac{\hbar}{2M} \frac{d^2\psi_2(x)}{dx^2} - i \Omega \psi_1(x)\end{split}\notag
 \end{gather}
 then this is diagonal in the Fourier basis where it takes the form
 \begin{gather}
 \begin{split}\frac{d\psi_1(k_x)}{dt} &= -i \frac{\hbar k_x^2}{2M} \psi_1(k_x) - i \Omega \psi_2(k_x)\\
-\frac{d\psi_2(k_x)}{dt} &= -i \frac{\hbar k_x^2}{2M} \psi_2(k_x) - i \Omega \psi_1(k_x)\end{split}\notag\\\begin{split}\end{split}\notag
+\frac{d\psi_2(k_x)}{dt} &= -i \frac{\hbar k_x^2}{2M} \psi_2(k_x) - i \Omega \psi_1(k_x)\end{split}\notag
 \end{gather}
 The first term in each evolution equation can be solved exactly with an IP operator, and the second term is diagonal in Fourier space.  This can be written in XMDS as:
 
@@ -4218,7 +4244,7 @@ The first term in each evolution equation can be solved exactly with an IP opera
 
 Although the \code{dpsi0\_dt} code reads the same in position and Fourier space, it is the \code{basis=kx} attribute on \code{\textless{}integration\_vectors\textgreater{}} that causes the evolution code to be executed in Fourier space.
 
-A final optimisation is to cause the integration code itself to operate in Fourier space.  By default, all time stepping (i.e. $f(t + \Delta t) = f(t) + f'(t) \Delta t$ for forward-Euler integration) occurs in the position space.  As the derivative terms can be computed in Fourier space, it is faster to also to the time stepping in Fourier space too.  This then means that no Fourier transforms will be needed at all during this integrate block (except as needed by sampling).  To cause tim [...]
+A final optimisation is to cause the integration code itself to operate in Fourier space.  By default, all time stepping (i.e. \(f(t + \Delta t) = f(t) + f'(t) \Delta t\) for forward-Euler integration) occurs in the position space.  As the derivative terms can be computed in Fourier space, it is faster to also to the time stepping in Fourier space too.  This then means that no Fourier transforms will be needed at all during this integrate block (except as needed by sampling).  To cause t [...]
 
 The fully optimised code then reads:
 
@@ -4287,7 +4313,7 @@ ls libatlas*.deb
 Then, for each of the .deb packages listed by the ls command, install via:
 
 \begin{Verbatim}[commandchars=\\\{\}]
-sudo dpkg -i \textless{}filename here\textgreater{}.deb
+sudo dpkg \PYGZhy{}i \PYGZlt{}filename here\PYGZgt{}.deb
 \end{Verbatim}
 
 This procedure was tested on Ubuntu 12.04 LTS, but an identical or very similar procedure should work for other Ubuntu/Debian versions.
@@ -4359,7 +4385,7 @@ Note that the groundstate-finder doesn't need to have all of the components that
 
 \subsection{Use an energy or momentum offset}
 \label{optimisation_hints:use-an-energy-or-momentum-offset}
-This is just the interaction picture with a constant term in the Hamiltonian. If your state is going to rotate like $e^{i(\omega + \delta\omega)t}$, then transform your equations to remove the $e^{i \omega t}$ term. Likewise for spatial rotations, if one mode will be moving on average with momentum $\hbar k$, then transform your equations to remove that term. This way, you may be able to reduce the density of points you need in that dimension. Warning: don't forget to consider this when  [...]
+This is just the interaction picture with a constant term in the Hamiltonian. If your state is going to rotate like \(e^{i(\omega + \delta\omega)t}\), then transform your equations to remove the \(e^{i \omega t}\) term. Likewise for spatial rotations, if one mode will be moving on average with momentum \(\hbar k\), then transform your equations to remove that term. This way, you may be able to reduce the density of points you need in that dimension. Warning: don't forget to consider this [...]
 
 \index{xsil2graphics2}\index{Exporting data}
 
@@ -4387,23 +4413,22 @@ Write normal XMDS script that behaves as you expect.
 Add a \code{\textless{}testing\textgreater{}} element to your script.  You can read the description of this element and its contents below, and have a look at other testcases for examples, but the basic structure is simple:.
 
 \end{enumerate}
-{\hyperref[developer:testingelement]{\emph{}}}{\hyperref[developer:commandlineelement]{\emph{}}}{\hyperref[developer:commandlineelement]{\emph{}}}{\hyperref[reference_elements:argumentselement]{\emph{}}}{\hyperref[reference_elements:argumentelement]{\emph{}}}{\hyperref[reference_elements:argumentelement]{\emph{}}}{\hyperref[reference_elements:argumentselement]{\emph{}}}{\hyperref[developer:inputxsilfileelement]{\emph{}}}{\hyperref[developer:xsilfileelement]{\emph{}}}{\hyperref[developer: [...]
-\begin{Verbatim}[commandchars=\\\{\}]
-\PYG{n+nt}{\PYGZlt{}testing}\PYG{n+nt}{\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}command\PYGZus{}line}\PYG{n+nt}{\PYGZgt{}} \PYG{n+nt}{\PYGZlt{}/command\PYGZus{}line\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}arguments}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}argument} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}argument} \PYG{n+nt}{/\PYGZgt{}}
+\begin{alltt}
+\textless{}{\hyperref[developer:testingelement]{\emph{testing}}}\textgreater{}
+  \textless{}{\hyperref[developer:commandlineelement]{\emph{command\_line}}}\textgreater{} \textless{}{\hyperref[developer:commandlineelement]{\emph{/command\_line}}}\textgreater{}
+  \textless{}{\hyperref[reference_elements:argumentselement]{\emph{arguments}}}\textgreater{}
+    \textless{}{\hyperref[reference_elements:argumentelement]{\emph{argument}}} /\textgreater{}
+    \textless{}{\hyperref[reference_elements:argumentelement]{\emph{argument}}} /\textgreater{}
     ...
-  \PYG{n+nt}{\PYGZlt{}/arguments\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}input\PYGZus{}xsil\PYGZus{}file} \PYG{n+nt}{/\PYGZgt{}}
-  \PYG{n+nt}{\PYGZlt{}xsil\PYGZus{}file}\PYG{n+nt}{\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}moment\PYGZus{}group} \PYG{n+nt}{/\PYGZgt{}}
-    \PYG{n+nt}{\PYGZlt{}moment\PYGZus{}group} \PYG{n+nt}{/\PYGZgt{}}
+  \textless{}{\hyperref[reference_elements:argumentselement]{\emph{/arguments}}}\textgreater{}
+  \textless{}{\hyperref[developer:inputxsilfileelement]{\emph{input\_xsil\_file}}} /\textgreater{}
+  \textless{}{\hyperref[developer:xsilfileelement]{\emph{xsil\_file}}}\textgreater{}
+    \textless{}{\hyperref[developer:momentgroupelement]{\emph{moment\_group}}} /\textgreater{}
+    \textless{}{\hyperref[developer:momentgroupelement]{\emph{moment\_group}}} /\textgreater{}
     ...
-  \PYG{n+nt}{\PYGZlt{}/xsil\PYGZus{}file\PYGZgt{}}
-\PYG{n+nt}{\PYGZlt{}/testing\PYGZgt{}}
-\end{Verbatim}
+  \textless{}{\hyperref[developer:xsilfileelement]{\emph{/xsil\_file}}}\textgreater{}
+\textless{}{\hyperref[developer:testingelement]{\emph{/testing}}}\textgreater{}
+\end{alltt}
 \begin{enumerate}
 \setcounter{enumi}{2}
 \item {} 
@@ -4455,7 +4480,7 @@ NOTE: Before you can run the create\_release\_version.sh file, there are a few p
 
 \section{How to update \texttt{XMDS2} script validator (XML schema)}
 \label{developer:how-to-update-xmds2-script-validator-xml-schema}\label{developer:index-2}\label{developer:howtoaddelementtovalidator}
-{\hfill\includegraphics{IntroduceNewElement.png}}
+{\hspace*{\fill}\includegraphics{{IntroduceNewElement}.png}}
 
 This is a short guide to adding an element to XMDS2, so that it can be validated by the XMDS2 script validator. In this guide, the example being used will be the addition of a matrix element to the validator.  The matrix will have a  ‘name’ and a ‘type’ (so it can be called later, and the type is known for future reference). Each matrix will also need a ‘row’ component, and possibly an initialisation value.
 
@@ -4480,7 +4505,7 @@ Commit both \code{xpdeint/support/xpdeint.rnc} and \code{xpdeint/support/xpdeint
 
 \section{How to introduce a new integrator Stepper into the XMDS2 environment}
 \label{developer:how-to-introduce-a-new-integrator-stepper-into-the-xmds2-environment}\label{developer:howtoaddintegrator}\label{developer:index-3}
-{\hfill\includegraphics{IntroduceNewIntegrationTechnique.png}}
+{\hspace*{\fill}\includegraphics{{IntroduceNewIntegrationTechnique}.png}}
 
 This is a short guide to adding a new stepper containing a new mathematical technique to XMDS2, which can then be used by to integrate equations. This guide describes the logistics of introducing a new stepper and as such, the code inside the stepper template is outside the scope of this document. The new stepper which will be used in this guide will be called ‘IntegrateMethodStepper’.
 
@@ -4521,35 +4546,35 @@ The flowcharts have been created in open source diagram drawing program Dia, and
 
 \subsection{Overall process for parsing XML file in XMDS2}
 \label{developer:overall-process-for-parsing-xml-file-in-xmds2}
-{\hfill\includegraphics{Overall_Flowchart.png}\hfill}
+{\hspace*{\fill}\includegraphics{{Overall_Flowchart}.png}\hspace*{\fill}}
 
 The original .dia file can be downloaded here.
 
 
 \subsection{parser2.py parses XML file (Sub process 3)}
 \label{developer:parser2-py-parses-xml-file-sub-process-3}
-{\hfill\includegraphics{Subprocess3_ParsingXMLFile.png}\hfill}
+{\hspace*{\fill}\includegraphics{{Subprocess3_ParsingXMLFile}.png}\hspace*{\fill}}
 
 You can download the original dia file here.
 
 
 \subsection{Pass file to XMDS2Parser to parse xmlDocument with parseXMLDocument() (Sub process 3.4)}
 \label{developer:pass-file-to-xmds2parser-to-parse-xmldocument-with-parsexmldocument-sub-process-3-4}
-{\hfill\includegraphics{Subprocess3_4_parseXMLDocument.png}\hfill}
+{\hspace*{\fill}\includegraphics{{Subprocess3_4_parseXMLDocument}.png}\hspace*{\fill}}
 
 You can download the original dia file here.
 
 
 \subsection{Parse Top Level Sequence elements (Sub process 3.4.11)}
 \label{developer:parse-top-level-sequence-elements-sub-process-3-4-11}
-{\hfill\includegraphics{Subprocess3_4_11_ParseTopLvlSeqElements.png}\hfill}
+{\hspace*{\fill}\includegraphics{{Subprocess3_4_11_ParseTopLvlSeqElements}.png}\hspace*{\fill}}
 
 You can download the original dia file here.
 
 
 \subsection{Parse Integrate Element (Sub process 3.4.11.2)}
 \label{developer:parse-integrate-element-sub-process-3-4-11-2}
-{\hfill\includegraphics{Subprocess3_4_11_2_ParseIntegrateElement.png}\hfill}
+{\hspace*{\fill}\includegraphics{{Subprocess3_4_11_2_ParseIntegrateElement}.png}\hspace*{\fill}}
 
 You can download the original dia file here.
 
@@ -5042,6 +5067,36 @@ If your document contains nontrivial examples of program code, we recommend rele
 \chapter{News}
 \label{news:news}\label{news:index-0}\label{news::doc}\label{news:id1}
 
+\section{XMDS 2.2.3 ``It came from the deep'' (January 20, 2017)}
+\label{news:xmds-2-2-3-it-came-from-the-deep-january-20-2017}
+XMDS 2.2.3 is primarily a maintenance release consolidating various bug fixes and small improvements that have been made. Specifically
+\begin{itemize}
+\item {} 
+A number of bugs have been fixed
+
+\item {} 
+Remove requirement that samples must divide into steps when using an adaptive stepper
+
+\item {} 
+Make initial step size more robust when using adaptive stepper
+
+\item {} 
+Improved debug mode
+
+\item {} 
+Added extra examples
+
+\item {} 
+Documentation improvements
+
+\end{itemize}
+
+
+\section{XMDS 2.2.2 ``XMDS2 is a game of two halves'' (October 13, 2014)}
+\label{news:xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014}
+High priority bug fixes to the previous release.
+
+
 \section{XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}
 \label{news:xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014}
 XMDS 2.2.1 contains minor bugfixes and updates. This includes documentation improvements, superior handling of external packages and more informative errors.
diff --git a/documentation/latex/xmds2.toc b/documentation/latex/xmds2.toc
index fc8dc5f..8157f0a 100644
--- a/documentation/latex/xmds2.toc
+++ b/documentation/latex/xmds2.toc
@@ -21,30 +21,30 @@
 \contentsline {section}{\numberline {5.1}Configuration, installation and runtime options}{43}{section.5.1}
 \contentsline {section}{\numberline {5.2}Useful XML Syntax}{44}{section.5.2}
 \contentsline {section}{\numberline {5.3}XMDS2 XML Schema}{44}{section.5.3}
-\contentsline {section}{\numberline {5.4}XMDS2 script elements}{46}{section.5.4}
+\contentsline {section}{\numberline {5.4}XMDS2 script elements}{47}{section.5.4}
 \contentsline {subsection}{\numberline {5.4.1}Simulation element}{47}{subsection.5.4.1}
 \contentsline {subsection}{\numberline {5.4.2}Name element}{47}{subsection.5.4.2}
 \contentsline {subsection}{\numberline {5.4.3}Author element}{47}{subsection.5.4.3}
-\contentsline {subsection}{\numberline {5.4.4}Description element}{47}{subsection.5.4.4}
-\contentsline {subsection}{\numberline {5.4.5}Features Elements}{47}{subsection.5.4.5}
+\contentsline {subsection}{\numberline {5.4.4}Description element}{48}{subsection.5.4.4}
+\contentsline {subsection}{\numberline {5.4.5}Features Elements}{48}{subsection.5.4.5}
 \contentsline {subsubsection}{Arguments Element}{48}{subsubsection*.5}
 \contentsline {paragraph}{Argument element}{49}{paragraph*.6}
-\contentsline {subsubsection}{Auto\_vectorise element}{49}{subsubsection*.7}
-\contentsline {subsubsection}{Benchmark}{49}{subsubsection*.8}
-\contentsline {subsubsection}{Bing}{49}{subsubsection*.9}
-\contentsline {subsubsection}{C Flags}{49}{subsubsection*.10}
+\contentsline {subsubsection}{Auto\_vectorise element}{50}{subsubsection*.7}
+\contentsline {subsubsection}{Benchmark}{50}{subsubsection*.8}
+\contentsline {subsubsection}{Bing}{50}{subsubsection*.9}
+\contentsline {subsubsection}{C Flags}{50}{subsubsection*.10}
 \contentsline {subsubsection}{Chunked Output}{50}{subsubsection*.11}
-\contentsline {subsubsection}{Diagnostics}{50}{subsubsection*.12}
-\contentsline {subsubsection}{Error Check}{50}{subsubsection*.13}
+\contentsline {subsubsection}{Diagnostics}{51}{subsubsection*.12}
+\contentsline {subsubsection}{Error Check}{51}{subsubsection*.13}
 \contentsline {subsubsection}{Halt\_Non\_Finite}{51}{subsubsection*.14}
 \contentsline {subsubsection}{fftw element}{51}{subsubsection*.15}
 \contentsline {subsubsection}{Globals}{51}{subsubsection*.16}
-\contentsline {subsubsection}{OpenMP}{51}{subsubsection*.17}
-\contentsline {subsubsection}{Precision}{51}{subsubsection*.18}
+\contentsline {subsubsection}{OpenMP}{52}{subsubsection*.17}
+\contentsline {subsubsection}{Precision}{52}{subsubsection*.18}
 \contentsline {subsubsection}{Validation}{52}{subsubsection*.19}
 \contentsline {subsection}{\numberline {5.4.6}Driver Element}{53}{subsection.5.4.6}
-\contentsline {subsection}{\numberline {5.4.7}Geometry Element}{53}{subsection.5.4.7}
-\contentsline {subsubsection}{The ``dft'' transform}{54}{subsubsection*.24}
+\contentsline {subsection}{\numberline {5.4.7}Geometry Element}{54}{subsection.5.4.7}
+\contentsline {subsubsection}{The ``dft'' transform}{55}{subsubsection*.24}
 \contentsline {subsubsection}{The ``dct'' transform}{55}{subsubsection*.25}
 \contentsline {subsubsection}{The ``dst'' transform}{56}{subsubsection*.26}
 \contentsline {subsubsection}{The ``bessel'' and ``bessel-neumann'' transforms}{57}{subsubsection*.27}
@@ -64,7 +64,7 @@
 \contentsline {subsection}{\numberline {5.4.13}Integrate element}{66}{subsection.5.4.13}
 \contentsline {subsubsection}{Operators and operator elements}{67}{subsubsection*.42}
 \contentsline {subsubsection}{Algorithms}{69}{subsubsection*.47}
-\contentsline {paragraph}{SI and SIC algorithms}{69}{paragraph*.48}
+\contentsline {paragraph}{SI and SIC algorithms}{70}{paragraph*.48}
 \contentsline {paragraph}{Runge-Kutta algorithms}{70}{paragraph*.49}
 \contentsline {paragraph}{Adaptive Runge-Kutta algorithms}{70}{paragraph*.50}
 \contentsline {paragraph}{Richardson Extrapolation Algorithms and the Bulirsch-Stoer Method}{71}{paragraph*.51}
@@ -107,7 +107,7 @@
 \contentsline {subsection}{\numberline {9.3.2}Faster libraries}{89}{subsection.9.3.2}
 \contentsline {subsection}{\numberline {9.3.3}Auto-vectorisation}{90}{subsection.9.3.3}
 \contentsline {subsection}{\numberline {9.3.4}OpenMP}{90}{subsection.9.3.4}
-\contentsline {subsection}{\numberline {9.3.5}Parallelisation with MPI}{91}{subsection.9.3.5}
+\contentsline {subsection}{\numberline {9.3.5}Parallelisation with MPI}{90}{subsection.9.3.5}
 \contentsline {section}{\numberline {9.4}Atom-optics-specific hints}{91}{section.9.4}
 \contentsline {subsection}{\numberline {9.4.1}Separate out imaginary-time calculation code}{91}{subsection.9.4.1}
 \contentsline {subsection}{\numberline {9.4.2}Use an energy or momentum offset}{91}{subsection.9.4.2}
@@ -135,11 +135,13 @@
 \contentsline {section}{\numberline {12.1}GNU General Public License}{115}{section.12.1}
 \contentsline {section}{\numberline {12.2}GNU Free Documentation License}{118}{section.12.2}
 \contentsline {chapter}{\numberline {13}News}{125}{chapter.13}
-\contentsline {section}{\numberline {13.1}XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{125}{section.13.1}
-\contentsline {section}{\numberline {13.2}XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{125}{section.13.2}
-\contentsline {section}{\numberline {13.3}XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{126}{section.13.3}
-\contentsline {section}{\numberline {13.4}XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{126}{section.13.4}
-\contentsline {section}{\numberline {13.5}XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{126}{section.13.5}
-\contentsline {section}{\numberline {13.6}XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{127}{section.13.6}
-\contentsline {section}{\numberline {13.7}XMDS 2.0 ``Shiny!'' (September 13, 2010)}{127}{section.13.7}
+\contentsline {section}{\numberline {13.1}XMDS 2.2.3 ``It came from the deep'' (January 20, 2017)}{125}{section.13.1}
+\contentsline {section}{\numberline {13.2}XMDS 2.2.2 ``XMDS2 is a game of two halves'' (October 13, 2014)}{125}{section.13.2}
+\contentsline {section}{\numberline {13.3}XMDS 2.2.1 ``XMDS2 is a game of two halves'' (September 30, 2014)}{125}{section.13.3}
+\contentsline {section}{\numberline {13.4}XMDS 2.2.0 ``Out of cheese error'' (January 13, 2014)}{125}{section.13.4}
+\contentsline {section}{\numberline {13.5}XMDS 2.1.4 ``Well if this isn't nice, I don't know what is'' (September 27, 2013)}{126}{section.13.5}
+\contentsline {section}{\numberline {13.6}XMDS 2.1.3 ``Happy Mollusc'' (June 7, 2013)}{126}{section.13.6}
+\contentsline {section}{\numberline {13.7}XMDS 2.1.2 ``Happy Mollusc'' (October 15, 2012)}{126}{section.13.7}
+\contentsline {section}{\numberline {13.8}XMDS 2.1 ``Happy Mollusc'' (June 14, 2012)}{127}{section.13.8}
+\contentsline {section}{\numberline {13.9}XMDS 2.0 ``Shiny!'' (September 13, 2010)}{128}{section.13.9}
 \contentsline {chapter}{Index}{129}{section*.55}
diff --git a/documentation/licensing.html b/documentation/licensing.html
index 8ce9744..f708371 100644
--- a/documentation/licensing.html
+++ b/documentation/licensing.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Licensing — XMDS2 2.2.2 documentation</title>
+    <title>Licensing — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="News" href="news.html" />
     <link rel="prev" title="Developer Documentation" href="developer.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="developer.html" title="Developer Documentation"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="licensing">
 <span id="index-0"></span><span id="id1"></span><h1>Licensing<a class="headerlink" href="#licensing" title="Permalink to this headline">¶</a></h1>
@@ -248,7 +248,7 @@ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.</div></b
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -262,7 +262,7 @@ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.</div></b
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -279,7 +279,7 @@ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.</div></b
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -291,13 +291,13 @@ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.</div></b
         <li class="right" >
           <a href="developer.html" title="Developer Documentation"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/news.html b/documentation/news.html
index 0f47662..831397a 100644
--- a/documentation/news.html
+++ b/documentation/news.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>News — XMDS2 2.2.2 documentation</title>
+    <title>News — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,11 +25,11 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="prev" title="Licensing" href="licensing.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -38,17 +38,33 @@
         <li class="right" >
           <a href="licensing.html" title="Licensing"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="news">
 <span id="index-0"></span><span id="id1"></span><h1>News<a class="headerlink" href="#news" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="xmds-2-2-3-it-came-from-the-deep-january-20-2017">
+<h2>XMDS 2.2.3 “It came from the deep” (January 20, 2017)<a class="headerlink" href="#xmds-2-2-3-it-came-from-the-deep-january-20-2017" title="Permalink to this headline">¶</a></h2>
+<p>XMDS 2.2.3 is primarily a maintenance release consolidating various bug fixes and small improvements that have been made. Specifically</p>
+<ul class="simple">
+<li>A number of bugs have been fixed</li>
+<li>Remove requirement that samples must divide into steps when using an adaptive stepper</li>
+<li>Make initial step size more robust when using adaptive stepper</li>
+<li>Improved debug mode</li>
+<li>Added extra examples</li>
+<li>Documentation improvements</li>
+</ul>
+</div>
+<div class="section" id="xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">
+<h2>XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)<a class="headerlink" href="#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014" title="Permalink to this headline">¶</a></h2>
+<p>High priority bug fixes to the previous release.</p>
+</div>
 <div class="section" id="xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">
 <h2>XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)<a class="headerlink" href="#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014" title="Permalink to this headline">¶</a></h2>
 <p>XMDS 2.2.1 contains minor bugfixes and updates. This includes documentation improvements, superior handling of external packages and more informative errors.</p>
@@ -57,7 +73,7 @@
 <h2>XMDS 2.2.0 “Out of cheese error” (January 13, 2014)<a class="headerlink" href="#xmds-2-2-0-out-of-cheese-error-january-13-2014" title="Permalink to this headline">¶</a></h2>
 <p>XMDS 2.2.0 contains a number of new features, as well as bugfixes and updates. Specifically</p>
 <ul class="simple">
-<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><em>Optimisation hints</em>< [...]
+<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><span>Optimisation hints</sp [...]
 <li>Significant speed optimisations for adaptive integrators with IP operators (past IP operator calculations are re-used if the time-step hasn’t changed).</li>
 <li>The “constant” attribute for IP/EX operators is now unnecessary and considered advanced usage.  If you don’t know whether to specify constant=”yes” or constant=”no”, don’t specify either.</li>
 <li>The xsil2graphics2 data exporter now supports Matlab, Octave, Mathematica and Python in all output formats, as well as R (HDF5 only).  The Matlab/Octave scripts are now identical.  A script generated for one will work for the other.</li>
@@ -75,7 +91,7 @@
 <p>The XMDS 2.1.4 update contains many new improvements and bugfixes:</p>
 <ul class="simple">
 <li><em>xsil2graphics2</em> now supports all output formats for MATLAB, Octave and Python.  The scripts generated for MATLAB/Octave are compatible with both.</li>
-<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><em>nonlocally</em></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><em>dimension alias</em></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
+<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><span>nonlocally</span></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><span>dimension alias</span></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
 <li>Correct the Fourier basis for dimensions using Hermite-Gauss transforms.  Previously ‘kx’ was effectively behaving as ‘-kx’.</li>
 <li>Improve the performance of ‘nx’ <–> ‘kx’ Hermite-Gauss transforms.</li>
 <li>Stochastic error checking with runtime noise generation now works correctly.  Previously different random numbers were generated for the full-step paths and the half-step paths.</li>
@@ -109,7 +125,7 @@
 </div>
 <div class="section" id="xmds-2-1-happy-mollusc-june-14-2012">
 <h2>XMDS 2.1 “Happy Mollusc” (June 14, 2012)<a class="headerlink" href="#xmds-2-1-happy-mollusc-june-14-2012" title="Permalink to this headline">¶</a></h2>
-<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><em>here</em></a> for details about the installers.</p>
+<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><span>here</span></a> for details about the installers.</p>
 <p>Existing users should note that this release introduces a more concise syntax for moment groups.  You can now use:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><sampling_group</span> <span class="na">initial_sample=</span><span class="s">"yes"</span> <span class="na">basis=</span><span class="s">"x y z"</span><span class="nt">></span>
     ...
@@ -128,7 +144,7 @@
 <p>In both cases, although the old syntax is not described in the documentation, it is still supported, so existing scripts will work without any changes.</p>
 <p>Other changes in XMDS 2.1 include:</p>
 <ul class="simple">
-<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><em>here</em></a> for details.</li>
+<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><span>here</span></a> for details.</li>
 <li><em>noise_vectors</em> can now be used in non-uniform dimensions (e.g. dimensions using the Bessel transform for cylindrical symmetry).</li>
 <li>“loose” <em>geometry_matching_mode</em> for HDF5 vector initialisation.  This enables extending the simulation grid from one simulation to the next, or coarsening or refining a grid when importing.</li>
 <li><em>vectors</em> can now be initialised by integrating over dimensions of other vectors.  <em>computed_vectors</em> always supported this, now <em>vectors</em> do too.</li>
@@ -166,7 +182,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -174,6 +190,8 @@
   <h3><a href="index.html">Table Of Contents</a></h3>
   <ul>
 <li><a class="reference internal" href="#">News</a><ul>
+<li><a class="reference internal" href="#xmds-2-2-3-it-came-from-the-deep-january-20-2017">XMDS 2.2.3 “It came from the deep” (January 20, 2017)</a></li>
+<li><a class="reference internal" href="#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-2-0-out-of-cheese-error-january-13-2014">XMDS 2.2.0 “Out of cheese error” (January 13, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013">XMDS 2.1.4 “Well if this isn’t nice, I don’t know what is” (September 27, 2013)</a></li>
@@ -185,7 +203,7 @@
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -202,7 +220,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -211,13 +229,13 @@
         <li class="right" >
           <a href="licensing.html" title="Licensing"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/news_content.html b/documentation/news_content.html
index ccb06b3..6b058fd 100644
--- a/documentation/news_content.html
+++ b/documentation/news_content.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>News — XMDS2 2.2.2 documentation</title>
+    <title>News — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,26 +25,42 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" /> 
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="news">
 <h1>News<a class="headerlink" href="#news" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="xmds-2-2-3-it-came-from-the-deep-january-20-2017">
+<h2>XMDS 2.2.3 “It came from the deep” (January 20, 2017)<a class="headerlink" href="#xmds-2-2-3-it-came-from-the-deep-january-20-2017" title="Permalink to this headline">¶</a></h2>
+<p>XMDS 2.2.3 is primarily a maintenance release consolidating various bug fixes and small improvements that have been made. Specifically</p>
+<ul class="simple">
+<li>A number of bugs have been fixed</li>
+<li>Remove requirement that samples must divide into steps when using an adaptive stepper</li>
+<li>Make initial step size more robust when using adaptive stepper</li>
+<li>Improved debug mode</li>
+<li>Added extra examples</li>
+<li>Documentation improvements</li>
+</ul>
+</div>
+<div class="section" id="xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">
+<h2>XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)<a class="headerlink" href="#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014" title="Permalink to this headline">¶</a></h2>
+<p>High priority bug fixes to the previous release.</p>
+</div>
 <div class="section" id="xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">
 <h2>XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)<a class="headerlink" href="#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014" title="Permalink to this headline">¶</a></h2>
 <p>XMDS 2.2.1 contains minor bugfixes and updates. This includes documentation improvements, superior handling of external packages and more informative errors.</p>
@@ -53,7 +69,7 @@
 <h2>XMDS 2.2.0 “Out of cheese error” (January 13, 2014)<a class="headerlink" href="#xmds-2-2-0-out-of-cheese-error-january-13-2014" title="Permalink to this headline">¶</a></h2>
 <p>XMDS 2.2.0 contains a number of new features, as well as bugfixes and updates. Specifically</p>
 <ul class="simple">
-<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><em>Optimisation hints</em>< [...]
+<li>Separated IP operators.  This is a significant performance optimisation (~30%) for problems with two or more dimensions.  It requires separating IP operators of the form “f(kx) + g(ky)” (e.g. kinetic energy for quantum physics) into <em>two</em> IP operators and explicitly setting the dimensions=”x” and dimensions=”y” attributes on each.  See <a class="reference internal" href="optimisation_hints.html#optimisationhints"><span>Optimisation hints</sp [...]
 <li>Significant speed optimisations for adaptive integrators with IP operators (past IP operator calculations are re-used if the time-step hasn’t changed).</li>
 <li>The “constant” attribute for IP/EX operators is now unnecessary and considered advanced usage.  If you don’t know whether to specify constant=”yes” or constant=”no”, don’t specify either.</li>
 <li>The xsil2graphics2 data exporter now supports Matlab, Octave, Mathematica and Python in all output formats, as well as R (HDF5 only).  The Matlab/Octave scripts are now identical.  A script generated for one will work for the other.</li>
@@ -71,7 +87,7 @@
 <p>The XMDS 2.1.4 update contains many new improvements and bugfixes:</p>
 <ul class="simple">
 <li><em>xsil2graphics2</em> now supports all output formats for MATLAB, Octave and Python.  The scripts generated for MATLAB/Octave are compatible with both.</li>
-<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><em>nonlocally</em></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><em>dimension alias</em></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
+<li>Fix a bug when <a class="reference internal" href="reference_elements.html#referencingnonlocal"><span>nonlocally</span></a> referencing a <a class="reference internal" href="advanced_topics.html#dimensionaliases"><span>dimension alias</span></a> with subsampling in <em>sampling_group</em> blocks or in some situations when MPI is used.  This bug caused incorrect elements of the vector to be accessed.</li>
 <li>Correct the Fourier basis for dimensions using Hermite-Gauss transforms.  Previously ‘kx’ was effectively behaving as ‘-kx’.</li>
 <li>Improve the performance of ‘nx’ <–> ‘kx’ Hermite-Gauss transforms.</li>
 <li>Stochastic error checking with runtime noise generation now works correctly.  Previously different random numbers were generated for the full-step paths and the half-step paths.</li>
@@ -105,7 +121,7 @@
 </div>
 <div class="section" id="xmds-2-1-happy-mollusc-june-14-2012">
 <h2>XMDS 2.1 “Happy Mollusc” (June 14, 2012)<a class="headerlink" href="#xmds-2-1-happy-mollusc-june-14-2012" title="Permalink to this headline">¶</a></h2>
-<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><em>here</em></a> for details about the installers.</p>
+<p>XMDS 2.1 is a significant upgrade with many improvements and bug fixes since 2.0. We also now have installers for Linux and Mac OS X, so you no longer have to build XMDS from source! See <a class="reference internal" href="installation.html#installation"><span>here</span></a> for details about the installers.</p>
 <p>Existing users should note that this release introduces a more concise syntax for moment groups.  You can now use:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><sampling_group</span> <span class="na">initial_sample=</span><span class="s">"yes"</span> <span class="na">basis=</span><span class="s">"x y z"</span><span class="nt">></span>
     ...
@@ -124,7 +140,7 @@
 <p>In both cases, although the old syntax is not described in the documentation, it is still supported, so existing scripts will work without any changes.</p>
 <p>Other changes in XMDS 2.1 include:</p>
 <ul class="simple">
-<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><em>here</em></a> for details.</li>
+<li>The <em>lattice</em> attribute for dimensions can now be specified at run-time.  Previously only the minimum and maximum values of the domain could be specified at run-time.  See <a class="reference internal" href="reference_elements.html#validation"><span>here</span></a> for details.</li>
 <li><em>noise_vectors</em> can now be used in non-uniform dimensions (e.g. dimensions using the Bessel transform for cylindrical symmetry).</li>
 <li>“loose” <em>geometry_matching_mode</em> for HDF5 vector initialisation.  This enables extending the simulation grid from one simulation to the next, or coarsening or refining a grid when importing.</li>
 <li><em>vectors</em> can now be initialised by integrating over dimensions of other vectors.  <em>computed_vectors</em> always supported this, now <em>vectors</em> do too.</li>
@@ -162,7 +178,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -170,6 +186,8 @@
   <h3><a href="index.html">Table Of Contents</a></h3>
   <ul>
 <li><a class="reference internal" href="#">News</a><ul>
+<li><a class="reference internal" href="#xmds-2-2-3-it-came-from-the-deep-january-20-2017">XMDS 2.2.3 “It came from the deep” (January 20, 2017)</a></li>
+<li><a class="reference internal" href="#xmds-2-2-2-xmds2-is-a-game-of-two-halves-october-13-2014">XMDS 2.2.2 “XMDS2 is a game of two halves” (October 13, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-2-1-xmds2-is-a-game-of-two-halves-september-30-2014">XMDS 2.2.1 “XMDS2 is a game of two halves” (September 30, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-2-0-out-of-cheese-error-january-13-2014">XMDS 2.2.0 “Out of cheese error” (January 13, 2014)</a></li>
 <li><a class="reference internal" href="#xmds-2-1-4-well-if-this-isn-t-nice-i-don-t-know-what-is-september-27-2013">XMDS 2.1.4 “Well if this isn’t nice, I don’t know what is” (September 27, 2013)</a></li>
@@ -181,7 +199,7 @@
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -198,19 +216,19 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/objects.inv b/documentation/objects.inv
index cf97f78..68c7278 100644
Binary files a/documentation/objects.inv and b/documentation/objects.inv differ
diff --git a/documentation/optimisation_hints.html b/documentation/optimisation_hints.html
index 577bc9a..a2850c1 100644
--- a/documentation/optimisation_hints.html
+++ b/documentation/optimisation_hints.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Optimisation Hints — XMDS2 2.2.2 documentation</title>
+    <title>Optimisation Hints — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="xsil2graphics2" href="xsil2graphics2.html" />
     <link rel="prev" title="Upgrading From XMDS 1.X" href="upgrade.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="upgrade.html" title="Upgrading From XMDS 1.X"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="optimisation-hints">
 <span id="optimisationhints"></span><h1>Optimisation Hints<a class="headerlink" href="#optimisation-hints" title="Permalink to this headline">¶</a></h1>
@@ -58,7 +58,7 @@
 <h2>Geometry and transform-based tricks<a class="headerlink" href="#geometry-and-transform-based-tricks" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="simpler-simulation-geometries">
 <h3>Simpler simulation geometries<a class="headerlink" href="#simpler-simulation-geometries" title="Permalink to this headline">¶</a></h3>
-<p>Consider symmetry, can you use <tt class="docutils literal"><span class="pre">dct</span></tt> transforms or <tt class="docutils literal"><span class="pre">bessel</span></tt> transforms? Do you really need that many points? How big does your grid need to be? Could absorbing boundary conditions help?</p>
+<p>Consider symmetry, can you use <code class="docutils literal"><span class="pre">dct</span></code> transforms or <code class="docutils literal"><span class="pre">bessel</span></code> transforms? Do you really need that many points? How big does your grid need to be? Could absorbing boundary conditions help?</p>
 </div>
 <div class="section" id="tricks-for-bessel-and-hermite-gauss-transforms">
 <h3>Tricks for Bessel and Hermite-Gauss transforms<a class="headerlink" href="#tricks-for-bessel-and-hermite-gauss-transforms" title="Permalink to this headline">¶</a></h3>
@@ -70,7 +70,7 @@
 <p>Avoid transcendental functions like <span class="math">\(\sin(x)\)</span> or <span class="math">\(\exp(x)\)</span> in inner loops. Not all operations are made equal, use multiplication over division.</p>
 <div class="section" id="optimising-with-the-interaction-picture-ip-operator">
 <span id="optimisingipoperators"></span><h3>Optimising with the Interaction Picture (IP) operator<a class="headerlink" href="#optimising-with-the-interaction-picture-ip-operator" title="Permalink to this headline">¶</a></h3>
-<p>You should use the IP operator when you can. Only use the EX operator when you have to. If you must use the EX operator, consider making it <tt class="docutils literal"><span class="pre">constant="no"</span></tt>. It uses less memory.
+<p>You should use the IP operator when you can. Only use the EX operator when you have to. If you must use the EX operator, consider making it <code class="docutils literal"><span class="pre">constant="no"</span></code>. It uses less memory.
 When you use the IP operator, make sure you know what it’s doing.  Do not pre- or post-multiply that term in your equations, XMDS will do a fairly thorough check to see you aren’t using the IP operator improperly, but it is possible to confuse XMDS’s check.</p>
 <p>If your simulation uses two or more dimensions, check to see if your IP operator is separable, i.e. can be written in the form <span class="math">\(f(kx) + g(ky)\)</span> (this is frequently possible in atom-optics simulations). If your IP operator is separable, create separate IP operators for each dimension.  This provides a significant speedup (~30%) for simulations using an adaptive integrator.  For example, instead of using the IP operator:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><operator</span> <span class="na">kind=</span><span class="s">"ip"</span><span class="nt">></span>
@@ -102,7 +102,7 @@ When you use the IP operator, make sure you know what it’s doing.  Do not
 <span class="cp">]]></span>
 </pre></div>
 </div>
-<p>When using the IP operator, check if your operator is purely real or purely imaginary.  If real, (e.g. <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-0.5*kx</span> <span class="pre">*</span> <span class="pre">kx;</span></tt>), then add the attribute <tt class="docutils literal"><span class="pre">type="real"</span></tt> to the <tt class="docutils literal"><span class="pre"><operator</span> <span class="pre">kind=" [...]
+<p>When using the IP operator, check if your operator is purely real or purely imaginary.  If real, (e.g. <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-0.5*kx</span> <span class="pre">*</span> <span class="pre">kx;</span></code>), then add the attribute <code class="docutils literal"><span class="pre">type="real"</span></code> to the <code class="docutils literal"><span class="pre"><operator</span> <span class="pre">k [...]
 </div>
 <div class="section" id="consider-writing-the-evolution-in-spectral-basis">
 <h3>Consider writing the evolution in spectral basis<a class="headerlink" href="#consider-writing-the-evolution-in-spectral-basis" title="Permalink to this headline">¶</a></h3>
@@ -132,8 +132,8 @@ When you use the IP operator, make sure you know what it’s doing.  Do not
 <span class="nt"></operators></span>
 </pre></div>
 </div>
-<p>Although the <tt class="docutils literal"><span class="pre">dpsi0_dt</span></tt> code reads the same in position and Fourier space, it is the <tt class="docutils literal"><span class="pre">basis=kx</span></tt> attribute on <tt class="docutils literal"><span class="pre"><integration_vectors></span></tt> that causes the evolution code to be executed in Fourier space.</p>
-<p>A final optimisation is to cause the integration code itself to operate in Fourier space.  By default, all time stepping (i.e. <span class="math">\(f(t + \Delta t) = f(t) + f'(t) \Delta t\)</span> for forward-Euler integration) occurs in the position space.  As the derivative terms can be computed in Fourier space, it is faster to also to the time stepping in Fourier space too.  This then means that no Fourier transforms will be needed at all during this integrate block (except as nee [...]
+<p>Although the <code class="docutils literal"><span class="pre">dpsi0_dt</span></code> code reads the same in position and Fourier space, it is the <code class="docutils literal"><span class="pre">basis=kx</span></code> attribute on <code class="docutils literal"><span class="pre"><integration_vectors></span></code> that causes the evolution code to be executed in Fourier space.</p>
+<p>A final optimisation is to cause the integration code itself to operate in Fourier space.  By default, all time stepping (i.e. <span class="math">\(f(t + \Delta t) = f(t) + f'(t) \Delta t\)</span> for forward-Euler integration) occurs in the position space.  As the derivative terms can be computed in Fourier space, it is faster to also to the time stepping in Fourier space too.  This then means that no Fourier transforms will be needed at all during this integrate block (except as nee [...]
 <p>The fully optimised code then reads:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"ARK45"</span> <span class="na">interval=</span><span class="s">"1"</span> <span class="na">tolerance=</span><span class="s">"1e-6"</span> <span class="na">home_space=</span><span class="s">"k"</span><span class="nt">></span>
   <span class="nt"><samples></span> 10 <span class="nt"></samples></span>
@@ -155,11 +155,11 @@ When you use the IP operator, make sure you know what it’s doing.  Do not
 <span class="nt"></integrate></span>
 </pre></div>
 </div>
-<p>This code will not use any Fourier transforms during an ordinary time-stepping, and will be much faster than if the code were written without the <tt class="docutils literal"><span class="pre">home_space</span></tt> and <tt class="docutils literal"><span class="pre">basis</span></tt> attributes.</p>
+<p>This code will not use any Fourier transforms during an ordinary time-stepping, and will be much faster than if the code were written without the <code class="docutils literal"><span class="pre">home_space</span></code> and <code class="docutils literal"><span class="pre">basis</span></code> attributes.</p>
 </div>
 <div class="section" id="don-t-recalculate-things-you-don-t-have-to">
 <h3>Don’t recalculate things you don’t have to<a class="headerlink" href="#don-t-recalculate-things-you-don-t-have-to" title="Permalink to this headline">¶</a></h3>
-<p>Use <tt class="docutils literal"><span class="pre">computed_vectors</span></tt> appropriately.</p>
+<p>Use <code class="docutils literal"><span class="pre">computed_vectors</span></code> appropriately.</p>
 </div>
 </div>
 <div class="section" id="compiler-and-library-tricks">
@@ -187,23 +187,24 @@ ls libatlas*.deb
 </pre></div>
 </div>
 <p>Then, for each of the .deb packages listed by the ls command, install via:</p>
-<div class="highlight-xpdeint"><pre>sudo dpkg -i <filename here>.deb</pre>
+<div class="highlight-xpdeint"><div class="highlight"><pre>sudo dpkg -i <filename here>.deb
+</pre></div>
 </div>
 <p>This procedure was tested on Ubuntu 12.04 LTS, but an identical or very similar procedure should work for other Ubuntu/Debian versions.</p>
 <p>Finally, note that the “sudo fakeroot debian/rules custom” package creation step carries out an exhaustive series of tests to optimize for your architecture, SSE support, cache hierarchy and so on, and can take a long time. Be patient.</p>
 </div>
 <div class="section" id="auto-vectorisation">
 <h3>Auto-vectorisation<a class="headerlink" href="#auto-vectorisation" title="Permalink to this headline">¶</a></h3>
-<p>Auto-vectorisation is a compiler feature that makes compilers generate more efficient code that can execute the same operation on multiple pieces of data simultaneously. To use this feature, you need to add the following to the <tt class="docutils literal"><span class="pre"><features></span></tt> block at the start of your simulation:</p>
+<p>Auto-vectorisation is a compiler feature that makes compilers generate more efficient code that can execute the same operation on multiple pieces of data simultaneously. To use this feature, you need to add the following to the <code class="docutils literal"><span class="pre"><features></span></code> block at the start of your simulation:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><auto_vectorise</span> <span class="nt">/></span>
 </pre></div>
 </div>
-<p>This will make xpdeint generate code that is more friendly to compiler’s auto-vectorisation features so that more code can be vectorised. It will also add the appropriate compiler options to turn on your compiler’s auto-vectorisation features. For auto-vectorisation to increase the speed of your simulations, you will need a compiler that supports it such as gcc 4.2 or later, or Intel’s C compiler, <tt class="docutils literal"><span class="pre">icc</span></tt>.</p>
+<p>This will make xpdeint generate code that is more friendly to compiler’s auto-vectorisation features so that more code can be vectorised. It will also add the appropriate compiler options to turn on your compiler’s auto-vectorisation features. For auto-vectorisation to increase the speed of your simulations, you will need a compiler that supports it such as gcc 4.2 or later, or Intel’s C compiler, <code class="docutils literal"><span class="pre">icc</span></code>.</p>
 </div>
 <div class="section" id="openmp">
 <h3>OpenMP<a class="headerlink" href="#openmp" title="Permalink to this headline">¶</a></h3>
-<p><a class="reference external" href="http://openmp.org">OpenMP</a> is a set of compiler directives to make it easier to use threads (different execution contexts) in programs. Using threads in your simulation does occur some overhead, so for the speedup to outweigh the overhead, you must have a reasonably large simulation grid. To add these compiler directives to the generated simulations, add the tag <tt class="docutils literal"><span class="pre"><openmp</span> <span class="pre">/& [...]
-<p>If you are using the OpenMP feature and are using <a class="reference external" href="http://www.fftw.org">FFTW</a>-based transforms (Discrete Fourier/Cosine/Sine Transforms), you should consider using threads with your FFT’s by adding the following to the <tt class="docutils literal"><span class="pre"><features></span></tt> block at the start of your simulation:</p>
+<p><a class="reference external" href="http://openmp.org">OpenMP</a> is a set of compiler directives to make it easier to use threads (different execution contexts) in programs. Using threads in your simulation does occur some overhead, so for the speedup to outweigh the overhead, you must have a reasonably large simulation grid. To add these compiler directives to the generated simulations, add the tag <code class="docutils literal"><span class="pre"><openmp</span> <span class="pre"> [...]
+<p>If you are using the OpenMP feature and are using <a class="reference external" href="http://www.fftw.org">FFTW</a>-based transforms (Discrete Fourier/Cosine/Sine Transforms), you should consider using threads with your FFT’s by adding the following to the <code class="docutils literal"><span class="pre"><features></span></code> block at the start of your simulation:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><fftw</span> <span class="na">threads=</span><span class="s">"2"</span> <span class="nt">/></span>
 </pre></div>
 </div>
@@ -218,16 +219,16 @@ ls libatlas*.deb
 <h2>Atom-optics-specific hints<a class="headerlink" href="#atom-optics-specific-hints" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="separate-out-imaginary-time-calculation-code">
 <h3>Separate out imaginary-time calculation code<a class="headerlink" href="#separate-out-imaginary-time-calculation-code" title="Permalink to this headline">¶</a></h3>
-<p>When doing simulations that require the calculation of the groundstate (typically via the imaginary time algorithm), typically the groundstate itself does not need to be changed frequently as it is usually the dynamics of the simulation that have the interesting physics. In this case, you can save having to re-calculate groundstate every time by having one script (call it <tt class="docutils literal"><span class="pre">groundstate.xmds</span></tt>) that saves the calculated groundstate [...]
-<p>The file format used in this example is <a class="reference external" href="http://www.hdfgroup.org/HDF5/">HDF5</a>, and you will need the HDF5 libraries installed to use this example. The alternative is to use the deprecated <tt class="docutils literal"><span class="pre">binary</span></tt> format, however to load <tt class="docutils literal"><span class="pre">binary</span></tt> format data <tt class="docutils literal"><span class="pre">xmds</span></tt>, the predecessor to <tt class=" [...]
-<p>If your wavefunction vector is called <tt class="docutils literal"><span class="pre">'wavefunction'</span></tt>, then to save the groundstate to the file <tt class="docutils literal"><span class="pre">groundstate_break.h5</span></tt> in the HDF5 format, put the following code immediately after the integrate block that calculates your groundstate:</p>
+<p>When doing simulations that require the calculation of the groundstate (typically via the imaginary time algorithm), typically the groundstate itself does not need to be changed frequently as it is usually the dynamics of the simulation that have the interesting physics. In this case, you can save having to re-calculate groundstate every time by having one script (call it <code class="docutils literal"><span class="pre">groundstate.xmds</span></code>) that saves the calculated grounds [...]
+<p>The file format used in this example is <a class="reference external" href="http://www.hdfgroup.org/HDF5/">HDF5</a>, and you will need the HDF5 libraries installed to use this example. The alternative is to use the deprecated <code class="docutils literal"><span class="pre">binary</span></code> format, however to load <code class="docutils literal"><span class="pre">binary</span></code> format data <code class="docutils literal"><span class="pre">xmds</span></code>, the predecessor to [...]
+<p>If your wavefunction vector is called <code class="docutils literal"><span class="pre">'wavefunction'</span></code>, then to save the groundstate to the file <code class="docutils literal"><span class="pre">groundstate_break.h5</span></code> in the HDF5 format, put the following code immediately after the integrate block that calculates your groundstate:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><breakpoint</span> <span class="na">filename=</span><span class="s">"groundstate_break"</span> <span class="na">format=</span><span class="s">"hdf5"</span><span class="nt">></span>
   <span class="nt"><dependencies></span>wavefunction<span class="nt"></dependencies></span>
 <span class="nt"></breakpoint></span>
 </pre></div>
 </div>
-<p>In addition to the <tt class="docutils literal"><span class="pre">groundstate_break.h5</span></tt> file, an XSIL wrapper <tt class="docutils literal"><span class="pre">groundstate_break.xsil</span></tt> will also be created for use with <a class="reference internal" href="xsil2graphics2.html#xsil2graphics2"><em>xsil2graphics2</em></a>.</p>
-<p>To load this groundstate into your evolution script, the declaration of your <tt class="docutils literal"><span class="pre">'wavefunction'</span></tt> vector in your evolution script should look something like</p>
+<p>In addition to the <code class="docutils literal"><span class="pre">groundstate_break.h5</span></code> file, an XSIL wrapper <code class="docutils literal"><span class="pre">groundstate_break.xsil</span></code> will also be created for use with <a class="reference internal" href="xsil2graphics2.html#xsil2graphics2"><span>xsil2graphics2</span></a>.</p>
+<p>To load this groundstate into your evolution script, the declaration of your <code class="docutils literal"><span class="pre">'wavefunction'</span></code> vector in your evolution script should look something like</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><vector</span> <span class="na">name=</span><span class="s">"wavefunction"</span><span class="nt">></span>
   <span class="nt"><components></span>phi1 phi2<span class="nt"></components></span>
   <span class="nt"><initialisation</span> <span class="na">kind=</span><span class="s">"hdf5"</span><span class="nt">></span>
@@ -236,7 +237,7 @@ ls libatlas*.deb
 <span class="nt"></vector></span>
 </pre></div>
 </div>
-<p>Note that the groundstate-finder doesn’t need to have all of the components that the evolution script needs. For example, if you are considering the evolution of a two-component BEC where only one component has a population in the groundstate, then your groundstate script can contain only the <tt class="docutils literal"><span class="pre">phi1</span></tt> component, while your evolution script can contain both the <tt class="docutils literal"><span class="pre">phi1</span></tt> c [...]
+<p>Note that the groundstate-finder doesn’t need to have all of the components that the evolution script needs. For example, if you are considering the evolution of a two-component BEC where only one component has a population in the groundstate, then your groundstate script can contain only the <code class="docutils literal"><span class="pre">phi1</span></code> component, while your evolution script can contain both the <code class="docutils literal"><span class="pre">phi1</span>< [...]
 </div>
 <div class="section" id="use-an-energy-or-momentum-offset">
 <h3>Use an energy or momentum offset<a class="headerlink" href="#use-an-energy-or-momentum-offset" title="Permalink to this headline">¶</a></h3>
@@ -249,7 +250,7 @@ ls libatlas*.deb
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -285,7 +286,7 @@ ls libatlas*.deb
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -302,7 +303,7 @@ ls libatlas*.deb
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -314,13 +315,13 @@ ls libatlas*.deb
         <li class="right" >
           <a href="upgrade.html" title="Upgrading From XMDS 1.X"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/reference_elements.html b/documentation/reference_elements.html
index 0156db0..5431e9d 100644
--- a/documentation/reference_elements.html
+++ b/documentation/reference_elements.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>XMDS2 script elements — XMDS2 2.2.2 documentation</title>
+    <title>XMDS2 script elements — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,13 +25,13 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="up" title="Reference section" href="reference_index.html" />
     <link rel="next" title="Modified Midpoint Method" href="bulirschStoer.html" />
     <link rel="prev" title="XMDS2 XML Schema" href="reference_schema.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -43,22 +43,22 @@
         <li class="right" >
           <a href="reference_schema.html" title="XMDS2 XML Schema"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="xmds2-script-elements">
 <span id="referenceelements"></span><span id="index-0"></span><h1>XMDS2 script elements<a class="headerlink" href="#xmds2-script-elements" title="Permalink to this headline">¶</a></h1>
 <p>This section outlines all the elements and options available in an XMDS2 script.  This is very much a <strong>work in progress</strong>, beginning with placeholders in most cases, as we have prioritised the tutorials for new users.  One of the most productive ways that non-developer veterans can contribute to the project is to help develop this documentation.</p>
 <div class="section" id="simulation-element">
 <span id="simulationelement"></span><span id="index-1"></span><h2>Simulation element<a class="headerlink" href="#simulation-element" title="Permalink to this headline">¶</a></h2>
-<p>The <tt class="docutils literal"><span class="pre"><simulation></span></tt> element is the single top level element in an XMDS2 simulation, and contains all the other elements.  All XMDS scripts must contain exactly one simulation element, and it must have the <tt class="docutils literal"><span class="pre">xmds-version="2"</span></tt> attribute defined.</p>
+<p>The <code class="docutils literal"><span class="pre"><simulation></span></code> element is the single top level element in an XMDS2 simulation, and contains all the other elements.  All XMDS scripts must contain exactly one simulation element, and it must have the <code class="docutils literal"><span class="pre">xmds-version="2"</span></code> attribute defined.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="c"><!-- Rest of simulation goes here --></span>
@@ -68,7 +68,7 @@
 </div>
 <div class="section" id="name-element">
 <span id="nameelement"></span><span id="index-2"></span><h2>Name element<a class="headerlink" href="#name-element" title="Permalink to this headline">¶</a></h2>
-<p>The name of your simulation. This element is optional, but recommended. If it is set, it will be the name of the executable file generated from this script. It will also be the name of the output file (with an appropriate extension) if the <tt class="docutils literal"><span class="pre">filename</span></tt> attribute is not given a value in the <tt class="docutils literal"><span class="pre"><output></span></tt> element.</p>
+<p>The name of your simulation. This element is optional, but recommended. If it is set, it will be the name of the executable file generated from this script. It will also be the name of the output file (with an appropriate extension) if the <code class="docutils literal"><span class="pre">filename</span></code> attribute is not given a value in the <code class="docutils literal"><span class="pre"><output></span></code> element.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><name></span> funky_solver <span class="nt"></name></span>
 </pre></div>
@@ -97,23 +97,23 @@
 </div>
 <div class="section" id="features-elements">
 <span id="featureselement"></span><span id="index-5"></span><h2>Features Elements<a class="headerlink" href="#features-elements" title="Permalink to this headline">¶</a></h2>
-<p>Features elements are where simulation-wide options are specified. The <tt class="docutils literal"><span class="pre"><features></span></tt> element wraps one or more elements describing features. There are many possible feature elements. Currently, a full list of the features supported is:</p>
+<p>Features elements are where simulation-wide options are specified. The <code class="docutils literal"><span class="pre"><features></span></code> element wraps one or more elements describing features. There are many possible feature elements. Currently, a full list of the features supported is:</p>
 <blockquote>
 <div><ul class="simple">
-<li><a class="reference internal" href="#argumentselement"><em>arguments</em></a></li>
-<li><a class="reference internal" href="#autovectorise"><em>auto_vectorise</em></a></li>
-<li><a class="reference internal" href="#benchmark"><em>benchmark</em></a></li>
-<li><a class="reference internal" href="#bing"><em>bing</em></a></li>
-<li><a class="reference internal" href="#cflags"><em>cflags</em></a></li>
-<li><a class="reference internal" href="#chunkedoutput"><em>chunked_output</em></a></li>
-<li><a class="reference internal" href="#diagnostics"><em>diagnostics</em></a></li>
-<li><a class="reference internal" href="#errorcheck"><em>error_check</em></a></li>
-<li><a class="reference internal" href="#haltnonfinite"><em>halt_non_finite</em></a></li>
-<li><a class="reference internal" href="#fftw"><em>fftw</em></a></li>
-<li><a class="reference internal" href="#globals"><em>globals</em></a></li>
-<li><a class="reference internal" href="#openmp"><em>OpenMP</em></a></li>
-<li><a class="reference internal" href="#precision"><em>precision</em></a></li>
-<li><a class="reference internal" href="#validation"><em>validation</em></a></li>
+<li><a class="reference internal" href="#argumentselement"><span>arguments</span></a></li>
+<li><a class="reference internal" href="#autovectorise"><span>auto_vectorise</span></a></li>
+<li><a class="reference internal" href="#benchmark"><span>benchmark</span></a></li>
+<li><a class="reference internal" href="#bing"><span>bing</span></a></li>
+<li><a class="reference internal" href="#cflags"><span>cflags</span></a></li>
+<li><a class="reference internal" href="#chunkedoutput"><span>chunked_output</span></a></li>
+<li><a class="reference internal" href="#diagnostics"><span>diagnostics</span></a></li>
+<li><a class="reference internal" href="#errorcheck"><span>error_check</span></a></li>
+<li><a class="reference internal" href="#haltnonfinite"><span>halt_non_finite</span></a></li>
+<li><a class="reference internal" href="#fftw"><span>fftw</span></a></li>
+<li><a class="reference internal" href="#globals"><span>globals</span></a></li>
+<li><a class="reference internal" href="#openmp"><span>OpenMP</span></a></li>
+<li><a class="reference internal" href="#precision"><span>precision</span></a></li>
+<li><a class="reference internal" href="#validation"><span>validation</span></a></li>
 </ul>
 </div></blockquote>
 <p>Example syntax:</p>
@@ -128,7 +128,7 @@
 </div>
 <div class="section" id="arguments-element">
 <span id="argumentselement"></span><span id="index-6"></span><h3>Arguments Element<a class="headerlink" href="#arguments-element" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><arguments></span></tt> element is optional, and allows defining variables that can be passed to the simulation at run time. These variables are then globally accessible throughout the simulation script. Each of the variables must be defined in an <tt class="docutils literal"><span class="pre"><argument></span></tt> element (see below). The variables can then be passed to the simulation executable as options on the command [...]
+<p>The <code class="docutils literal"><span class="pre"><arguments></span></code> element is optional, and allows defining variables that can be passed to the simulation at run time. These variables are then globally accessible throughout the simulation script. Each of the variables must be defined in an <code class="docutils literal"><span class="pre"><argument></span></code> element (see below). The variables can then be passed to the simulation executable as options on the [...]
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><name></span> arguments_test <span class="nt"></name></span>
 <span class="nt"><features></span>
   <span class="nt"><arguments></span>
@@ -139,11 +139,11 @@
 <span class="nt"></features></span>
 </pre></div>
 </div>
-<p>When <tt class="docutils literal"><span class="pre">XMDS2</span></tt> is run on this script the executable <tt class="docutils literal"><span class="pre">arguments_test</span></tt> is created. The values of <tt class="docutils literal"><span class="pre">size</span></tt>, <tt class="docutils literal"><span class="pre">number</span></tt>, and <tt class="docutils literal"><span class="pre">pulse_shape</span></tt> can then be set to whatever is desired at runtime via</p>
+<p>When <code class="docutils literal"><span class="pre">XMDS2</span></code> is run on this script the executable <code class="docutils literal"><span class="pre">arguments_test</span></code> is created. The values of <code class="docutils literal"><span class="pre">size</span></code>, <code class="docutils literal"><span class="pre">number</span></code>, and <code class="docutils literal"><span class="pre">pulse_shape</span></code> can then be set to whatever is desired at runtime via</p>
 <div class="highlight-xmds2"><div class="highlight"><pre>./arguments_test --size=1.3 --number=2 --pulse_shape=lorentzian
 </pre></div>
 </div>
-<p>It is also possible to include an optional <tt class="docutils literal"><span class="pre">CDATA</span></tt> block inside the <tt class="docutils literal"><span class="pre"><arguments></span></tt> block. This code will run after the arguments have been initialised with the values passed from the command line. This code block could be used, for example, to sanity check the parameters passed in, or for assigning values to global variables based on those parameters.  Any references  [...]
+<p>It is also possible to include an optional <code class="docutils literal"><span class="pre">CDATA</span></code> block inside the <code class="docutils literal"><span class="pre"><arguments></span></code> block. This code will run after the arguments have been initialised with the values passed from the command line. This code block could be used, for example, to sanity check the parameters passed in, or for assigning values to global variables based on those parameters.  Any ref [...]
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><features></span>
   <span class="nt"><globals></span>
     <span class="cp"><![CDATA[</span>
@@ -159,7 +159,7 @@
 <span class="nt"></features></span>
 </pre></div>
 </div>
-<p>The arguments and their values can be added to the filename of the output files by using the <tt class="docutils literal"><span class="pre">append_args_to_output_filename</span></tt> attribute.  For example:</p>
+<p>The arguments and their values can be added to the filename of the output files by using the <code class="docutils literal"><span class="pre">append_args_to_output_filename</span></code> attribute.  For example:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><name></span> arguments_test <span class="nt"></name></span>
 <span class="nt"><features></span>
   <span class="nt"><arguments</span> <span class="na">append_args_to_output_filename=</span><span class="s">"yes"</span><span class="nt">></span>
@@ -170,27 +170,27 @@
 <span class="nt"></features></span>
 </pre></div>
 </div>
-<p>When the <tt class="docutils literal"><span class="pre">arguments_test</span></tt> executable is run, it will create output files named <tt class="docutils literal"><span class="pre">arguments_test.number_7.pulse_shape_gaussian.size_20.0.xsil</span></tt> and <tt class="docutils literal"><span class="pre">arguments_test.number_7.pulse_shape_gaussian.size_20.0.h5</span></tt>.</p>
+<p>When the <code class="docutils literal"><span class="pre">arguments_test</span></code> executable is run, it will create output files named <code class="docutils literal"><span class="pre">arguments_test.number_7.pulse_shape_gaussian.size_20.0.xsil</span></code> and <code class="docutils literal"><span class="pre">arguments_test.number_7.pulse_shape_gaussian.size_20.0.h5</span></code>.</p>
 <div class="section" id="argument-element">
 <span id="argumentelement"></span><span id="index-7"></span><h4>Argument element<a class="headerlink" href="#argument-element" title="Permalink to this headline">¶</a></h4>
-<p id="index-8">Each <tt class="docutils literal"><span class="pre"><argument></span></tt> element describes one variable that can be passed to the simulation at runtime via the command line. There are three mandatory attributes: <tt class="docutils literal"><span class="pre">name</span></tt>, <tt class="docutils literal"><span class="pre">type</span></tt>, and <tt class="docutils literal"><span class="pre">default_value</span></tt>. <tt class="docutils literal"><span class="pre">n [...]
+<p id="index-8">Each <code class="docutils literal"><span class="pre"><argument></span></code> element describes one variable that can be passed to the simulation at runtime via the command line. There are three mandatory attributes: <code class="docutils literal"><span class="pre">name</span></code>, <code class="docutils literal"><span class="pre">type</span></code>, and <code class="docutils literal"><span class="pre">default_value</span></code>. <code class="docutils literal">< [...]
 </div>
 </div>
 <div class="section" id="auto-vectorise-element">
 <span id="autovectorise"></span><span id="index-9"></span><h3>Auto_vectorise element<a class="headerlink" href="#auto-vectorise-element" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><auto_vectorise</span> <span class="pre">/></span></tt> feature attempts to activate automatic vectorisation for large loops, if it is available in the compiler.  This should make some simulations go faster.</p>
+<p>The <code class="docutils literal"><span class="pre"><auto_vectorise</span> <span class="pre">/></span></code> feature attempts to activate automatic vectorisation for large loops, if it is available in the compiler.  This should make some simulations go faster.</p>
 </div>
 <div class="section" id="benchmark">
 <span id="index-10"></span><span id="id1"></span><h3>Benchmark<a class="headerlink" href="#benchmark" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><benchmark</span> <span class="pre">/></span></tt> feature includes a timing routine in the generated code, so that it is possible to see how long the simulations take to run.</p>
+<p>The <code class="docutils literal"><span class="pre"><benchmark</span> <span class="pre">/></span></code> feature includes a timing routine in the generated code, so that it is possible to see how long the simulations take to run.</p>
 </div>
 <div class="section" id="bing">
 <span id="index-11"></span><span id="id2"></span><h3>Bing<a class="headerlink" href="#bing" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><bing</span> <span class="pre">/></span></tt> feature causes the simulation to make an invigorating sound when the simulation finishes executing.</p>
+<p>The <code class="docutils literal"><span class="pre"><bing</span> <span class="pre">/></span></code> feature causes the simulation to make an invigorating sound when the simulation finishes executing.</p>
 </div>
 <div class="section" id="c-flags">
 <span id="cflags"></span><span id="index-12"></span><h3>C Flags<a class="headerlink" href="#c-flags" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><cflags></span></tt> feature allows extra flags to be passed to the compiler.  This can be useful for optimisation, and also using specific external libraries.  The extra options to be passed are defined with a ‘CDATA’ block.  The compile options can be made visible by running XMDS2 either with the “-v” (verbose) option, or the “-g” (debug) option.</p>
+<p>The <code class="docutils literal"><span class="pre"><cflags></span></code> feature allows extra flags to be passed to the compiler.  This can be useful for optimisation, and also using specific external libraries.  The extra options to be passed are defined with a ‘CDATA’ block.  The compile options can be made visible by running XMDS2 either with the “-v” (verbose) option, or the “-g” (debug) option.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><cflags></span>
     <span class="cp"><![CDATA[</span>
@@ -202,12 +202,12 @@
 </div>
 <div class="section" id="chunked-output">
 <span id="chunkedoutput"></span><span id="index-13"></span><h3>Chunked Output<a class="headerlink" href="#chunked-output" title="Permalink to this headline">¶</a></h3>
-<p>By default, XMDS2 keeps the contents of all output moment groups in memory until the end of the simulation when they are written to the output file.  This can be a problem if your simulation creates a very large amount of output.  <tt class="docutils literal"><span class="pre"><chunked_output</span> <span class="pre">/></span></tt> causes the simulation to save the output data in chunks as the simulation progresses.  For some simulations this can significantly reduce the amount  [...]
+<p>By default, XMDS2 keeps the contents of all output moment groups in memory until the end of the simulation when they are written to the output file.  This can be a problem if your simulation creates a very large amount of output.  <code class="docutils literal"><span class="pre"><chunked_output</span> <span class="pre">/></span></code> causes the simulation to save the output data in chunks as the simulation progresses.  For some simulations this can significantly reduce the amo [...]
 <p>Limitations (XMDS will give you an error if you violate any of these):</p>
 <ul class="simple">
 <li>This feature cannot be used with the ASCII output file format due to limitations in the file format.</li>
-<li>This feature cannot be used with the <tt class="docutils literal"><span class="pre">multi-path</span></tt> drivers because all sampling data is required to compute the mean and standard error statistics.</li>
-<li>Neither is this feature compatible with the <tt class="docutils literal"><span class="pre">error_check</span></tt> feature as that relies on all sampling data being available to compute the error.</li>
+<li>This feature cannot be used with the <code class="docutils literal"><span class="pre">multi-path</span></code> drivers because all sampling data is required to compute the mean and standard error statistics.</li>
+<li>Neither is this feature compatible with the <code class="docutils literal"><span class="pre">error_check</span></code> feature as that relies on all sampling data being available to compute the error.</li>
 </ul>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
@@ -220,7 +220,7 @@
 </div>
 <div class="section" id="diagnostics">
 <span id="index-14"></span><span id="id3"></span><h3>Diagnostics<a class="headerlink" href="#diagnostics" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><diagnostics</span> <span class="pre">/></span></tt> feature causes a simulation to output more information as it executes.  This should be useful when a simulation is dying / giving bad results to help diagnose the cause.  Currently, it largely outputs step error information.</p>
+<p>The <code class="docutils literal"><span class="pre"><diagnostics</span> <span class="pre">/></span></code> feature causes a simulation to output more information as it executes.  This should be useful when a simulation is dying / giving bad results to help diagnose the cause.  Currently, it largely outputs step error information.</p>
 </div>
 <div class="section" id="error-check">
 <span id="errorcheck"></span><span id="index-15"></span><h3>Error Check<a class="headerlink" href="#error-check" title="Permalink to this headline">¶</a></h3>
@@ -236,11 +236,11 @@
 </div>
 <div class="section" id="halt-non-finite">
 <span id="haltnonfinite"></span><span id="index-16"></span><h3>Halt_Non_Finite<a class="headerlink" href="#halt-non-finite" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><halt_non_finite</span> <span class="pre">/></span></tt> feature is used to stop computations from continuing to run after the vectors stop having numerical values.  This can occur when a number is too large to represent numerically, or when an illegal operation occurs.  Processing variables with non-numerical values is usually much slower than normal processing, and the results are meaningless.  Of course, there is a small cost [...]
+<p>The <code class="docutils literal"><span class="pre"><halt_non_finite</span> <span class="pre">/></span></code> feature is used to stop computations from continuing to run after the vectors stop having numerical values.  This can occur when a number is too large to represent numerically, or when an illegal operation occurs.  Processing variables with non-numerical values is usually much slower than normal processing, and the results are meaningless.  Of course, there is a small  [...]
 </div>
 <div class="section" id="fftw-element">
 <span id="fftw"></span><span id="index-17"></span><h3>fftw element<a class="headerlink" href="#fftw-element" title="Permalink to this headline">¶</a></h3>
-<p id="index-18">The <tt class="docutils literal"><span class="pre"><fftw</span> <span class="pre">\></span></tt> feature can be used to pass options to the <a class="reference external" href="http://fftw.org">Fast Fourier Transform library</a> used by XMDS.  This library tests algorithms on each architecture to determine the fastest method of solving each problem.  Typically this costs very little overhead, as the results of all previous tests are stored in the directory “~/ [...]
+<p id="index-18">The <code class="docutils literal"><span class="pre"><fftw</span> <span class="pre">\></span></code> feature can be used to pass options to the <a class="reference external" href="http://fftw.org">Fast Fourier Transform library</a> used by XMDS.  This library tests algorithms on each architecture to determine the fastest method of solving each problem.  Typically this costs very little overhead, as the results of all previous tests are stored in the directory &#822 [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><fftw</span> <span class="na">plan=</span><span class="s">"patient"</span> <span class="na">threads=</span><span class="s">"3"</span> <span class="nt">/></span>
 </pre></div>
@@ -264,18 +264,18 @@
 </div>
 <div class="section" id="openmp">
 <span id="index-20"></span><span id="id5"></span><h3>OpenMP<a class="headerlink" href="#openmp" title="Permalink to this headline">¶</a></h3>
-<p>The <tt class="docutils literal"><span class="pre"><openmp</span> <span class="pre">/></span></tt> feature instructs compatible compilers to parallelise key loops using the <a class="reference external" href="http://www.openmp.org">OpenMP API</a> standard.  By default the simulation will use all available CPUs.  The number of threads used can be restricted by specifying the number of threads in the script with <tt class="docutils literal"><span class="pre"><openmp</span> <spa [...]
+<p>The <code class="docutils literal"><span class="pre"><openmp</span> <span class="pre">/></span></code> feature instructs compatible compilers to parallelise key loops using the <a class="reference external" href="http://www.openmp.org">OpenMP API</a> standard.  By default the simulation will use all available CPUs.  The number of threads used can be restricted by specifying the number of threads in the script with <code class="docutils literal"><span class="pre"><openmp</span [...]
 <div class="highlight-xmds2"><div class="highlight"><pre>OMP_NUM_THREADS=2 ./simulation_name
 </pre></div>
 </div>
 </div>
 <div class="section" id="precision">
 <span id="index-21"></span><span id="id6"></span><h3>Precision<a class="headerlink" href="#precision" title="Permalink to this headline">¶</a></h3>
-<p>This specifies the precision of the XMDS2 <tt class="docutils literal"><span class="pre">real</span></tt> and <tt class="docutils literal"><span class="pre">complex</span></tt> datatypes, as well as the precision used when computing transforms. Currently two values are accepted: <tt class="docutils literal"><span class="pre">single</span></tt> and <tt class="docutils literal"><span class="pre">double</span></tt>. If this feature isn’t specified, XMDS2 defaults to using double pr [...]
+<p>This specifies the precision of the XMDS2 <code class="docutils literal"><span class="pre">real</span></code> and <code class="docutils literal"><span class="pre">complex</span></code> datatypes, as well as the precision used when computing transforms. Currently two values are accepted: <code class="docutils literal"><span class="pre">single</span></code> and <code class="docutils literal"><span class="pre">double</span></code>. If this feature isn’t specified, XMDS2 defaults to [...]
 <p>Single precision has approximately 7.2 decimal digits of accuracy, with a minimum value of 1.4×10<sup>-45</sup> and a maximum of 3.8×10<sup>34</sup>. Double precision has approximately 16 decimal digits of accuracy, a minimum value of 4.9×10<sup>-324</sup> and a maximum value of 1.8×10<sup>308</sup>.</p>
 <p>Using single precision can be attractive, as it can be more than twice as fast, depending on whether a simulation is CPU bound, memory bandwidth bound, MPI bound or bottlenecked elsewhere, although in some situations you may see no speed-up at all. Caution should be exercised, however. Keep in mind how many timesteps your simulation requires, and take note of the tolerance you have set per step, to see if the result will lie within your acceptable total error - seven digit precision i [...]
 <p>Also note that when using an adaptive step integrator, setting a tolerance close to limits of the precision can lead to very slow performance.</p>
-<p>A further limitation is that not all the combinations of random number generators and probability distributions that are supported in double precision are supported in single precision. For example, the <tt class="docutils literal"><span class="pre">solirte</span></tt> generator does not support single precision gaussian distributions. <tt class="docutils literal"><span class="pre">dsfmt</span></tt>, however, is one of the fastest generators, and does support single precision.</p>
+<p>A further limitation is that not all the combinations of random number generators and probability distributions that are supported in double precision are supported in single precision. For example, the <code class="docutils literal"><span class="pre">solirte</span></code> generator does not support single precision gaussian distributions. <code class="docutils literal"><span class="pre">dsfmt</span></code>, however, is one of the fastest generators, and does support single precision.</p>
 <p>WARNING: Single precision mode has not been tested anywhere near as thoroughly as the default double precision mode, and there is a higher chance you will run into bugs.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
@@ -288,7 +288,7 @@
 </div>
 <div class="section" id="validation">
 <span id="index-22"></span><span id="id7"></span><h3>Validation<a class="headerlink" href="#validation" title="Permalink to this headline">¶</a></h3>
-<p>XMDS2 makes a large number of checks in the code generation process to verify that the values for all parameters are safe choices.  Sometimes we wish to allow these parameters to be specified by variables.  This opens up many possibilities, but requires that any safety checks for parameters be performed during the execution of the program itself.  The <tt class="docutils literal"><span class="pre"><validation></span></tt> feature activates that option, with allowable attributes  [...]
+<p>XMDS2 makes a large number of checks in the code generation process to verify that the values for all parameters are safe choices.  Sometimes we wish to allow these parameters to be specified by variables.  This opens up many possibilities, but requires that any safety checks for parameters be performed during the execution of the program itself.  The <code class="docutils literal"><span class="pre"><validation></span></code> feature activates that option, with allowable attribu [...]
 <p>As an example, one may wish to define the number of grid points and the range of the grid at run-time rather than explicitly define them in the XMDS2 script. To accomplish this, one could do the following:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre> <span class="nt"><name></span> validation_test <span class="nt"></name></span>
  <span class="nt"><features></span>
@@ -318,12 +318,12 @@
 </div>
 <div class="section" id="driver-element">
 <span id="driverelement"></span><h2>Driver Element<a class="headerlink" href="#driver-element" title="Permalink to this headline">¶</a></h2>
-<p>The driver element controls the overall management of the simulation, including how many paths of a stochastic simulation are to be averaged, and whether or not it is to be run using distributed memory parallelisation.  If it is not included, then the simulation is performed once without using MPI parallelisation.  If it is included, it must have a <tt class="docutils literal"><span class="pre">name</span></tt> attribute.</p>
-<p>The <tt class="docutils literal"><span class="pre">name</span></tt> attribute can have values of “none” (which is equivalent to the default option of not specifying a driver), “distributed-mpi”, “multi-path”, “mpi-multi-path” or “adaptive-mpi-multi-path”.</p>
-<p>Choosing the <tt class="docutils literal"><span class="pre">name="distributed-mpi"</span></tt> option allows a single integration over multiple processors.  The resulting executable can then be run according to your particular implementation of MPI.  The FFTW library only allows MPI processing of multidimensional vectors, as otherwise shared memory parallel processing requires too much inter-process communication to be efficient.  Maximally efficient parallelisation occurs w [...]
-<p>The <tt class="docutils literal"><span class="pre">name="multi-path"</span></tt> option is used for stochastic simulations, which are typically run multiple times and averaged.  It requires a <tt class="docutils literal"><span class="pre">paths</span></tt> attribute with the number of iterations of the integration to be averaged.  The output will report the averages of the desired samples, and the standard error in those averages.
-The <tt class="docutils literal"><span class="pre">name="mpi-multi-path"</span></tt> option integrates separate paths on different processors, which is typically a highly efficient process.
-The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi-path"</span></tt> option integrates separate paths on different processors with load balancing.</p>
+<p>The driver element controls the overall management of the simulation, including how many paths of a stochastic simulation are to be averaged, and whether or not it is to be run using distributed memory parallelisation.  If it is not included, then the simulation is performed once without using MPI parallelisation.  If it is included, it must have a <code class="docutils literal"><span class="pre">name</span></code> attribute.</p>
+<p>The <code class="docutils literal"><span class="pre">name</span></code> attribute can have values of “none” (which is equivalent to the default option of not specifying a driver), “distributed-mpi”, “multi-path”, “mpi-multi-path” or “adaptive-mpi-multi-path”.</p>
+<p>Choosing the <code class="docutils literal"><span class="pre">name="distributed-mpi"</span></code> option allows a single integration over multiple processors.  The resulting executable can then be run according to your particular implementation of MPI.  The FFTW library only allows MPI processing of multidimensional vectors, as otherwise shared memory parallel processing requires too much inter-process communication to be efficient.  Maximally efficient parallelisation occu [...]
+<p>The <code class="docutils literal"><span class="pre">name="multi-path"</span></code> option is used for stochastic simulations, which are typically run multiple times and averaged.  It requires a <code class="docutils literal"><span class="pre">paths</span></code> attribute with the number of iterations of the integration to be averaged.  The output will report the averages of the desired samples, and the standard error in those averages.
+The <code class="docutils literal"><span class="pre">name="mpi-multi-path"</span></code> option integrates separate paths on different processors, which is typically a highly efficient process.
+The <code class="docutils literal"><span class="pre">name="adaptive-mpi-multi-path"</span></code> option integrates separate paths on different processors with load balancing.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><driver</span> <span class="na">name=</span><span class="s">"distributed-mpi"</span> <span class="nt">/></span>
@@ -339,14 +339,14 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="geometry-element">
 <span id="geometryelement"></span><span id="index-24"></span><h2>Geometry Element<a class="headerlink" href="#geometry-element" title="Permalink to this headline">¶</a></h2>
-<p id="propagationdimensionelement"><span id="index-25"></span>The <tt class="docutils literal"><span class="pre"><geometry></span></tt> element describes the dimensions used in your simulation, and is required.  The only required element inside is the <tt class="docutils literal"><span class="pre"><propagation_dimension></span></tt> element, which defines the name of the dimension along which your simulation will integrate.  Nothing else about this dimension is specified, as [...]
-<span class="target" id="transversedimensionselement"><span id="index-26"></span></span><p id="dimensionelement"><span id="index-27"></span>If there are other dimensions in your problem, they are called “transverse dimensions”, and are described in the <tt class="docutils literal"><span class="pre"><transverse_dimensions></span></tt> element.  Each dimension is then described in its own <tt class="docutils literal"><span class="pre"><dimension></span></tt> element [...]
-<p id="index-28">Each transverse dimension must specify how many points or modes it requires, and the range over which it is defined.  This is done by the <tt class="docutils literal"><span class="pre">lattice</span></tt> and <tt class="docutils literal"><span class="pre">domain</span></tt> attributes respectively.  The <tt class="docutils literal"><span class="pre">lattice</span></tt> attribute is an integer, and is optional for integer dimensions, where it can be defined implicitly by  [...]
-<p id="index-29">Any dimension can have a number of aliases.  These act exactly like copies of that dimension, but must be included explicitly in the definition of subsequent vectors (i.e. they are not included in the default list of dimensions for a new vector).  The list of aliases for a dimension are included in an <tt class="docutils literal"><span class="pre">aliases</span></tt> attribute.  They are useful for non-local reference of variables.  See <tt class="docutils literal"><span [...]
-<p id="index-30">Integrals over a dimension can be multiplied by a common prefactor, which is specified using the <tt class="docutils literal"><span class="pre">volume_prefactor</span></tt> attribute.  For example, this allows the automatic inclusion of a factor of two due to a reflection symmetry by adding the attribute <tt class="docutils literal"><span class="pre">volume_prefactor="2"</span></tt>.  In very specific cases, you may wish to refer to volume elements explicitly.  [...]
-<p>If you are using the <tt class="docutils literal"><span class="pre">distributed-mpi</span></tt> driver to parallelise the simulation, place the dimension you wish to split over multiple processors first.  The most efficient parallelisation would involve distributing a dimension with only local evolution, as the different memory blocks would not need to communicate.  Nonlocal evolution that is local in Fourier space is the second preference, as the Fourier transform can also be success [...]
-<p id="transforms"><span id="index-31"></span>Each transverse dimension can be associated with a transform.  This allows the simulation to manipulate vectors defined on that dimension in the transform space.  The default is Fourier space (with the associated transform being the discrete Fourier transform, or “dft”), but others can be specified with the <tt class="docutils literal"><span class="pre">transform</span></tt> attribute.  The other options are “none”, &# [...]
-<p id="index-32">An advanced feature discussed further in <a class="reference internal" href="advanced_topics.html#dimensionaliases"><em>Dimension aliases</em></a> are dimension aliases, which are specified by the <tt class="docutils literal"><span class="pre">aliases</span></tt> attribute.  This feature is useful for example, when calculating correlation functions.</p>
+<p id="propagationdimensionelement"><span id="index-25"></span>The <code class="docutils literal"><span class="pre"><geometry></span></code> element describes the dimensions used in your simulation, and is required.  The only required element inside is the <code class="docutils literal"><span class="pre"><propagation_dimension></span></code> element, which defines the name of the dimension along which your simulation will integrate.  Nothing else about this dimension is speci [...]
+<span class="target" id="transversedimensionselement"><span id="index-26"></span></span><p id="dimensionelement"><span id="index-27"></span>If there are other dimensions in your problem, they are called “transverse dimensions”, and are described in the <code class="docutils literal"><span class="pre"><transverse_dimensions></span></code> element.  Each dimension is then described in its own <code class="docutils literal"><span class="pre"><dimension></span></code> [...]
+<p id="index-28">Each transverse dimension must specify how many points or modes it requires, and the range over which it is defined.  This is done by the <code class="docutils literal"><span class="pre">lattice</span></code> and <code class="docutils literal"><span class="pre">domain</span></code> attributes respectively.  The <code class="docutils literal"><span class="pre">lattice</span></code> attribute is an integer, and is optional for integer dimensions, where it can be defined im [...]
+<p id="index-29">Any dimension can have a number of aliases.  These act exactly like copies of that dimension, but must be included explicitly in the definition of subsequent vectors (i.e. they are not included in the default list of dimensions for a new vector).  The list of aliases for a dimension are included in an <code class="docutils literal"><span class="pre">aliases</span></code> attribute.  They are useful for non-local reference of variables.  See <code class="docutils literal" [...]
+<p id="index-30">Integrals over a dimension can be multiplied by a common prefactor, which is specified using the <code class="docutils literal"><span class="pre">volume_prefactor</span></code> attribute.  For example, this allows the automatic inclusion of a factor of two due to a reflection symmetry by adding the attribute <code class="docutils literal"><span class="pre">volume_prefactor="2"</span></code>.  In very specific cases, you may wish to refer to volume elements expl [...]
+<p>If you are using the <code class="docutils literal"><span class="pre">distributed-mpi</span></code> driver to parallelise the simulation, place the dimension you wish to split over multiple processors first.  The most efficient parallelisation would involve distributing a dimension with only local evolution, as the different memory blocks would not need to communicate.  Nonlocal evolution that is local in Fourier space is the second preference, as the Fourier transform can also be suc [...]
+<p id="transforms"><span id="index-31"></span>Each transverse dimension can be associated with a transform.  This allows the simulation to manipulate vectors defined on that dimension in the transform space.  The default is Fourier space (with the associated transform being the discrete Fourier transform, or “dft”), but others can be specified with the <code class="docutils literal"><span class="pre">transform</span></code> attribute.  The other options are “none” [...]
+<p id="index-32">An advanced feature discussed further in <a class="reference internal" href="advanced_topics.html#dimensionaliases"><span>Dimension aliases</span></a> are dimension aliases, which are specified by the <code class="docutils literal"><span class="pre">aliases</span></code> attribute.  This feature is useful for example, when calculating correlation functions.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -374,12 +374,12 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <div class="math">
 \[\begin{split}\tilde{\mathcal{F}}\left[f(x)\right](k) &= \frac{1}{\sqrt{2\pi}}\int_{x_\text{min}}^{x_\text{max}} f(x) e^{-i k (x+ x_\text{min})} dx \\
 &= e^{-i x_\text{min} k} \mathcal{F}\left[f(x)\right](k)\end{split}\]</div>
-<p>The standard usage in an XMDS simulation involves moving to Fourier space, applying a transformation, and then moving back.  For this purpose, the two transformations are entirely equivalent as the extra phase factor cancels.  However, when fields are explicitly defined in Fourier space, care must be taken to include this phase factor explicitly.  See section <a class="reference internal" href="advanced_topics.html#convolutions"><em>Convolutions and Fourier transforms</em></a> in the  [...]
+<p>The standard usage in an XMDS simulation involves moving to Fourier space, applying a transformation, and then moving back.  For this purpose, the two transformations are entirely equivalent as the extra phase factor cancels.  However, when fields are explicitly defined in Fourier space, care must be taken to include this phase factor explicitly.  See section <a class="reference internal" href="advanced_topics.html#convolutions"><span>Convolutions and Fourier transforms</span></a> in  [...]
 <p>When a dimension uses the “dft” transform, then the Fourier space variable is defined as the name of the dimension prefixed with a “k”.  For example, the dimensions “x”, “y”, “z” and “tau” will be referenced in Fourier space as “kx”,”ky”, “kz” and “ktau”.</p>
 <p>Fourier transforms allow easy calculation of derivatives, as the n<sup>th</sup> derivative of a field is proportional to the n<sup>th</sup> moment of the field in Fourier space:</p>
 <div class="math">
 \[\mathcal{F}\left[\frac{\partial^n f(x)}{\partial x^n}\right](k_x) = \left(i \;k_x\right)^n \mathcal{F}\left[f(x)\right](k_x)\]</div>
-<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial}{\partial x}\)</span> as an <tt class="docutils literal"><span class="pre">IP</span></tt> or <tt class="docutils literal"><span class="pre">EX</span></tt> operator as <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">i*kx;</span></tt> (see <a class="reference internal" href="#operatorselement"><em>Operators and operator eleme [...]
+<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial}{\partial x}\)</span> as an <code class="docutils literal"><span class="pre">IP</span></code> or <code class="docutils literal"><span class="pre">EX</span></code> operator as <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">i*kx;</span></code> (see <a class="reference internal" href="#operatorselement"><span>Operators and  [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -397,12 +397,12 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <span id="dct-transform"></span><span id="index-35"></span><h3>The “dct” transform<a class="headerlink" href="#the-dct-transform" title="Permalink to this headline">¶</a></h3>
 <p id="index-36">The “dct” (discrete cosine transform) is a Fourier-based transform that implies different boundary conditions for associated vectors.  XMDS uses the type-II DCT, often called “the DCT”, and its inverse, which is also called the type-III DCT.  This transform assumes that any vector using this dimension is both periodic, and also even around a specific point within each period.  The grid is therefore only defined across a half period in order to sam [...]
 <p>As the DCT transform can be defined on real data rather only complex data, it can also be superior to DFT-based spectral methods for simulations of real-valued fields where boundary conditions are artificial.</p>
-<p>XMDS labels the cosine transform space variables the same as for <a class="reference internal" href="#dft-transform"><em>Fourier transforms</em></a> and all the even derivatives can be calculated the same way.  Odd moments of the cosine-space variables are in fact <em>not</em> related to the corresponding odd derivatives by an inverse cosine transform.</p>
+<p>XMDS labels the cosine transform space variables the same as for <a class="reference internal" href="#dft-transform"><span>Fourier transforms</span></a> and all the even derivatives can be calculated the same way.  Odd moments of the cosine-space variables are in fact <em>not</em> related to the corresponding odd derivatives by an inverse cosine transform.</p>
 <p>Discrete cosine transforms allow easy calculation of even-order derivatives, as the 2n<sup>th</sup> derivative of a field is proportional to the 2n<sup>th</sup> moment of the field in DCT-space:</p>
 <div class="math">
 \[\mathcal{F}_\text{DCT}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DCT}\left[f(x)\right](k_x)\]</div>
-<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial^2}{\partial x^2}\)</span> as an <tt class="docutils literal"><span class="pre">IP</span></tt> or <tt class="docutils literal"><span class="pre">EX</span></tt> operator as <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kx*kx;</span></tt> (see <a class="reference internal" href="#operatorselement"><em>Operators and operator [...]
-<p>For problems where you are defining the simulation domain over only half of the physical domain to take advantage of reflection symmetry, consider using <tt class="docutils literal"><span class="pre">volume_prefactor="2.0"</span></tt> so that all volume integrals are over the entire physical domain, not just the simulation domain. i.e. integrals would be over -1 to 1 instead of 0 to 1 if the domain was specified as <tt class="docutils literal"><span class="pre">domain=" [...]
+<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial^2}{\partial x^2}\)</span> as an <code class="docutils literal"><span class="pre">IP</span></code> or <code class="docutils literal"><span class="pre">EX</span></code> operator as <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kx*kx;</span></code> (see <a class="reference internal" href="#operatorselement"><span>Operator [...]
+<p>For problems where you are defining the simulation domain over only half of the physical domain to take advantage of reflection symmetry, consider using <code class="docutils literal"><span class="pre">volume_prefactor="2.0"</span></code> so that all volume integrals are over the entire physical domain, not just the simulation domain. i.e. integrals would be over -1 to 1 instead of 0 to 1 if the domain was specified as <code class="docutils literal"><span class="pre">domain= [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -421,11 +421,11 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <span id="dst-transform"></span><span id="index-37"></span><h3>The “dst” transform<a class="headerlink" href="#the-dst-transform" title="Permalink to this headline">¶</a></h3>
 <p>The “dst” (discrete sine transform) is a counterpart to the DCT transform.  XMDS uses the type-II DST and its inverse, which is also called the type-III DST.  This transform assumes that fields are periodic in this dimension, but also that they are also odd around a specific point within each period.  The grid is therefore only defined across a half period in order to sample each unique point once, and can therefore be of any shape where all the even derivatives are zero a [...]
 <p id="index-38">The DST transform can be defined on real-valued vectors.  As odd-valued functions are zero at the boundaries, this is a natural transform to use when implementing zero Dirichlet boundary conditions.</p>
-<p>XMDS labels the sine transform space variables the same as for <a class="reference internal" href="#dft-transform"><em>Fourier transforms</em></a> and all the even derivatives can be calculated the same way.  Odd moments of the sine-space variables are in fact <em>not</em> related to the corresponding odd derivatives by an inverse sine transform.</p>
+<p>XMDS labels the sine transform space variables the same as for <a class="reference internal" href="#dft-transform"><span>Fourier transforms</span></a> and all the even derivatives can be calculated the same way.  Odd moments of the sine-space variables are in fact <em>not</em> related to the corresponding odd derivatives by an inverse sine transform.</p>
 <p>Discrete sine transforms allow easy calculation of even-order derivatives, as the 2n<sup>th</sup> derivative of a field is proportional to the 2n<sup>th</sup> moment of the field in DST-space:</p>
 <div class="math">
 \[\mathcal{F}_\text{DST}\left[\frac{\partial^{2n} f(x)}{\partial x^{2n}}\right](k_x) = (-k_x^2)^{n}\; \mathcal{F}_\text{DST}\left[f(x)\right](k_x)\]</div>
-<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial^2}{\partial x^2}\)</span> as an <tt class="docutils literal"><span class="pre">IP</span></tt> or <tt class="docutils literal"><span class="pre">EX</span></tt> operator as <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kx*kx;</span></tt> (see <a class="reference internal" href="#operatorselement"><em>Operators and operator [...]
+<p>This identity can be used to write the differential operator <span class="math">\(\mathcal{L} = \frac{\partial^2}{\partial x^2}\)</span> as an <code class="docutils literal"><span class="pre">IP</span></code> or <code class="docutils literal"><span class="pre">EX</span></code> operator as <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kx*kx;</span></code> (see <a class="reference internal" href="#operatorselement"><span>Operator [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -449,14 +449,14 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <p>This transform pair has the useful property that the Laplacian in cylindrical co-ordinates is diagonal in this basis:</p>
 <div class="math">
 \[\begin{split}\nabla^2 \left(f(r) e^{i m \theta}\right) &= \left(\frac{\partial^2 f}{\partial r^2} +\frac{1}{r}\frac{\partial f}{\partial r} -\frac{m^2}{r^2} f \right) e^{i m \theta} = \left\{\mathcal{H}^{-1}_m \left[(-k^2) F_m(k)\right](r) \right\} e^{i m \theta}\end{split}\]</div>
-<p>XMDS labels the variables in the transformed space with a prefix of ‘k’, just as for <a class="reference internal" href="#dft-transform"><em>Fourier transforms</em></a>.  The order <span class="math">\(m\)</span> of the transform is defined by the <tt class="docutils literal"><span class="pre">order</span></tt> attribute in the <tt class="docutils literal"><span class="pre"><dimension></span></tt> element, which must be assigned as a non-negative integer.  If the ord [...]
+<p>XMDS labels the variables in the transformed space with a prefix of ‘k’, just as for <a class="reference internal" href="#dft-transform"><span>Fourier transforms</span></a>.  The order <span class="math">\(m\)</span> of the transform is defined by the <code class="docutils literal"><span class="pre">order</span></code> attribute in the <code class="docutils literal"><span class="pre"><dimension></span></code> element, which must be assigned as a non-negative integer. [...]
 <p id="index-40">The difference between the “bessel” and “bessel-neumann” transforms is that the “bessel” transform enforces Dirichlet boundary conditions at the edge of the computational domain (<span class="math">\(f(R) = 0\)</span>), while “bessel-neumann” enforces Neumann boundary conditions (<span class="math">\(\left.\frac{\partial}{\partial r}f(r) \right|_{r=R} = 0\)</span>).</p>
-<p>It can often be useful to have a different sampling in normal space and Hankel space.  Reducing the number of modes in either space dramatically speeds simulations.  To set the number of lattice points in Hankel space to be different to the number of lattice points for the field in its original space, use the attribute <tt class="docutils literal"><span class="pre">spectral_lattice</span></tt>.  The Bessel space lattice is chosen such that the boundary condition at the edge of the dom [...]
-<p>Hankel transforms allow easy calculation of the Laplacian of fields with cylindrical symmetry.  Applying the operator <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kr*kr</span></tt> in Hankel space is therefore equivalent to applying the operator</p>
+<p>It can often be useful to have a different sampling in normal space and Hankel space.  Reducing the number of modes in either space dramatically speeds simulations.  To set the number of lattice points in Hankel space to be different to the number of lattice points for the field in its original space, use the attribute <code class="docutils literal"><span class="pre">spectral_lattice</span></code>.  The Bessel space lattice is chosen such that the boundary condition at the edge of the [...]
+<p>Hankel transforms allow easy calculation of the Laplacian of fields with cylindrical symmetry.  Applying the operator <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kr*kr</span></code> in Hankel space is therefore equivalent to applying the operator</p>
 <div class="math">
 \[\mathcal{L} = \left(\frac{\partial^2}{\partial r^2} +\frac{1}{r}\frac{\partial}{\partial r} -\frac{m^2}{r^2} \right)\]</div>
 <p>in coordinate space.</p>
-<p>In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in cylindrical co-ordinates with a radial co-ordinate ‘r’, integrals over this dimension have a volume element <span class="math">\(r dr\)</span>.  When performing integrals along a dimension specified by the “bessel” transform, the factor of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration. [...]
+<p>In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in cylindrical co-ordinates with a radial co-ordinate ‘r’, integrals over this dimension have a volume element <span class="math">\(r dr\)</span>.  When performing integrals along a dimension specified by the “bessel” transform, the factor of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefactors in your integration. [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -474,15 +474,15 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <p>When working in spherical coordinates, it is often useful to use the spherical Bessel functions <span class="math">\(j_l(x)=\sqrt{\frac{\pi}{2x}}J_{l+\frac{1}{2}}(x)\)</span> as a basis.  These are eigenfunctions of the radial component of Laplace’s equation in spherical coordinates:</p>
 <div class="math">
 \[\begin{split}\nabla^2 \left[j_l(k r)\; Y^m_l(\theta, \phi)\right] &= \left[\frac{\partial^2 }{\partial r^2} +\frac{2}{r}\frac{\partial }{\partial r} -\frac{l(l+1)}{r^2}\right] j_l(k r) \; Y^m_l(\theta, \phi) = -k^2 j_l(k r)\; Y^m_l(\theta, \phi)\end{split}\]</div>
-<p>Just as the Bessel basis above, the transformed dimensions are prefixed with a ‘k’, and it is possible (and usually wise) to use the <tt class="docutils literal"><span class="pre">spectral_lattice</span></tt> attribute to specify a different lattice size in the transformed space.  Also, the spacing of these lattices are again chosen in a non-uniform manner to Gaussian quadrature methods for spectrally accurate transforms.  Finally, the <tt class="docutils literal"><span cl [...]
+<p>Just as the Bessel basis above, the transformed dimensions are prefixed with a ‘k’, and it is possible (and usually wise) to use the <code class="docutils literal"><span class="pre">spectral_lattice</span></code> attribute to specify a different lattice size in the transformed space.  Also, the spacing of these lattices are again chosen in a non-uniform manner to Gaussian quadrature methods for spectrally accurate transforms.  Finally, the <code class="docutils literal"><s [...]
 <p>If we denote the transformation to and from this basis by <span class="math">\(\mathcal{SH}\)</span>, then we can write the useful property:</p>
 <div class="math">
 \[\frac{\partial^2 f}{\partial r^2} +\frac{2}{r}\frac{\partial f}{\partial r} -\frac{l (l+1)}{r^2} = \mathcal{SH}^{-1}_l \left[(-k^2) F_l(k)\right](r)\]</div>
-<p>Spherical Bessel transforms allow easy calculation of the Laplacian of fields with spherical symmetry. Applying the operator <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kr*kr</span></tt> in Spherical Bessel space is therefore equivalent to applying the operator</p>
+<p>Spherical Bessel transforms allow easy calculation of the Laplacian of fields with spherical symmetry. Applying the operator <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">-kr*kr</span></code> in Spherical Bessel space is therefore equivalent to applying the operator</p>
 <div class="math">
 \[\mathcal{L} = \left( \frac{\partial^2}{\partial r^2} +\frac{2}{r}\frac{\partial}{\partial r} -\frac{l (l+1)}{r^2} \right)\]</div>
 <p>in coordinate space.</p>
-<p>In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in spherical co-ordinates with a radial co-ordinate ‘r’, integrals over this dimension have a volume element <span class="math">\(r^2 dr\)</span>.  When performing integrals along a dimension specified by the “spherical-bessel” transform, the factor of the square of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefact [...]
+<p>In non-Euclidean co-ordinates, integrals have non-unit volume elements.  For example, in spherical co-ordinates with a radial co-ordinate ‘r’, integrals over this dimension have a volume element <span class="math">\(r^2 dr\)</span>.  When performing integrals along a dimension specified by the “spherical-bessel” transform, the factor of the square of the radius is included implicitly.  If you are using a geometry with some symmetry, it is common to have prefact [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -507,15 +507,15 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <div class="math">
 \[- \frac{\hbar^2}{2 m} \frac{\partial^2 \psi_n}{\partial x^2} + \frac{1}{2} m \omega^2 x^2 \psi_n(x) = \hbar \omega\left(n+\frac{1}{2}\right) \psi_n(x),\]</div>
 <p>with <span class="math">\(\sigma = \sqrt{\frac{\hbar}{m \omega}}\)</span>.</p>
-<p id="index-43">This transform is different to the others in that it requires a <tt class="docutils literal"><span class="pre">length_scale</span></tt> attribute rather than a <tt class="docutils literal"><span class="pre">domain</span></tt> attribute, as the range of the lattice will depend on the number of basis functions used. The <tt class="docutils literal"><span class="pre">length_scale</span></tt> attribute defines the scale of the domain as the standard deviation <span class="ma [...]
+<p id="index-43">This transform is different to the others in that it requires a <code class="docutils literal"><span class="pre">length_scale</span></code> attribute rather than a <code class="docutils literal"><span class="pre">domain</span></code> attribute, as the range of the lattice will depend on the number of basis functions used. The <code class="docutils literal"><span class="pre">length_scale</span></code> attribute defines the scale of the domain as the standard deviation <sp [...]
 <div class="math">
 \[\psi_0(x) = (\sigma^2 \pi)^{-1/4} e^{-x^2/2 \sigma^2}\]</div>
 <p>When a dimension uses the “hermite-gauss” transform, then the variable indexing the basis functions is defined as the name of the dimension prefixed with an “n”.  For example, when referencing the basis function indices for the dimensions “x”, “y”, “z” and “tau”, use the variable “nx”, “ny”, “nz” and “ntau”.</p>
-<p>Applying the operator <tt class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">nx</span> <span class="pre">+</span> <span class="pre">0.5</span></tt> in Hermite space is therefore equivalent to applying the operator</p>
+<p>Applying the operator <code class="docutils literal"><span class="pre">L</span> <span class="pre">=</span> <span class="pre">nx</span> <span class="pre">+</span> <span class="pre">0.5</span></code> in Hermite space is therefore equivalent to applying the operator</p>
 <div class="math">
 \[\mathcal{L} = \left(- \frac{\sigma^2}{2}\frac{\partial^2}{\partial x^2} + \frac{1}{2 \sigma^2} x^2 \right)\]</div>
 <p>in coordinate space.</p>
-<p>The Hermite-Gauss transform permits one to work in energy-space for the harmonic oscillator.  The normal Fourier transform of “hermite-gauss” dimensions can also be referenced using the dimension name prefixed with a “k”.  See the examples <tt class="docutils literal"><span class="pre">hermitegauss_transform.xmds</span></tt> and <tt class="docutils literal"><span class="pre">hermitegauss_groundstate.xmds</span></tt> for examples.</p>
+<p>The Hermite-Gauss transform permits one to work in energy-space for the harmonic oscillator.  The normal Fourier transform of “hermite-gauss” dimensions can also be referenced using the dimension name prefixed with a “k”.  See the examples <code class="docutils literal"><span class="pre">hermitegauss_transform.xmds</span></code> and <code class="docutils literal"><span class="pre">hermitegauss_groundstate.xmds</span></code> for examples.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -531,24 +531,24 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="vector-element">
 <span id="vectorelement"></span><span id="index-44"></span><h2>Vector Element<a class="headerlink" href="#vector-element" title="Permalink to this headline">¶</a></h2>
-<p>Vectors are arrays of data, defined over any subset of the transverse dimensions defined in your <a class="reference internal" href="#geometryelement"><em>Geometry Element</em></a>.  These dimensions are listed in the attribute <tt class="docutils literal"><span class="pre">dimensions</span></tt>, which can be an empty string if you wish the vector to not be defined on any dimensions.  If you do not include a <tt class="docutils literal"><span class="pre">dimensions</span></tt> attrib [...]
-<p id="index-45">Each <tt class="docutils literal"><span class="pre"><vector></span></tt> element has a unique name, defined by a <tt class="docutils literal"><span class="pre">name</span></tt> attribute.  It is either complex-valued (the default) or real-valued, which can be specified using the <tt class="docutils literal"><span class="pre">type="real"</span></tt> attribute.</p>
-<p id="componentselement"><span id="index-46"></span>A vector contains a list of variables, each defined by name in the <tt class="docutils literal"><span class="pre"><components></span></tt> element.  The name of each component is the name used to reference it later in the simulation.</p>
-<p id="index-47">Vectors are initialised at the beginning of a simulation, either from code or from an input file.  The basis choice for this initialisation defaults to the normal space as defined in the <tt class="docutils literal"><span class="pre"><geometry></span></tt> element, but any transverse dimension can be initialised in their transform basis by specifying them in an <tt class="docutils literal"><span class="pre">initial_basis</span></tt> attribute.  The <tt class="docut [...]
-<p id="initialisationelement"><span id="index-48"></span>When initialising the vector within the XMDS script, the appropriate code is placed in a ‘CDATA’ block inside an <tt class="docutils literal"><span class="pre"><initialisation></span></tt> element.  This code is in standard C-syntax, and should reference the components of the vector by name.  XMDS defines a few useful <a class="reference internal" href="#xmdscsyntax"><em>shorthand macros</em></a> for this C-code.  [...]
-<p id="referencingnonlocal"><span id="index-49"></span>While the default XMDS behaviour is to reference all variables locally, any vector can be referenced non-locally.  The notation for referencing the value of a vector ‘phi’ with a dimension ‘j’ at a value of ‘j=jk’ is <tt class="docutils literal"><span class="pre">phi(j</span> <span class="pre">=></span> <span class="pre">jk)</span></tt>.  Multiple non-local dimensions are addressed by adding the [...]
+<p>Vectors are arrays of data, defined over any subset of the transverse dimensions defined in your <a class="reference internal" href="#geometryelement"><span>Geometry Element</span></a>.  These dimensions are listed in the attribute <code class="docutils literal"><span class="pre">dimensions</span></code>, which can be an empty string if you wish the vector to not be defined on any dimensions.  If you do not include a <code class="docutils literal"><span class="pre">dimensions</span></ [...]
+<p id="index-45">Each <code class="docutils literal"><span class="pre"><vector></span></code> element has a unique name, defined by a <code class="docutils literal"><span class="pre">name</span></code> attribute.  It is either complex-valued (the default) or real-valued, which can be specified using the <code class="docutils literal"><span class="pre">type="real"</span></code> attribute.</p>
+<p id="componentselement"><span id="index-46"></span>A vector contains a list of variables, each defined by name in the <code class="docutils literal"><span class="pre"><components></span></code> element.  The name of each component is the name used to reference it later in the simulation.</p>
+<p id="index-47">Vectors are initialised at the beginning of a simulation, either from code or from an input file.  The basis choice for this initialisation defaults to the normal space as defined in the <code class="docutils literal"><span class="pre"><geometry></span></code> element, but any transverse dimension can be initialised in their transform basis by specifying them in an <code class="docutils literal"><span class="pre">initial_basis</span></code> attribute.  The <code cl [...]
+<p id="initialisationelement"><span id="index-48"></span>When initialising the vector within the XMDS script, the appropriate code is placed in a ‘CDATA’ block inside an <code class="docutils literal"><span class="pre"><initialisation></span></code> element.  This code is in standard C-syntax, and should reference the components of the vector by name.  XMDS defines a few useful <a class="reference internal" href="#xmdscsyntax"><span>shorthand macros</span></a> for this  [...]
+<p id="referencingnonlocal"><span id="index-49"></span>While the default XMDS behaviour is to reference all variables locally, any vector can be referenced non-locally.  The notation for referencing the value of a vector ‘phi’ with a dimension ‘j’ at a value of ‘j=jk’ is <code class="docutils literal"><span class="pre">phi(j</span> <span class="pre">=></span> <span class="pre">jk)</span></code>.  Multiple non-local dimensions are addressed by adding [...]
 <p>Dimensions can only be accessed non-locally if one of the following conditions is true:</p>
 <ul class="simple">
-<li>The dimension is an <tt class="docutils literal"><span class="pre">integer</span></tt> dimension,</li>
-<li>The dimension is accessed with an <a class="reference internal" href="advanced_topics.html#dimensionaliases"><em>alias</em></a> of that dimension. For example, <tt class="docutils literal"><span class="pre">phi(x</span> <span class="pre">=></span> <span class="pre">y)</span></tt> if the dimension <tt class="docutils literal"><span class="pre">x</span></tt> has <tt class="docutils literal"><span class="pre">y</span></tt> as an alias, or vice-versa.</li>
-<li>The dimension is a Fourier transform dimension (<tt class="docutils literal"><span class="pre">dft</span></tt>), used in the spectral basis (i.e. <tt class="docutils literal"><span class="pre">kx</span></tt> for an <tt class="docutils literal"><span class="pre">x</span></tt> dimension) and it is accessed with the negative of that dimension.  For example <tt class="docutils literal"><span class="pre">phi(kx</span> <span class="pre">=></span> <span class="pre">-kx)</span></tt>.</li>
-<li>The dimension is uniformly spaced (i.e. corresponds to the spatial basis of a dimension with a transform of <tt class="docutils literal"><span class="pre">dft</span></tt>, <tt class="docutils literal"><span class="pre">dct</span></tt>, <tt class="docutils literal"><span class="pre">dst</span></tt> or <tt class="docutils literal"><span class="pre">none</span></tt>), the dimension is symmetric about zero and it is accessed with the negative of the dimension name.  For example <tt class [...]
-<li>The dimension is uniformly spaced (i.e. corresponds to the spatial basis of a dimension with a transform of <tt class="docutils literal"><span class="pre">dft</span></tt>, <tt class="docutils literal"><span class="pre">dct</span></tt>, <tt class="docutils literal"><span class="pre">dst</span></tt> or <tt class="docutils literal"><span class="pre">none</span></tt>), and it is accessed with the lower limit of that dimension.  For example, <tt class="docutils literal"><span class="pre"> [...]
-<li><strong>Advanced behaviour</strong>: The value of a variable at an arbitrary point can be accessed via the integer index for that dimension. For example <tt class="docutils literal"><span class="pre">phi(x_index</span> <span class="pre">=></span> <span class="pre">3)</span></tt> accesses the value of <tt class="docutils literal"><span class="pre">phi</span></tt> at the grid point with index 3.  As <tt class="docutils literal"><span class="pre">x_index</span></tt> is zero-based, th [...]
+<li>The dimension is an <code class="docutils literal"><span class="pre">integer</span></code> dimension,</li>
+<li>The dimension is accessed with an <a class="reference internal" href="advanced_topics.html#dimensionaliases"><span>alias</span></a> of that dimension. For example, <code class="docutils literal"><span class="pre">phi(x</span> <span class="pre">=></span> <span class="pre">y)</span></code> if the dimension <code class="docutils literal"><span class="pre">x</span></code> has <code class="docutils literal"><span class="pre">y</span></code> as an alias, or vice-versa.</li>
+<li>The dimension is a Fourier transform dimension (<code class="docutils literal"><span class="pre">dft</span></code>), used in the spectral basis (i.e. <code class="docutils literal"><span class="pre">kx</span></code> for an <code class="docutils literal"><span class="pre">x</span></code> dimension) and it is accessed with the negative of that dimension.  For example <code class="docutils literal"><span class="pre">phi(kx</span> <span class="pre">=></span> <span class="pre">-kx)</sp [...]
+<li>The dimension is uniformly spaced (i.e. corresponds to the spatial basis of a dimension with a transform of <code class="docutils literal"><span class="pre">dft</span></code>, <code class="docutils literal"><span class="pre">dct</span></code>, <code class="docutils literal"><span class="pre">dst</span></code> or <code class="docutils literal"><span class="pre">none</span></code>), the dimension is symmetric about zero and it is accessed with the negative of the dimension name.  For e [...]
+<li>The dimension is uniformly spaced (i.e. corresponds to the spatial basis of a dimension with a transform of <code class="docutils literal"><span class="pre">dft</span></code>, <code class="docutils literal"><span class="pre">dct</span></code>, <code class="docutils literal"><span class="pre">dst</span></code> or <code class="docutils literal"><span class="pre">none</span></code>), and it is accessed with the lower limit of that dimension.  For example, <code class="docutils literal"> [...]
+<li><strong>Advanced behaviour</strong>: The value of a variable at an arbitrary point can be accessed via the integer index for that dimension. For example <code class="docutils literal"><span class="pre">phi(x_index</span> <span class="pre">=></span> <span class="pre">3)</span></code> accesses the value of <code class="docutils literal"><span class="pre">phi</span></code> at the grid point with index 3.  As <code class="docutils literal"><span class="pre">x_index</span></code> is ze [...]
 </ul>
-<p id="index-50">Note that a dimension cannot be accessed non-locally in <tt class="docutils literal"><span class="pre">distributed-mpi</span></tt> simulations if the simulation is distributed across that dimension.</p>
-<span class="target" id="filenameelement"><span id="index-51"></span></span><p id="index-52">If you wish to initialise from a file, then you can choose to initialise from an hdf5 file using <tt class="docutils literal"><span class="pre">kind="hdf5"</span></tt> in the <tt class="docutils literal"><span class="pre"><initialisation></span></tt> element, and then supply the name of the input file with the <tt class="docutils literal"><span class="pre">filename</span></tt> ele [...]
-<p id="index-53">When initialising from a file, the default is to require the lattice of the transverse dimensions to exactly match the lattice defined by XMDS.  There is an option to import data defined on a subset or superset of the lattice points.  Obviously, the dimensionality of the imported field still has to be correct.  This option is activated by defining the attribute <tt class="docutils literal"><span class="pre">geometry_matching_mode="loose"</span></tt>.  The defau [...]
+<p id="index-50">Note that a dimension cannot be accessed non-locally in <code class="docutils literal"><span class="pre">distributed-mpi</span></code> simulations if the simulation is distributed across that dimension.</p>
+<span class="target" id="filenameelement"><span id="index-51"></span></span><p id="index-52">If you wish to initialise from a file, then you can choose to initialise from an hdf5 file using <code class="docutils literal"><span class="pre">kind="hdf5"</span></code> in the <code class="docutils literal"><span class="pre"><initialisation></span></code> element, and then supply the name of the input file with the <code class="docutils literal"><span class="pre">filename</span [...]
+<p id="index-53">When initialising from a file, the default is to require the lattice of the transverse dimensions to exactly match the lattice defined by XMDS.  There is an option to import data defined on a subset or superset of the lattice points.  Obviously, the dimensionality of the imported field still has to be correct.  This option is activated by defining the attribute <code class="docutils literal"><span class="pre">geometry_matching_mode="loose"</span></code>.  The d [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -583,9 +583,9 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="the-dependencies-element">
 <span id="dependencies"></span><span id="index-54"></span><h3>The dependencies element<a class="headerlink" href="#the-dependencies-element" title="Permalink to this headline">¶</a></h3>
-<p>Often a vector, computed vector, filter, integration operator or output group will reference the values in one or more other vectors, computed vectors or noise vectors.  These dependencies are defined via a <tt class="docutils literal"><span class="pre"><dependencies></span></tt> element, which lists the names of the vectors.  The components of those vectors will then be available for use in the ‘CDATA’ block, and can be referenced by their name.</p>
-<p id="index-55">For a vector, the basis of the dependent vectors, and therefore the basis of the dimensions available in the ‘CDATA’ block, are defined by the <tt class="docutils literal"><span class="pre">initial_basis</span></tt> of the vector.  For a <tt class="docutils literal"><span class="pre"><computed_vector></span></tt>, <tt class="docutils literal"><span class="pre"><filter></span></tt> <tt class="docutils literal"><span class="pre"><integration_vect [...]
-<p>Any transverse dimensions that appear in the <tt class="docutils literal"><span class="pre"><dependencies></span></tt> element that do not appear in the <tt class="docutils literal"><span class="pre">dimensions</span></tt> attribute of the vector are integrated out.  For integer dimensions, this is simply an implicit sum over the dimension.  For real-valued dimensions, this is an implicit integral over the range of that dimension.</p>
+<p>Often a vector, computed vector, filter, integration operator or output group will reference the values in one or more other vectors, computed vectors or noise vectors.  These dependencies are defined via a <code class="docutils literal"><span class="pre"><dependencies></span></code> element, which lists the names of the vectors.  The components of those vectors will then be available for use in the ‘CDATA’ block, and can be referenced by their name.</p>
+<p id="index-55">For a vector, the basis of the dependent vectors, and therefore the basis of the dimensions available in the ‘CDATA’ block, are defined by the <code class="docutils literal"><span class="pre">initial_basis</span></code> of the vector.  For a <code class="docutils literal"><span class="pre"><computed_vector></span></code>, <code class="docutils literal"><span class="pre"><filter></span></code> <code class="docutils literal"><span class="pre"><in [...]
+<p>Any transverse dimensions that appear in the <code class="docutils literal"><span class="pre"><dependencies></span></code> element that do not appear in the <code class="docutils literal"><span class="pre">dimensions</span></code> attribute of the vector are integrated out.  For integer dimensions, this is simply an implicit sum over the dimension.  For real-valued dimensions, this is an implicit integral over the range of that dimension.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -630,8 +630,8 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="computed-vector-element">
 <span id="computedvectorelement"></span><span id="index-56"></span><h2>Computed Vector Element<a class="headerlink" href="#computed-vector-element" title="Permalink to this headline">¶</a></h2>
-<p id="evaluationelement"><span id="index-57"></span>Computed vectors are arrays of data much like normal <tt class="docutils literal"><span class="pre"><vector></span></tt> elements, but they are always calculated as they are referenced, so they cannot be initialised from file.  It is defined with a <tt class="docutils literal"><span class="pre"><computed_vector></span></tt> element, which has a <tt class="docutils literal"><span class="pre">name</span></tt> attribute, optio [...]
-<p>As it is not being stored, a <tt class="docutils literal"><span class="pre"><computed_vector></span></tt> does not have or require an <tt class="docutils literal"><span class="pre">initial_basis</span></tt> attribute, as it will be transformed into an appropriate basis for the element that references it.  The basis for its evaluation will be determined entirely by the <tt class="docutils literal"><span class="pre">basis</span></tt> attribute of the <tt class="docutils literal">< [...]
+<p id="evaluationelement"><span id="index-57"></span>Computed vectors are arrays of data much like normal <code class="docutils literal"><span class="pre"><vector></span></code> elements, but they are always calculated as they are referenced, so they cannot be initialised from file.  It is defined with a <code class="docutils literal"><span class="pre"><computed_vector></span></code> element, which has a <code class="docutils literal"><span class="pre">name</span></code> attr [...]
+<p>As it is not being stored, a <code class="docutils literal"><span class="pre"><computed_vector></span></code> does not have or require an <code class="docutils literal"><span class="pre">initial_basis</span></code> attribute, as it will be transformed into an appropriate basis for the element that references it.  The basis for its evaluation will be determined entirely by the <code class="docutils literal"><span class="pre">basis</span></code> attribute of the <code class="docut [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -671,10 +671,10 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="noise-vector-element">
 <span id="noisevectorelement"></span><span id="index-58"></span><h2>Noise Vector Element<a class="headerlink" href="#noise-vector-element" title="Permalink to this headline">¶</a></h2>
-<p>Noise vectors are used like computed vectors, but when they are evaluated they generate arrays of random numbers of various kinds.  They do not depend on other vectors, and are not initialised by code.  They are defined by a <tt class="docutils literal"><span class="pre"><noise_vector></span></tt> element, which has a <tt class="docutils literal"><span class="pre">name</span></tt> attribute, and optional <tt class="docutils literal"><span class="pre">dimensions</span></tt>, <tt  [...]
-<p>The choice of pseudo-random number generator (RNG) can be specified with the <tt class="docutils literal"><span class="pre">method</span></tt> attribute, which has options “posix” (the default), “mkl”, “solirte” and “dsfmt”.  It is only possible to use any particular method if that library is available.  Although “posix” is the default, it is also the slowest, and produces the lowest quality random numbers (although this is t [...]
-<p>The random number generators can be provided with a seed using the <tt class="docutils literal"><span class="pre">seed</span></tt> attribute, which should typically consist of a list of three integers.  All RNGs require positive integers as seeds.  It is possible to use the <a class="reference internal" href="#validation"><em><validation kind=”run-time”/></em></a> feature to use passed variables as seeds.  It is advantageous to use fixed seeds rather than timer-based [...]
-<p>The different types of noise vectors are defined by a mandatory <tt class="docutils literal"><span class="pre">kind</span></tt> attribute, which must take the value of ‘gauss’, ‘gaussian’, ‘wiener’, ‘poissonian’,’jump’ or ‘uniform’.</p>
+<p>Noise vectors are used like computed vectors, but when they are evaluated they generate arrays of random numbers of various kinds.  They do not depend on other vectors, and are not initialised by code.  They are defined by a <code class="docutils literal"><span class="pre"><noise_vector></span></code> element, which has a <code class="docutils literal"><span class="pre">name</span></code> attribute, and optional <code class="docutils literal"><span class="pre">dimensions</span>< [...]
+<p>The choice of pseudo-random number generator (RNG) can be specified with the <code class="docutils literal"><span class="pre">method</span></code> attribute, which has options “posix” (the default), “mkl”, “solirte” and “dsfmt”.  It is only possible to use any particular method if that library is available.  Although “posix” is the default, it is also the slowest, and produces the lowest quality random numbers (although this  [...]
+<p>The random number generators can be provided with a seed using the <code class="docutils literal"><span class="pre">seed</span></code> attribute, which should typically consist of a list of three integers.  All RNGs require positive integers as seeds.  It is possible to use the <a class="reference internal" href="#validation"><span><validation kind=”run-time”/></span></a> feature to use passed variables as seeds.  It is advantageous to use fixed seeds rather than tim [...]
+<p>The different types of noise vectors are defined by a mandatory <code class="docutils literal"><span class="pre">kind</span></code> attribute, which must take the value of ‘gauss’, ‘gaussian’, ‘wiener’, ‘poissonian’,’jump’ or ‘uniform’.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><geometry></span>
@@ -712,7 +712,7 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="gaussian-noise">
 <span id="gaussiannoise"></span><span id="index-60"></span><h3>Gaussian noise<a class="headerlink" href="#gaussian-noise" title="Permalink to this headline">¶</a></h3>
-<p>Noise generated with the “gaussian” method is gaussian distributed with zero mean.  For a real-valued noise vector, the variance at each point is the inverse of the volume element of the transverse dimensions in the vector.  This volume element for a single transverse dimension is that used to perform integrals over that dimension.  For example, it would include a factor of <span class="math">\(r^2\)</span> for a dimension “r” defined with a <tt class="docutils [...]
+<p>Noise generated with the “gaussian” method is gaussian distributed with zero mean.  For a real-valued noise vector, the variance at each point is the inverse of the volume element of the transverse dimensions in the vector.  This volume element for a single transverse dimension is that used to perform integrals over that dimension.  For example, it would include a factor of <span class="math">\(r^2\)</span> for a dimension “r” defined with a <code class="docuti [...]
 <p>This lattice-dependent variance is typical in most applications of partial differential equations with stochastic initial conditions, as the physical quantity is the variance of the field over some finite volume, which does not change if the variance at each lattice site varies as described above.</p>
 <p>For complex-valued noise vector, the real and imaginary parts of the noise are independent, and each have half the variance of a real-valued noise.  This means that the modulus squared of a complex-valued noise vector has the same variance as a real-valued noise vector at each point.</p>
 <p>Gaussian noise vectors are an example of a “static” noise, i.e. one suitable for initial conditions of a field.  If they were included in the equations of motion for a field, then the effect of the noise would depend on the lattice spacing of the propagation dimension.  XMDS therefore does not allow this noise type to be used in integration elements.</p>
@@ -728,7 +728,7 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <div class="section" id="wiener-noise">
 <span id="wienernoise"></span><span id="index-61"></span><h3>Wiener noise<a class="headerlink" href="#wiener-noise" title="Permalink to this headline">¶</a></h3>
 <p>Noise generated with the “wiener” method is gaussian distributed with zero mean and the same variance as the static “gaussian” noise defined above, multiplied by a factor of the lattice step in the propagation dimension.  This means that these noise vectors can be used to define Wiener noises for standard stochastic ordinary or partial differential equations.  Most integrators in XMDS effectively interpret these noises as Stratonovich increments.</p>
-<p>As a dynamic noise, a Wiener process is not well-defined except in an <tt class="docutils literal"><span class="pre">integrate</span></tt> element.</p>
+<p>As a dynamic noise, a Wiener process is not well-defined except in an <code class="docutils literal"><span class="pre">integrate</span></code> element.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><noise_vector</span> <span class="na">name=</span><span class="s">"diffusion"</span> <span class="na">dimensions=</span><span class="s">"x"</span> <span class="na">kind=</span><span class="s">"wiener"</span> <span class="na">type=</span><span class="s">"real"</span> <span class="na">method=</span><span class="s">"solirte"</span> <span class="na">seed=</span><span class="s">"314 159 276"</span><span class= [...]
@@ -740,7 +740,7 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="poissonian-noise">
 <span id="poissioniannoise"></span><span id="index-62"></span><h3>Poissonian noise<a class="headerlink" href="#poissonian-noise" title="Permalink to this headline">¶</a></h3>
-<p>A noise vector using the “poissonian” method generates a random variable from a Poissonian distribution.  While the the Poisson distribution is integer-valued, the variable will be cast as a real number.  The rate of the Poissonian distribution is defined by the <tt class="docutils literal"><span class="pre">mean</span></tt> or <tt class="docutils literal"><span class="pre">mean-density</span></tt> attributes.  These are are synonyms, and must be defined as positive real n [...]
+<p>A noise vector using the “poissonian” method generates a random variable from a Poissonian distribution.  While the the Poisson distribution is integer-valued, the variable will be cast as a real number.  The rate of the Poissonian distribution is defined by the <code class="docutils literal"><span class="pre">mean</span></code> or <code class="docutils literal"><span class="pre">mean-density</span></code> attributes.  These are are synonyms, and must be defined as positiv [...]
 <p>Poissonian noise vectors are an example of a “static” noise, i.e. one suitable for initial conditions of a field.  If they were included in the equations of motion for a field, then the effect of the noise would depend on the lattice spacing of the propagation dimension.  XMDS therefore does not allow this noise type to be used in integration elements.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
@@ -753,9 +753,9 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="jump-noise">
 <span id="jumpnoise"></span><span id="index-63"></span><h3>Jump noise<a class="headerlink" href="#jump-noise" title="Permalink to this headline">¶</a></h3>
-<p>A noise vector using the “jump” method is the dynamic version of the poissonian noise method, and must have the <tt class="docutils literal"><span class="pre">mean-rate</span></tt> attribute specified as a positive real number.  The variable at each point is chosen from a Poissonian distribution with a mean equal to the product of three variables: the <tt class="docutils literal"><span class="pre">mean-rate</span></tt> attribute; the volume of the element as defined by its [...]
-<p>It is common to wish to vary the mean rate of a jump process, which means that the <tt class="docutils literal"><span class="pre">mean-rate</span></tt> attribute must be a variable or a piece of code.  These cannot be verified to be a positive real number at compile time, so they must be used with the <a class="reference internal" href="#validation"><em><validation></em></a> feature with either the <tt class="docutils literal"><span class="pre">kind="none"</span></tt>  [...]
-<p>As a dynamic noise, a jump process is not well-defined except in an <tt class="docutils literal"><span class="pre">integrate</span></tt> element.  The only algorithm that currently integrates jump noises correctly is the Euler algorithm.  This can be implemented by the “SI” method with the option <tt class="docutils literal"><span class="pre">iterations="1"</span></tt>.</p>
+<p>A noise vector using the “jump” method is the dynamic version of the poissonian noise method, and must have the <code class="docutils literal"><span class="pre">mean-rate</span></code> attribute specified as a positive real number.  The variable at each point is chosen from a Poissonian distribution with a mean equal to the product of three variables: the <code class="docutils literal"><span class="pre">mean-rate</span></code> attribute; the volume of the element as define [...]
+<p>It is common to wish to vary the mean rate of a jump process, which means that the <code class="docutils literal"><span class="pre">mean-rate</span></code> attribute must be a variable or a piece of code.  These cannot be verified to be a positive real number at compile time, so they must be used with the <a class="reference internal" href="#validation"><span><validation></span></a> feature with either the <code class="docutils literal"><span class="pre">kind="none"</s [...]
+<p>As a dynamic noise, a jump process is not well-defined except in an <code class="docutils literal"><span class="pre">integrate</span></code> element.  The only algorithm that currently integrates jump noises correctly is the Euler algorithm.  This can be implemented by the “SI” method with the option <code class="docutils literal"><span class="pre">iterations="1"</span></code>.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><noise_vector</span> <span class="na">name=</span><span class="s">"initialDistribution"</span> <span class="na">dimensions=</span><span class="s">""</span> <span class="na">kind=</span><span class="s">"jump"</span> <span class="na">type=</span><span class="s">"real"</span> <span class="na">mean-rate=</span><span class="s">"2.7"</span> <span class="na">method=</span><span class="s">"solirte"</span> <span c [...]
@@ -768,7 +768,7 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="sequence-element">
 <span id="sequenceelement"></span><span id="index-64"></span><h2>Sequence Element<a class="headerlink" href="#sequence-element" title="Permalink to this headline">¶</a></h2>
-<p>All processing of vectors happens in sequence elements.  Each simulation must have exactly one main sequence element, but it can then contain any number of nested sequence elements.  A sequence element can contain any number of <tt class="docutils literal"><span class="pre"><sequence></span></tt>, <a class="reference internal" href="#filterelement"><em><filter></em></a>, <a class="reference internal" href="#integrateelement"><em><integrate></em></a> and/or <a class=" [...]
+<p>All processing of vectors happens in sequence elements.  Each simulation must have exactly one main sequence element, but it can then contain any number of nested sequence elements.  A sequence element can contain any number of <code class="docutils literal"><span class="pre"><sequence></span></code>, <a class="reference internal" href="#filterelement"><span><filter></span></a>, <a class="reference internal" href="#integrateelement"><span><integrate></span></a> and/o [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
     <span class="nt"><sequence</span> <span class="na">cycles=</span><span class="s">"2"</span><span class="nt">></span>
@@ -782,8 +782,9 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="filter-element">
 <span id="filterelement"></span><span id="index-65"></span><h2>Filter element<a class="headerlink" href="#filter-element" title="Permalink to this headline">¶</a></h2>
-<p>A <tt class="docutils literal"><span class="pre"><filter></span></tt> element can be placed inside a <tt class="docutils literal"><span class="pre"><sequence></span></tt> element or an <a class="reference internal" href="#integrateelement"><em><integrate></em></a> element.  It contains a ‘CDATA’ block and an optional <a class="reference internal" href="#dependencies"><em><dependencies></em></a> element, which may give access to variables in other <t [...]
-<p id="index-66">Sometimes it is desirable to apply a filter conditionally.  The most efficient way of doing this is to call the function from the piece of code that contains the conditional statement (likely another <tt class="docutils literal"><span class="pre"><filter></span></tt> element) rather than embed the conditional function in the filter itself, as the latter method can involve the conditional statement being evaluated multiple times over the transverse dimensions.  For  [...]
+<p>A <code class="docutils literal"><span class="pre"><filter></span></code> element can be placed inside the <code class="docutils literal"><span class="pre"><simulation></span></code> element, a <a class="reference internal" href="#sequenceelement"><span><sequence></span></a> element, or an <a class="reference internal" href="#integrateelement"><span><integrate></span></a> element.  It contains a ‘CDATA’ block and an optional <a class="reference inte [...]
+<p id="index-66">If a <code class="docutils literal"><span class="pre"><filter></span></code> element is placed in a <code class="docutils literal"><span class="pre"><sequence></span></code> element, then it executes once at that point in the sequence.  If it is placed in an <code class="docutils literal"><span class="pre"><integrate></span></code> element, then it is executed each integration step as described in the description of the <a class="reference internal" hre [...]
+<p>If a filter is placed in the <code class="docutils literal"><span class="pre"><simulation></span></code> element, it must be given a name with the <code class="docutils literal"><span class="pre">name</span></code> attribute.  It can thenceforth be called in CDATA blocks by that name.  For example: <code class="docutils literal"><span class="pre"><filter</span> <span class="pre">name="filterName"></span></code> allows the function to be called using the C-functio [...]
 <p>One of the common uses of a filter element is to apply discontinuous changes to the vectors and variables of the simulation.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><sequence></span>
@@ -806,11 +807,11 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="integrate-element">
 <span id="integrateelement"></span><span id="index-67"></span><h2>Integrate element<a class="headerlink" href="#integrate-element" title="Permalink to this headline">¶</a></h2>
-<p>The <tt class="docutils literal"><span class="pre"><integrate></span></tt> element is at the heart of most XMDS simulations.  It is used to integrate a set of (potentially stochastic) first-order differential equations for one or more of the vectors defined using the <tt class="docutils literal"><span class="pre"><vector></span></tt> element along the propagation dimension.  At the beginning of the simulation, the value of the propagation dimension is set to zero, and the  [...]
-<p id="index-68">The length of the integration is defined by the <tt class="docutils literal"><span class="pre">interval</span></tt> attribute, which must be a positive real number.  An <tt class="docutils literal"><span class="pre"><integrate></span></tt> element must have an <tt class="docutils literal"><span class="pre">algorithm</span></tt> attribute defined, which defines the integration method.  Current methods include <a class="reference internal" href="#si"><em>SI</em></a>, [...]
-<p id="sampleselement"><span id="index-69"></span>The optional <tt class="docutils literal"><span class="pre"><samples></span></tt> element is used to track the evolution of one or more vectors or variables during an integration.  This element must contain a non-negative integer for each <a class="reference internal" href="#samplinggroupelement"><em><sampling_group></em></a> element defined in the simulation’s <a class="reference internal" href="#outputelement"><em>< [...]
-<p>The vectors to be integrated and the form of the differential equations are defined in the <a class="reference internal" href="#operatorselement"><em><operators></em></a> element (or elements).  Filters to be applied each step can be defined with optional <a class="reference internal" href="#filterselement"><em><filters></em></a> elements.</p>
-<p>Computed vectors can be defined with the <tt class="docutils literal"><span class="pre"><computed_vector></span></tt> element.  These act exactly like a globally defined <a class="reference internal" href="#computedvectorelement"><em>Computed Vector Element</em></a>, but are only available within the single <tt class="docutils literal"><span class="pre"><integrate></span></tt> element.</p>
+<p>The <code class="docutils literal"><span class="pre"><integrate></span></code> element is at the heart of most XMDS simulations.  It is used to integrate a set of (potentially stochastic) first-order differential equations for one or more of the vectors defined using the <code class="docutils literal"><span class="pre"><vector></span></code> element along the propagation dimension.  At the beginning of the simulation, the value of the propagation dimension is set to zero,  [...]
+<p id="index-68">The length of the integration is defined by the <code class="docutils literal"><span class="pre">interval</span></code> attribute, which must be a positive real number.  An <code class="docutils literal"><span class="pre"><integrate></span></code> element must have an <code class="docutils literal"><span class="pre">algorithm</span></code> attribute defined, which defines the integration method.  Current methods include <a class="reference internal" href="#si"><spa [...]
+<p id="sampleselement"><span id="index-69"></span>The optional <code class="docutils literal"><span class="pre"><samples></span></code> element is used to track the evolution of one or more vectors or variables during an integration.  This element must contain a non-negative integer for each <a class="reference internal" href="#samplinggroupelement"><span><sampling_group></span></a> element defined in the simulation’s <a class="reference internal" href="#outputelement"> [...]
+<p>The vectors to be integrated and the form of the differential equations are defined in the <a class="reference internal" href="#operatorselement"><span><operators></span></a> element (or elements).  Filters to be applied each step can be defined with optional <a class="reference internal" href="#filterselement"><span><filters></span></a> elements.</p>
+<p>Computed vectors can be defined with the <code class="docutils literal"><span class="pre"><computed_vector></span></code> element.  These act exactly like a globally defined <a class="reference internal" href="#computedvectorelement"><span>Computed Vector Element</span></a>, but are only available within the single <code class="docutils literal"><span class="pre"><integrate></span></code> element.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"ARK89"</span> <span class="na">interval=</span><span class="s">"1e-4"</span> <span class="na">steps=</span><span class="s">"10000"</span> <span class="na">tolerance=</span><span class="s">"1e-8"</span><span class="nt">></span>
   <span class="nt"><samples></span>20<span class="nt"></samples></span>
@@ -840,11 +841,11 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="operators-and-operator-elements">
 <span id="operatorselement"></span><span id="index-70"></span><h3>Operators and operator elements<a class="headerlink" href="#operators-and-operator-elements" title="Permalink to this headline">¶</a></h3>
-<p>An <a class="reference internal" href="#integrateelement"><em><integrate></em></a> element must contain one or more <tt class="docutils literal"><span class="pre"><operators></span></tt> elements, which define both which vectors are to be integrated, and their derivative in the propagation dimension.  When all vectors to be integrated have the same dimensionality, they can all be defined within a single <tt class="docutils literal"><span class="pre"><operators></span [...]
-<p id="integrationvectorselement"><span id="index-71"></span>Within each <tt class="docutils literal"><span class="pre"><operators></span></tt> element, the vectors that are to be integrated are listed by name in the <tt class="docutils literal"><span class="pre"><integration_vectors></span></tt> element, and the differential equations are written in a ‘CDATA’ block.   The derivative of each component of the integration vectors must be defined along the propagatio [...]
-<p>When noise vectors are referenced, equations with Wiener noises should be written as though the equations are in differential form, as described in the worked examples <a class="reference internal" href="worked_examples.html#kubo"><em>Kubo Oscillator</em></a> and <a class="reference internal" href="worked_examples.html#fibre"><em>Fibre Noise</em></a>.  Jump-based Poisson noises will also be written in an equivalent form, as modelled by the example <tt class="docutils literal"><span cl [...]
-<p id="index-72">By default, the name of each component references the local value of the vector, but <a class="reference internal" href="#referencingnonlocal"><em>nonlocal variables</em></a> can be accessed using the standard syntax.  However, typically the most common (and most efficient) method of referencing nonlocal variables is to reference variables that are local in the <a class="reference internal" href="#transforms"><em>transformed space</em></a> for a given transverse dimensio [...]
-<span class="target" id="operatorelement"><span id="index-73"></span></span><p id="index-74">There are three kinds of <tt class="docutils literal"><span class="pre"><operator></span></tt> elements.  The first is denoted with a <tt class="docutils literal"><span class="pre">kind="functions"</span></tt> attribute, and contains a ‘CDATA’ block that will be executed in the order that it is defined.  This is useful when you wish to calculate functions that do not d [...]
+<p>An <a class="reference internal" href="#integrateelement"><span><integrate></span></a> element must contain one or more <code class="docutils literal"><span class="pre"><operators></span></code> elements, which define both which vectors are to be integrated, and their derivative in the propagation dimension.  When all vectors to be integrated have the same dimensionality, they can all be defined within a single <code class="docutils literal"><span class="pre"><operators [...]
+<p id="integrationvectorselement"><span id="index-71"></span>Within each <code class="docutils literal"><span class="pre"><operators></span></code> element, the vectors that are to be integrated are listed by name in the <code class="docutils literal"><span class="pre"><integration_vectors></span></code> element, and the differential equations are written in a ‘CDATA’ block.   The derivative of each component of the integration vectors must be defined along the pr [...]
+<p>When noise vectors are referenced, equations with Wiener noises should be written as though the equations are in differential form, as described in the worked examples <a class="reference internal" href="worked_examples.html#kubo"><span>Kubo Oscillator</span></a> and <a class="reference internal" href="worked_examples.html#fibre"><span>Fibre Noise</span></a>.  Jump-based Poisson noises will also be written in an equivalent form, as modelled by the example <code class="docutils literal [...]
+<p id="index-72">By default, the name of each component references the local value of the vector, but <a class="reference internal" href="#referencingnonlocal"><span>nonlocal variables</span></a> can be accessed using the standard syntax.  However, typically the most common (and most efficient) method of referencing nonlocal variables is to reference variables that are local in the <a class="reference internal" href="#transforms"><span>transformed space</span></a> for a given transverse  [...]
+<span class="target" id="operatorelement"><span id="index-73"></span></span><p id="index-74">There are three kinds of <code class="docutils literal"><span class="pre"><operator></span></code> elements.  The first is denoted with a <code class="docutils literal"><span class="pre">kind="functions"</span></code> attribute, and contains a ‘CDATA’ block that will be executed in the order that it is defined.  This is useful when you wish to calculate functions that  [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><operator</span> <span class="na">kind=</span><span class="s">"functions"</span><span class="nt">></span>
   <span class="cp"><![CDATA[</span>
@@ -853,9 +854,9 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <span class="nt"></operator></span>
 </pre></div>
 </div>
-<p id="operatornameselement">The second kind of operator element defines a list of operators in an <tt class="docutils literal"><span class="pre"><operator_names></span></tt> element.  The basis of these operators defaults to the transform space unless a different basis is specified using the <tt class="docutils literal"><span class="pre">basis</span></tt> attribute.  These operators must then be defined in a ‘CDATA’ block, using any <a class="reference internal" href=" [...]
-<span class="target" id="index-75"></span><p id="index-76">Operators of this second kind have the <tt class="docutils literal"><span class="pre">kind="IP"</span></tt> or <tt class="docutils literal"><span class="pre">kind="EX"</span></tt> attribute, standing for ‘interaction picture’ and ‘explicit’ operators respectively.  Explicit operators can be used in all situations, and simply construct and calculate a new vector of the form in the square [...]
-<p id="index-77">If the IP or EX operator is constant across the integration, then the attribute <tt class="docutils literal"><span class="pre">constant="yes"</span></tt> may be set to ensure that it is precalculated at the start of integration, otherwise the <tt class="docutils literal"><span class="pre">constant="no"</span></tt> attribute ensures that the operator is recalculated at each step.  The <tt class="docutils literal"><span class="pre">constant</span></tt>  [...]
+<p id="operatornameselement">The second kind of operator element defines a list of operators in an <code class="docutils literal"><span class="pre"><operator_names></span></code> element.  The basis of these operators defaults to the transform space unless a different basis is specified using the <code class="docutils literal"><span class="pre">basis</span></code> attribute.  These operators must then be defined in a ‘CDATA’ block, using any <a class="reference internal [...]
+<span class="target" id="index-75"></span><p id="index-76">Operators of this second kind have the <code class="docutils literal"><span class="pre">kind="IP"</span></code> or <code class="docutils literal"><span class="pre">kind="EX"</span></code> attribute, standing for ‘interaction picture’ and ‘explicit’ operators respectively.  Explicit operators can be used in all situations, and simply construct and calculate a new vector of the form in th [...]
+<p id="index-77">If the IP or EX operator is constant across the integration, then the attribute <code class="docutils literal"><span class="pre">constant="yes"</span></code> may be set to ensure that it is precalculated at the start of integration, otherwise the <code class="docutils literal"><span class="pre">constant="no"</span></code> attribute ensures that the operator is recalculated at each step.  The <code class="docutils literal"><span class="pre">constant</s [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><operator</span> <span class="na">kind=</span><span class="s">"ex"</span> <span class="na">constant=</span><span class="s">"yes"</span><span class="nt">></span>
   <span class="nt"><operator_names></span>T<span class="nt"></operator_names></span>
@@ -865,9 +866,9 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <span class="nt"></operator></span>
 </pre></div>
 </div>
-<p id="index-78">The third kind of operator element is used to define an integration along a transverse dimension.  This kind of evolution is called “cross-propagation”, and is described briefly in the examples ‘tla.xmds’, ‘tla_sic.xmds’ and ‘sine_cross.xmds’.  This class of equations have a subset of vectors that have an initial condition on one side of a transverse dimension, and a differential equation defined in that dimension, and as s [...]
-<p id="index-79">An operator element with the <tt class="docutils literal"><span class="pre">kind="cross_propagation"</span></tt> attribute must specify the transverse dimension along which the integration would proceed with the <tt class="docutils literal"><span class="pre">propagation_dimension</span></tt> attribute.  It must also specify its own <a class="reference internal" href="#integrationvectorselement"><em><integration_vectors></em></a> element, its own <tt class [...]
-<span class="target" id="index-80"></span><p id="boundaryconditionelement"><span id="index-81"></span>The boundary conditions are specified by a <tt class="docutils literal"><span class="pre"><boundary_conditions></span></tt> element, which requires the <tt class="docutils literal"><span class="pre">kind="left"</span></tt> or <tt class="docutils literal"><span class="pre">kind="right"</span></tt> attribute to specify on which side of the grid that the boundary c [...]
+<p id="index-78">The third kind of operator element is used to define an integration along a transverse dimension.  This kind of evolution is called “cross-propagation”, and is described briefly in the examples ‘tla.xmds’, ‘tla_sic.xmds’ and ‘sine_cross.xmds’.  This class of equations have a subset of vectors that have an initial condition on one side of a transverse dimension, and a differential equation defined in that dimension, and as s [...]
+<p id="index-79">An operator element with the <code class="docutils literal"><span class="pre">kind="cross_propagation"</span></code> attribute must specify the transverse dimension along which the integration would proceed with the <code class="docutils literal"><span class="pre">propagation_dimension</span></code> attribute.  It must also specify its own <a class="reference internal" href="#integrationvectorselement"><span><integration_vectors></span></a> element, its o [...]
+<span class="target" id="index-80"></span><p id="boundaryconditionelement"><span id="index-81"></span>The boundary conditions are specified by a <code class="docutils literal"><span class="pre"><boundary_conditions></span></code> element, which requires the <code class="docutils literal"><span class="pre">kind="left"</span></code> or <code class="docutils literal"><span class="pre">kind="right"</span></code> attribute to specify on which side of the grid that th [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><operator</span> <span class="na">kind=</span><span class="s">"cross_propagation"</span> <span class="na">algorithm=</span><span class="s">"RK4"</span> <span class="na">propagation_dimension=</span><span class="s">"t"</span><span class="nt">></span>
   <span class="nt"><integration_vectors></span>cross<span class="nt"></integration_vectors></span>
@@ -896,7 +897,7 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 </div>
 <div class="section" id="algorithms">
 <span id="id8"></span><h3>Algorithms<a class="headerlink" href="#algorithms" title="Permalink to this headline">¶</a></h3>
-<p>The stability, efficiency and even convergence of a numerical integration can depend on the method.  Due to the varying properties of different sets of equations, it is impossible to define the best method for all equations, so XMDS provides an option to use different algorithms.  These include fixed step algorithms, which divide the integration region into equal steps, and adaptive stepsize algorithms, which attempt to estimate the error in the simulation in order to choose an approp [...]
+<p>The stability, efficiency and even convergence of a numerical integration can depend on the method.  Due to the varying properties of different sets of equations, it is impossible to define the best method for all equations, so XMDS provides an option to use different algorithms.  These include fixed step algorithms, which divide the integration region into equal steps, and adaptive stepsize algorithms, which attempt to estimate the error in the simulation in order to choose an approp [...]
 <p>For the purposes of the descriptions below, we will assume that we are considering the following set of coupled differential equations for the vector of variables <span class="math">\(\mathbf{x}(t)\)</span>:</p>
 <div class="math">
 \[\frac{d x_j}{dt} = f_j(\mathbf{x}(t),t)\]</div>
@@ -905,39 +906,39 @@ The <tt class="docutils literal"><span class="pre">name="adaptive-mpi-multi
 <p>The SI algorithm is a semi-implicit fixed-step algorithm that finds the increment of the vector by solving</p>
 <div class="math">
 \[x_j(t+\Delta t) = x_j(t) + f_j\left(\mathbf{x}(t+\frac{\Delta t}{2}),t+\frac{\Delta t}{2}\right) \;\Delta t\]</div>
-<p>using a simple iteration to find the values of the vector at the midpoint of the step self-consistently.  The number of iterations can be set using the <tt class="docutils literal"><span class="pre">iterations</span></tt> attribute, and it defaults to <tt class="docutils literal"><span class="pre">iterations="3"</span></tt>.  The choice of <tt class="docutils literal"><span class="pre">iterations="1"</span></tt> is therefore fully equivalent to the Euler algorithm, [...]
+<p>using a simple iteration to find the values of the vector at the midpoint of the step self-consistently.  The number of iterations can be set using the <code class="docutils literal"><span class="pre">iterations</span></code> attribute, and it defaults to <code class="docutils literal"><span class="pre">iterations="3"</span></code>.  The choice of <code class="docutils literal"><span class="pre">iterations="1"</span></code> is therefore fully equivalent to the Eule [...]
 <div class="math">
 \[x_j(t+\Delta t) = x_j(t) + f_j\left(\mathbf{x}(t),t\right) \;\Delta t.\]</div>
-<p>The Euler algorithm is the only safe algorithm for direct integration of <a class="reference internal" href="#jumpnoise"><em>jump-based Poisson processes</em></a>.  Efficient numerical solution of those types of equations is best done via a process of triggered filters, which will be described in the <a class="reference internal" href="advanced_topics.html#advancedtopics"><em>Advanced Topics</em></a> section.  Integrating using the Euler algorithm computes the Ito integral, as opposed [...]
-<p>When SI integration is used in conjunction with SI cross-propagation, a slight variant of the SI algorithm can be employed where the integration in both directions is contained within the iteration process.  This is activated by using <tt class="docutils literal"><span class="pre">algorithm="SIC"</span></tt> rather than <tt class="docutils literal"><span class="pre">algorithm="SI"</span></tt>.</p>
-<p>The SI algorithm is correct to second order in the step-size for deterministic equations, and first order in the step-size for Stratonovich stochastic equations with Wiener noises.  This makes it the highest order stochastic algorithm in XMDS, although there are many sets of equations that integrate more efficiently with lower order algorithms.  When called with the <tt class="docutils literal"><span class="pre">iterations="1"</span></tt> option (the Euler algorithm), it is  [...]
+<p>The Euler algorithm is the only safe algorithm for direct integration of <a class="reference internal" href="#jumpnoise"><span>jump-based Poisson processes</span></a>.  Efficient numerical solution of those types of equations is best done via a process of triggered filters, which will be described in the <a class="reference internal" href="advanced_topics.html#advancedtopics"><span>Advanced Topics</span></a> section.  Integrating using the Euler algorithm computes the Ito integral, as [...]
+<p>When SI integration is used in conjunction with SI cross-propagation, a slight variant of the SI algorithm can be employed where the integration in both directions is contained within the iteration process.  This is activated by using <code class="docutils literal"><span class="pre">algorithm="SIC"</span></code> rather than <code class="docutils literal"><span class="pre">algorithm="SI"</span></code>.</p>
+<p>The SI algorithm is correct to second order in the step-size for deterministic equations, and first order in the step-size for Stratonovich stochastic equations with Wiener noises.  This makes it the highest order stochastic algorithm in XMDS, although there are many sets of equations that integrate more efficiently with lower order algorithms.  When called with the <code class="docutils literal"><span class="pre">iterations="1"</span></code> option (the Euler algorithm), it [...]
 </div>
 <div class="section" id="runge-kutta-algorithms">
 <span id="rk4"></span><span id="index-83"></span><h4>Runge-Kutta algorithms<a class="headerlink" href="#runge-kutta-algorithms" title="Permalink to this headline">¶</a></h4>
-<p>Runge-Kutta algorithms are the workhorse of numerical integration, and XMDS employs two fixed step versions: <tt class="docutils literal"><span class="pre">algorithm="RK4"</span></tt>, which is correct to fourth-order in the step size, and <tt class="docutils literal"><span class="pre">algorithm="RK9"</span></tt>, which is correct to ninth order in the step size.  It must be strongly noted that a higher order of convergence does not automatically mean a superior al [...]
+<p>Runge-Kutta algorithms are the workhorse of numerical integration, and XMDS employs two fixed step versions: <code class="docutils literal"><span class="pre">algorithm="RK4"</span></code>, which is correct to fourth-order in the step size, and <code class="docutils literal"><span class="pre">algorithm="RK9"</span></code>, which is correct to ninth order in the step size.  It must be strongly noted that a higher order of convergence does not automatically mean a sup [...]
 <p>All Runge-Kutta algorithms are convergent for Stratonovich stochastic equations at the order of the square root of the step-size.  This ‘half-order’ convergence may seem very weak, but for some classes of stochastic equation this improves up to one half of the deterministic order of convergence.  Also, the convergence of some stochastic equations is limited by the ‘deterministic part’, which can be improved dramatically by using a higher order Runge-Kutta method.</p>
 </div>
 <div class="section" id="adaptive-runge-kutta-algorithms">
 <span id="ark45"></span><span id="index-84"></span><h4>Adaptive Runge-Kutta algorithms<a class="headerlink" href="#adaptive-runge-kutta-algorithms" title="Permalink to this headline">¶</a></h4>
 <p>Fixed step integrators can encounter two issues.  First, as the equations or parameters of a simulation are changed, the minimum number of steps required to integrate it may change.  This means that the convergence must be re-tested multiple times for each set of parameters, as overestimating the number of steps required to perform an integration to a specified error tolerance can be very inefficient. Second, even if the minimum acceptable number of steps required is known for a given [...]
 algorithms get around this problem by testing the convergence during the integration, and adjusting the step-size until it reaches some target tolerance.</p>
-<p>XMDS employs two adaptive step-size algorithms based on ‘embedded Runge-Kutta’ methods.  These are Runge-Kutta methods that can output multiple variables that have different convergence.  The difference between the higher-order and the lower-order solutions gives an estimate of the error in each step, which can then be used to estimate an appropriate size for the next step.  We use <tt class="docutils literal"><span class="pre">algorthim="ARK45"</span></tt>, whic [...]
-<p>All adaptive stepsize algorithms require a <tt class="docutils literal"><span class="pre">tolerance</span></tt> attribute, which must be a positive real number that defines the allowable error per step.  It is also possible to specify a <tt class="docutils literal"><span class="pre">max_iterations</span></tt> attribute, which is a positive integer that stops the integrator from trying too many times to find an acceptable stepsize.  The integrator will abort with an error if the number [...]
+<p>XMDS employs two adaptive step-size algorithms based on ‘embedded Runge-Kutta’ methods.  These are Runge-Kutta methods that can output multiple variables that have different convergence.  The difference between the higher-order and the lower-order solutions gives an estimate of the error in each step, which can then be used to estimate an appropriate size for the next step.  We use <code class="docutils literal"><span class="pre">algorthim="ARK45"</span></code>,  [...]
+<p>All adaptive stepsize algorithms require a <code class="docutils literal"><span class="pre">tolerance</span></code> attribute, which must be a positive real number that defines the allowable error per step.  It is also possible to specify a <code class="docutils literal"><span class="pre">max_iterations</span></code> attribute, which is a positive integer that stops the integrator from trying too many times to find an acceptable stepsize.  The integrator will abort with an error if th [...]
 <p>As all Runge-Kutta solutions have equal order of convergence for stochastic equations, <em>if the step-size is limited by the stochastic term then the step-size estimation is entirely unreliable</em>.  Adaptive Runge-Kutta algorithms are therefore not appropriate for stochastic equations.</p>
 </div>
 <div class="section" id="richardson-extrapolation-algorithms-and-the-bulirsch-stoer-method">
 <span id="realgorithm"></span><span id="index-85"></span><h4>Richardson Extrapolation Algorithms and the Bulirsch-Stoer Method<a class="headerlink" href="#richardson-extrapolation-algorithms-and-the-bulirsch-stoer-method" title="Permalink to this headline">¶</a></h4>
-<p>The Richardson Extrapolation technique begins with a large initial interval and uses another stepper algorithm to compute the solution for this interval. It does this by subdividing the interval into increasing subintervals (i.e. with smaller and smaller stepsizes) and uses rational extrapolation to produce a higher order result than would be obtained using the other stepper on its own. The number of extrapolations performed is controllable via the <tt class="docutils literal"><span c [...]
+<p>The Richardson Extrapolation technique begins with a large initial interval and uses another stepper algorithm to compute the solution for this interval. It does this by subdividing the interval into increasing subintervals (i.e. with smaller and smaller stepsizes) and uses rational extrapolation to produce a higher order result than would be obtained using the other stepper on its own. The number of extrapolations performed is controllable via the <code class="docutils literal"><span [...]
 <p>Richardson Extrapolation provides the best trade off between computational effort and accuracy when paired with the Modified Midpoint stepper. This stepper is notable as its error scaling function contains only even powers of two. This means that each extrapolation performed in the Richardson technique gains two orders rather than one order as is expected for most other steppers. This combined with the low computational overhead of the Modified Midpoint makes it a powerful tool. The c [...]
-<p>A number of combinations of fixed-step, fixed-order Richardson Extrapolation are available in XMDS2. The most notable is the Bulirsch-Stoer method which can be selected using <tt class="docutils literal"><span class="pre">algorithm="BS"</span></tt> or alternatively <tt class="docutils literal"><span class="pre">algorithm="REMM"</span></tt>. Other combinations include ‘RERK4’, ‘RERK9’ and ‘RESI’ (for stochastic equations). Please  [...]
-<p>Richardson Extrapolation in general uses more memory than other integrators as multiple result vectors must be stored at the same time, which is something users should be aware of if the <tt class="docutils literal"><span class="pre">extrapolations</span></tt> attribute is set too high (generally < 10 should be sufficient).</p>
-<p>See the section on the <a class="reference internal" href="bulirschStoer.html#mmdetail"><em>Bulirsch-Stoer Algorithm</em></a> for more details.</p>
+<p>A number of combinations of fixed-step, fixed-order Richardson Extrapolation are available in XMDS2. The most notable is the Bulirsch-Stoer method which can be selected using <code class="docutils literal"><span class="pre">algorithm="BS"</span></code> or alternatively <code class="docutils literal"><span class="pre">algorithm="REMM"</span></code>. Other combinations include ‘RERK4’, ‘RERK9’ and ‘RESI’ (for stochastic equations). [...]
+<p>Richardson Extrapolation in general uses more memory than other integrators as multiple result vectors must be stored at the same time, which is something users should be aware of if the <code class="docutils literal"><span class="pre">extrapolations</span></code> attribute is set too high (generally < 10 should be sufficient).</p>
+<p>See the section on the <a class="reference internal" href="bulirschStoer.html#mmdetail"><span>Bulirsch-Stoer Algorithm</span></a> for more details.</p>
 </div>
 </div>
 <div class="section" id="filters-element">
 <span id="filterselement"></span><span id="index-86"></span><h3>Filters element<a class="headerlink" href="#filters-element" title="Permalink to this headline">¶</a></h3>
-<p><a class="reference internal" href="#filterelement"><em>Filter elements</em></a> are used inside <a class="reference internal" href="#sequenceelement"><em>sequence elements</em></a> to execute arbitrary code, or make discontinuous changes in the vectors.  Sometimes it is desirable to perform a filter element at the beginning or end of each step in an integration.  This can be done by placing <tt class="docutils literal"><span class="pre"><filter></span></tt> elements in a <tt cl [...]
-is then executed in the order found in the <tt class="docutils literal"><span class="pre"><filters></span></tt> element.</p>
+<p><a class="reference internal" href="#filterelement"><span>Filter elements</span></a> are used inside <a class="reference internal" href="#sequenceelement"><span>sequence elements</span></a> to execute arbitrary code, or make discontinuous changes in the vectors.  Sometimes it is desirable to perform a filter element at the beginning or end of each step in an integration.  This can be done by placing <code class="docutils literal"><span class="pre"><filter></span></code> elements [...]
+is then executed in the order found in the <code class="docutils literal"><span class="pre"><filters></span></code> element.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"ARK45"</span> <span class="na">interval=</span><span class="s">"100000.0"</span> <span class="na">steps=</span><span class="s">"10000000"</span> <span class="na">tolerance=</span><span class="s">"1e-8"</span><span class="nt">></span>
   <span class="nt"><samples></span>5000 100<span class="nt"></samples></span>
@@ -965,7 +966,7 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
 </div>
 <div class="section" id="breakpoint-element">
 <span id="breakpointelement"></span><span id="index-87"></span><h2>Breakpoint element<a class="headerlink" href="#breakpoint-element" title="Permalink to this headline">¶</a></h2>
-<p>The <tt class="docutils literal"><span class="pre"><breakpoint></span></tt> element is used to output the full state of one or more vectors.  Unlike sampled output, it executes immediately rather than at the end of a program, and can therefore be used to examine the current state of an ongoing simulation.  The vectors to be output are defined via a <a class="reference internal" href="#dependencies"><em><dependencies></em></a> element, and the basis is chosen by the <tt cla [...]
+<p>The <code class="docutils literal"><span class="pre"><breakpoint></span></code> element is used to output the full state of one or more vectors.  Unlike sampled output, it executes immediately rather than at the end of a program, and can therefore be used to examine the current state of an ongoing simulation.  The vectors to be output are defined via a <a class="reference internal" href="#dependencies"><span><dependencies></span></a> element, and the basis is chosen by the [...]
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><breakpoint</span> <span class="na">filename=</span><span class="s">"groundstate_break.xsil"</span> <span class="na">format=</span><span class="s">"hdf5"</span><span class="nt">></span>
   <span class="nt"><dependencies</span> <span class="na">basis=</span><span class="s">"ky"</span><span class="nt">></span>wavefunction<span class="nt"></dependencies></span>
@@ -975,13 +976,13 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
 </div>
 <div class="section" id="output-element">
 <span id="outputelement"></span><span id="index-88"></span><h2>Output element<a class="headerlink" href="#output-element" title="Permalink to this headline">¶</a></h2>
-<p id="index-89">The <tt class="docutils literal"><span class="pre"><output></span></tt> element describes the output of the program.  It is often inefficient to output the complete state of all vectors at all times during a large simulation, so the purpose of this function is to define subsets of the information required for output.  Each different format of information is described in a different <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> el [...]
-<p>The <tt class="docutils literal"><span class="pre"><samples></span></tt> inside <tt class="docutils literal"><span class="pre"><integrate></span></tt> elements defines a string of integers, with exactly one for each <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> element.  During that integration, the variables described in each <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> element will be sampled and st [...]
+<p id="index-89">The <code class="docutils literal"><span class="pre"><output></span></code> element describes the output of the program.  It is often inefficient to output the complete state of all vectors at all times during a large simulation, so the purpose of this function is to define subsets of the information required for output.  Each different format of information is described in a different <code class="docutils literal"><span class="pre"><sampling_group></span></ [...]
+<p>The <code class="docutils literal"><span class="pre"><samples></span></code> inside <code class="docutils literal"><span class="pre"><integrate></span></code> elements defines a string of integers, with exactly one for each <code class="docutils literal"><span class="pre"><sampling_group></span></code> element.  During that integration, the variables described in each <code class="docutils literal"><span class="pre"><sampling_group></span></code> element will b [...]
 <span class="target" id="index-90"></span><div class="section" id="sampling-group-element">
 <span id="samplinggroupelement"></span><span id="index-91"></span><h3>Sampling Group Element<a class="headerlink" href="#sampling-group-element" title="Permalink to this headline">¶</a></h3>
-<p>A <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> element defines a set of variables that we wish to output, and typically they are functions of some subset of vectors.  The names of the desired variables are listed in a <tt class="docutils literal"><span class="pre"><moments></span></tt> element, just like the <tt class="docutils literal"><span class="pre"><components></span></tt> element of a vector.  They are defined with a ‘<a cl [...]
-<p id="index-92">The basis of the output is specified by the <tt class="docutils literal"><span class="pre">basis</span></tt> attribute.  This overrides any basis specification in the <tt class="docutils literal"><span class="pre"><dependencies></span></tt> element.  Because we often wish to calculate these vectors on a finer grid than we wish to output, it is possible to specify that the output on a subset of the points defined for any transverse dimension.  This is done by adding [...]
-<p>The <tt class="docutils literal"><span class="pre">initial_sample</span></tt> attribute, which must be “yes” or “no”, determines whether the moment group will be sampled before any integration occurs.</p>
+<p>A <code class="docutils literal"><span class="pre"><sampling_group></span></code> element defines a set of variables that we wish to output, and typically they are functions of some subset of vectors.  The names of the desired variables are listed in a <code class="docutils literal"><span class="pre"><moments></span></code> element, just like the <code class="docutils literal"><span class="pre"><components></span></code> element of a vector.  They are defined with a  [...]
+<p id="index-92">The basis of the output is specified by the <code class="docutils literal"><span class="pre">basis</span></code> attribute.  This overrides any basis specification in the <code class="docutils literal"><span class="pre"><dependencies></span></code> element.  Because we often wish to calculate these vectors on a finer grid than we wish to output, it is possible to specify that the output on a subset of the points defined for any transverse dimension.  This is done b [...]
+<p>The <code class="docutils literal"><span class="pre">initial_sample</span></code> attribute, which must be “yes” or “no”, determines whether the moment group will be sampled before any integration occurs.</p>
 <p>Example syntax:</p>
 <div class="highlight-xmds2"><div class="highlight"><pre><span class="nt"><output</span> <span class="na">format=</span><span class="s">"hdf5"</span> <span class="na">filename=</span><span class="s">"SimOutput.xsil"</span><span class="nt">></span>
   <span class="nt"><sampling_group</span> <span class="na">basis=</span><span class="s">"x y"</span> <span class="na">initial_sample=</span><span class="s">"yes"</span><span class="nt">></span>
@@ -1035,12 +1036,12 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
 <span class="cp">]]></span>
 </pre></div>
 </div>
-<p>Various properties of dimensions are available.  For example, for a dimension called <tt class="docutils literal"><span class="pre">x</span></tt>:</p>
+<p>Various properties of dimensions are available.  For example, for a dimension called <code class="docutils literal"><span class="pre">x</span></code>:</p>
 <ul class="simple" id="index-93">
-<li>The number of points is accessible with the variable <tt class="docutils literal"><span class="pre">_lattice_x</span></tt>,</li>
-<li>The minimum range of that dimension is <tt class="docutils literal"><span class="pre">_min_x</span></tt>,</li>
-<li>The maximum range of that dimension is <tt class="docutils literal"><span class="pre">_max_x</span></tt>,</li>
-<li>The step size of a dimension is <tt class="docutils literal"><span class="pre">dx</span></tt>, and if it is constant, also available using <tt class="docutils literal"><span class="pre">_dx</span></tt>, but note that the latter does not include the effect of any <tt class="docutils literal"><span class="pre">volumePrefix</span></tt> you may have set!</li>
+<li>The number of points is accessible with the variable <code class="docutils literal"><span class="pre">_lattice_x</span></code>,</li>
+<li>The minimum range of that dimension is <code class="docutils literal"><span class="pre">_min_x</span></code>,</li>
+<li>The maximum range of that dimension is <code class="docutils literal"><span class="pre">_max_x</span></code>,</li>
+<li>The step size of a dimension is <code class="docutils literal"><span class="pre">dx</span></code>, and if it is constant, also available using <code class="docutils literal"><span class="pre">_dx</span></code>, but note that the latter does not include the effect of any <code class="docutils literal"><span class="pre">volumePrefix</span></code> you may have set!</li>
 </ul>
 </div>
 </div>
@@ -1049,7 +1050,7 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -1128,7 +1129,7 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -1145,7 +1146,7 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -1157,14 +1158,14 @@ is then executed in the order found in the <tt class="docutils literal"><span cl
         <li class="right" >
           <a href="reference_schema.html" title="XMDS2 XML Schema"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" >Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" >Reference section</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/reference_index.html b/documentation/reference_index.html
index 2948dd6..88f6745 100644
--- a/documentation/reference_index.html
+++ b/documentation/reference_index.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Reference section — XMDS2 2.2.2 documentation</title>
+    <title>Reference section — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Configuration, installation and runtime options" href="reference_installation_and_configuration.html" />
     <link rel="prev" title="Worked Examples" href="worked_examples.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="worked_examples.html" title="Worked Examples"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="reference-section">
 <h1>Reference section<a class="headerlink" href="#reference-section" title="Permalink to this headline">¶</a></h1>
@@ -89,7 +89,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -120,7 +120,7 @@
 <li class="toctree-l1"><a class="reference internal" href="news.html">News</a></li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -137,7 +137,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -149,13 +149,13 @@
         <li class="right" >
           <a href="worked_examples.html" title="Worked Examples"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/reference_installation_and_configuration.html b/documentation/reference_installation_and_configuration.html
index ffeadeb..906d0a0 100644
--- a/documentation/reference_installation_and_configuration.html
+++ b/documentation/reference_installation_and_configuration.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Configuration, installation and runtime options — XMDS2 2.2.2 documentation</title>
+    <title>Configuration, installation and runtime options — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,13 +25,13 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="up" title="Reference section" href="reference_index.html" />
     <link rel="next" title="Useful XML Syntax" href="reference_usefulXMLSyntax.html" />
     <link rel="prev" title="Reference section" href="reference_index.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -43,15 +43,15 @@
         <li class="right" >
           <a href="reference_index.html" title="Reference section"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <p>:: index:: Configure, Reconfigure, XMDS2 runtime options</p>
 <div class="section" id="configuration-installation-and-runtime-options">
@@ -63,23 +63,23 @@
 <li>‘-n’ or ‘–no-compile’, which generates the C code for the simulation, but does not try to compile it</li>
 <li>‘-v’ or ‘–verbose’, which gives verbose output about compilation flags.</li>
 <li>‘-g’ or ‘–debug’, which compiles the simulation in debug mode (compilation errors refer to lines in the source, not the .xmds file). This option implies ‘-v’. This option is mostly useful when debugging XMDS code generation.</li>
-<li>‘–waf-verbose’, which makes <tt class="docutils literal"><span class="pre">waf</span></tt> be very verbose when configuring XMDS or compiling simulations.  This option is intended for developer use only to aid in diagnosing problems with <tt class="docutils literal"><span class="pre">waf</span></tt>.</li>
+<li>‘–waf-verbose’, which makes <code class="docutils literal"><span class="pre">waf</span></code> be very verbose when configuring XMDS or compiling simulations.  This option is intended for developer use only to aid in diagnosing problems with <code class="docutils literal"><span class="pre">waf</span></code>.</li>
 </ul>
 </dd>
 </dl>
 <p>It also has commands to configure XMDS2 and recheck the installation.  If your program requires extra paths to compile, you can configure XMDS2 to include those paths by default.  Simply use the command</p>
-<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>xmds2 --configure --include-path /path/to/include --lib-path /path/to/lib
+<div class="highlight-bash"><div class="highlight"><pre>$ xmds2 --configure --include-path /path/to/include --lib-path /path/to/lib
 </pre></div>
 </div>
-<p>Alternatively, you can set the <tt class="docutils literal"><span class="pre">CXXFLAGS</span></tt> or <tt class="docutils literal"><span class="pre">LINKFLAGS</span></tt> environment variables before calling <tt class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></tt>.  For example, to pass the compiler flag <tt class="docutils literal"><span class="pre">-pedantic</span></tt> and the link flag <tt class="docutils literal"><span class="pre">-l [...]
-<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span><span class="nb">export </span><span class="nv">CXXFLAGS</span><span class="o">=</span><span class="s2">"-pedantic"</span>
-<span class="nv">$ </span><span class="nb">export </span><span class="nv">LINKFLAGS</span><span class="o">=</span><span class="s2">"-lm"</span>
-<span class="nv">$ </span>xmds2 --reconfigure<span class="sb">``</span>
+<p>Alternatively, you can set the <code class="docutils literal"><span class="pre">CXXFLAGS</span></code> or <code class="docutils literal"><span class="pre">LINKFLAGS</span></code> environment variables before calling <code class="docutils literal"><span class="pre">xmds2</span> <span class="pre">--reconfigure</span></code>.  For example, to pass the compiler flag <code class="docutils literal"><span class="pre">-pedantic</span></code> and the link flag <code class="docutils literal"><s [...]
+<div class="highlight-bash"><div class="highlight"><pre>$ <span class="nb">export</span> <span class="nv">CXXFLAGS</span><span class="o">=</span><span class="s2">"-pedantic"</span>
+$ <span class="nb">export</span> <span class="nv">LINKFLAGS</span><span class="o">=</span><span class="s2">"-lm"</span>
+$ xmds2 --reconfigure<span class="sb">``</span>
 </pre></div>
 </div>
 <p>This method can also be used to change the default compilers for standard and parallel processing, using the CXX and MPICXX flags respectively.</p>
 <p>Running XMDS2 with the ‘–configure’ option also searches for packages that have been installed since you last installed or configured XMDS2.  If you wish to run ‘xmds2 –configure’ with the same extra options as last time, simply use the command:</p>
-<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>xmds2 --reconfigure
+<div class="highlight-bash"><div class="highlight"><pre>$ xmds2 --reconfigure
 </pre></div>
 </div>
 <p>A detailed log of the checks is saved in the file ‘~/.xmds/waf_configure/config.log’.  This can be used to identify issues with packages that XMDS2 is not recognised, but you think that you have successfully installed on your system.</p>
@@ -89,12 +89,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -111,7 +111,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -123,14 +123,14 @@
         <li class="right" >
           <a href="reference_index.html" title="Reference section"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" >Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" >Reference section</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/reference_schema.html b/documentation/reference_schema.html
index 66a3eff..76ce7bf 100644
--- a/documentation/reference_schema.html
+++ b/documentation/reference_schema.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>XMDS2 XML Schema — XMDS2 2.2.2 documentation</title>
+    <title>XMDS2 XML Schema — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,13 +25,13 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="up" title="Reference section" href="reference_index.html" />
     <link rel="next" title="XMDS2 script elements" href="reference_elements.html" />
     <link rel="prev" title="Useful XML Syntax" href="reference_usefulXMLSyntax.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -43,15 +43,15 @@
         <li class="right" >
           <a href="reference_usefulXMLSyntax.html" title="Useful XML Syntax"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="xmds2-xml-schema">
 <span id="referenceschema"></span><span id="index-0"></span><h1>XMDS2 XML Schema<a class="headerlink" href="#xmds2-xml-schema" title="Permalink to this headline">¶</a></h1>
@@ -60,146 +60,156 @@
 <p>The possible attributes and attribute values for each element are not shown; see the individual entries in the Reference section for details.</p>
 <pre class="literal-block">
 <?xml version="1.0" encoding="UTF-8"?>
-<<a class="reference internal" href="reference_elements.html#simulationelement"><em>simulation</em></a> xmds-version="2">
-  <<a class="reference internal" href="reference_elements.html#nameelement"><em>name</em></a>> <<a class="reference internal" href="reference_elements.html#nameelement"><em>/name</em></a>>
-  <<a class="reference internal" href="reference_elements.html#authorelement"><em>author</em></a>> <<a class="reference internal" href="reference_elements.html#authorelement"><em>author</em></a>>
-  <<a class="reference internal" href="reference_elements.html#descriptionelement"><em>description</em></a>> <<a class="reference internal" href="reference_elements.html#descriptionelement"><em>/description</em></a>>
-
-  <<a class="reference internal" href="reference_elements.html#featureselement"><em>features</em></a>>
-    <<a class="reference internal" href="reference_elements.html#argumentselement"><em>arguments</em></a>>
-      <<a class="reference internal" href="reference_elements.html#argumentelement"><em>argument</em></a> />
-      <<a class="reference internal" href="reference_elements.html#argumentelement"><em>argument</em></a> />
+<<a class="reference internal" href="reference_elements.html#simulationelement"><span>simulation</span></a> xmds-version="2">
+  <<a class="reference internal" href="reference_elements.html#nameelement"><span>name</span></a>> <<a class="reference internal" href="reference_elements.html#nameelement"><span>/name</span></a>>
+  <<a class="reference internal" href="reference_elements.html#authorelement"><span>author</span></a>> <<a class="reference internal" href="reference_elements.html#authorelement"><span>author</span></a>>
+  <<a class="reference internal" href="reference_elements.html#descriptionelement"><span>description</span></a>> <<a class="reference internal" href="reference_elements.html#descriptionelement"><span>/description</span></a>>
+
+  <<a class="reference internal" href="reference_elements.html#featureselement"><span>features</span></a>>
+    <<a class="reference internal" href="reference_elements.html#argumentselement"><span>arguments</span></a>>
+      <<a class="reference internal" href="reference_elements.html#argumentelement"><span>argument</span></a> />
+      <<a class="reference internal" href="reference_elements.html#argumentelement"><span>argument</span></a> />
       ...
-    <<a class="reference internal" href="reference_elements.html#argumentselement"><em>/arguments</em></a>>
-    <<a class="reference internal" href="reference_elements.html#autovectorise"><em>auto_vectorise</em></a> />
-    <<a class="reference internal" href="reference_elements.html#benchmark"><em>benchmark</em></a> />
-    <<a class="reference internal" href="reference_elements.html#bing"><em>bing</em></a> />
-    <<a class="reference internal" href="reference_elements.html#cflags"><em>cflags</em></a>> <<a class="reference internal" href="reference_elements.html#cflags"><em>/cflags</em></a>>
-    <<a class="reference internal" href="reference_elements.html#chunkedoutput"><em>chunked_output</em></a> />
-    <<a class="reference internal" href="reference_elements.html#diagnostics"><em>diagnostics</em></a> />
-    <<a class="reference internal" href="reference_elements.html#errorcheck"><em>error_check</em></a> />
-    <<a class="reference internal" href="reference_elements.html#haltnonfinite"><em>halt_non_finite</em></a> />
-    <<a class="reference internal" href="reference_elements.html#fftw"><em>fftw</em></a> />
-    <<a class="reference internal" href="reference_elements.html#globals"><em>globals</em></a>> <<a class="reference internal" href="reference_elements.html#globals"><em>/globals</em></a>>
-    <<a class="reference internal" href="reference_elements.html#openmp"><em>openmp</em></a> />
-    <<a class="reference internal" href="reference_elements.html#precision"><em>precision</em></a>> <<a class="reference internal" href="reference_elements.html#precision"><em>/precision</em></a>>
-    <<a class="reference internal" href="reference_elements.html#validation"><em>validation</em></a> />
-  <<a class="reference internal" href="reference_elements.html#featureselement"><em>/features</em></a>>
-
-  <<a class="reference internal" href="reference_elements.html#driverelement"><em>driver</em></a> />
-
-  <<a class="reference internal" href="reference_elements.html#geometryelement"><em>geometry</em></a>>
-    <<a class="reference internal" href="reference_elements.html#propagationdimensionelement"><em>propagation_dimension</em></a>> <<a class="reference internal" href="reference_elements.html#propagationdimensionelement"><em>/propagation_dimension</em></a>>
-    <<a class="reference internal" href="reference_elements.html#transversedimensionselement"><em>transverse_dimensions</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dimensionelement"><em>dimension</em></a> />
-      <<a class="reference internal" href="reference_elements.html#dimensionelement"><em>dimension</em></a> />
+    <<a class="reference internal" href="reference_elements.html#argumentselement"><span>/arguments</span></a>>
+    <<a class="reference internal" href="reference_elements.html#autovectorise"><span>auto_vectorise</span></a> />
+    <<a class="reference internal" href="reference_elements.html#benchmark"><span>benchmark</span></a> />
+    <<a class="reference internal" href="reference_elements.html#bing"><span>bing</span></a> />
+    <<a class="reference internal" href="reference_elements.html#cflags"><span>cflags</span></a>> <<a class="reference internal" href="reference_elements.html#cflags"><span>/cflags</span></a>>
+    <<a class="reference internal" href="reference_elements.html#chunkedoutput"><span>chunked_output</span></a> />
+    <<a class="reference internal" href="reference_elements.html#diagnostics"><span>diagnostics</span></a> />
+    <<a class="reference internal" href="reference_elements.html#errorcheck"><span>error_check</span></a> />
+    <<a class="reference internal" href="reference_elements.html#haltnonfinite"><span>halt_non_finite</span></a> />
+    <<a class="reference internal" href="reference_elements.html#fftw"><span>fftw</span></a> />
+    <<a class="reference internal" href="reference_elements.html#globals"><span>globals</span></a>> <<a class="reference internal" href="reference_elements.html#globals"><span>/globals</span></a>>
+    <<a class="reference internal" href="reference_elements.html#openmp"><span>openmp</span></a> />
+    <<a class="reference internal" href="reference_elements.html#precision"><span>precision</span></a>> <<a class="reference internal" href="reference_elements.html#precision"><span>/precision</span></a>>
+    <<a class="reference internal" href="reference_elements.html#validation"><span>validation</span></a> />
+  <<a class="reference internal" href="reference_elements.html#featureselement"><span>/features</span></a>>
+
+  <<a class="reference internal" href="reference_elements.html#driverelement"><span>driver</span></a> />
+
+  <<a class="reference internal" href="reference_elements.html#geometryelement"><span>geometry</span></a>>
+    <<a class="reference internal" href="reference_elements.html#propagationdimensionelement"><span>propagation_dimension</span></a>> <<a class="reference internal" href="reference_elements.html#propagationdimensionelement"><span>/propagation_dimension</span></a>>
+    <<a class="reference internal" href="reference_elements.html#transversedimensionselement"><span>transverse_dimensions</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dimensionelement"><span>dimension</span></a> />
+      <<a class="reference internal" href="reference_elements.html#dimensionelement"><span>dimension</span></a> />
       ...
-    <<a class="reference internal" href="reference_elements.html#transversedimensionselement"><em>/transverse_dimensions</em></a>>
-  <<a class="reference internal" href="reference_elements.html#geometryelement"><em>/geometry</em></a>>
-
-  <<a class="reference internal" href="reference_elements.html#vectorelement"><em>vector</em></a>>
-    <<a class="reference internal" href="reference_elements.html#componentselement"><em>components</em></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><em>/components</em></a>>
-    <<a class="reference internal" href="reference_elements.html#initialisationelement"><em>initialisation</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-      <<a class="reference internal" href="reference_elements.html#filenameelement"><em>filename</em></a>>
-      <![<a class="reference internal" href="reference_elements.html#initialisationelement"><em>CDATA</em></a> [
+    <<a class="reference internal" href="reference_elements.html#transversedimensionselement"><span>/transverse_dimensions</span></a>>
+  <<a class="reference internal" href="reference_elements.html#geometryelement"><span>/geometry</span></a>>
+
+  <<a class="reference internal" href="reference_elements.html#vectorelement"><span>vector</span></a>>
+    <<a class="reference internal" href="reference_elements.html#componentselement"><span>components</span></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><span>/components</span></a>>
+    <<a class="reference internal" href="reference_elements.html#initialisationelement"><span>initialisation</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+      <<a class="reference internal" href="reference_elements.html#filenameelement"><span>filename</span></a>>
+      <![<a class="reference internal" href="reference_elements.html#initialisationelement"><span>CDATA</span></a> [
       ]]>
-    <<a class="reference internal" href="reference_elements.html#initialisationelement"><em>/initialisation</em></a>>
-  <<a class="reference internal" href="reference_elements.html#vectorelement"><em>/vector</em></a>>
+    <<a class="reference internal" href="reference_elements.html#initialisationelement"><span>/initialisation</span></a>>
+  <<a class="reference internal" href="reference_elements.html#vectorelement"><span>/vector</span></a>>
+
+  <<a class="reference internal" href="reference_elements.html#vectorelement"><span>vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#vectorelement"><span>/vector</span></a>>
+  <<a class="reference internal" href="reference_elements.html#vectorelement"><span>vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#vectorelement"><span>/vector</span></a>>
+  ...
+
+  <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>>
+    <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+    <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
+    ]]>
+  <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
 
-  <<a class="reference internal" href="reference_elements.html#vectorelement"><em>vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#vectorelement"><em>/vector</em></a>>
-  <<a class="reference internal" href="reference_elements.html#vectorelement"><em>vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#vectorelement"><em>/vector</em></a>>
+  <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
+  <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
   ...
 
-  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>computed_vector</em></a>>
-    <<a class="reference internal" href="reference_elements.html#componentselement"><em>components</em></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><em>/components</em></a>>
-    <<a class="reference internal" href="reference_elements.html#evaluationelement"><em>evaluation</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-      <![<a class="reference internal" href="reference_elements.html#initialisationelement"><em>CDATA</em></a> [
+  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>computed_vector</span></a>>
+    <<a class="reference internal" href="reference_elements.html#componentselement"><span>components</span></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><span>/components</span></a>>
+    <<a class="reference internal" href="reference_elements.html#evaluationelement"><span>evaluation</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+      <![<a class="reference internal" href="reference_elements.html#initialisationelement"><span>CDATA</span></a> [
       ]]>
-    <<a class="reference internal" href="reference_elements.html#evaluationelement"><em>/evaluation</em></a>>
-  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>/computed_vector</em></a>>
+    <<a class="reference internal" href="reference_elements.html#evaluationelement"><span>/evaluation</span></a>>
+  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>/computed_vector</span></a>>
 
-  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>computed_vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>/computed_vector</em></a>>
-  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>computed_vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>/computed_vector</em></a>>
+  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>computed_vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>/computed_vector</span></a>>
+  <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>computed_vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>/computed_vector</span></a>>
   ...
 
-  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>noise_vector</em></a>>
-    <<a class="reference internal" href="reference_elements.html#componentselement"><em>components</em></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><em>/components</em></a>>
-  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>/noise_vector</em></a>>
+  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>noise_vector</span></a>>
+    <<a class="reference internal" href="reference_elements.html#componentselement"><span>components</span></a>> <<a class="reference internal" href="reference_elements.html#componentselement"><span>/components</span></a>>
+  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>/noise_vector</span></a>>
 
-  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>noise_vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>/noise_vector</em></a>>
-  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>noise_vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#noisevectorelement"><em>/noise_vector</em></a>>
+  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>noise_vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>/noise_vector</span></a>>
+  <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>noise_vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#noisevectorelement"><span>/noise_vector</span></a>>
   ...
 
-  <<a class="reference internal" href="reference_elements.html#sequenceelement"><em>sequence</em></a>>
+  <<a class="reference internal" href="reference_elements.html#sequenceelement"><span>sequence</span></a>>
 
-    <<a class="reference internal" href="reference_elements.html#filterelement"><em>filter</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-      <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><em>CDATA</em></a> [
+    <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+      <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
       ]]>
-    <<a class="reference internal" href="reference_elements.html#filterelement"><em>/filter</em></a>>
+    <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
 
-    <<a class="reference internal" href="reference_elements.html#integrateelement"><em>integrate</em></a>>
-      <<a class="reference internal" href="reference_elements.html#sampleselement"><em>samples</em></a>> <<a class="reference internal" href="reference_elements.html#sampleselement"><em>/samples</em></a>>
+    <<a class="reference internal" href="reference_elements.html#integrateelement"><span>integrate</span></a>>
+      <<a class="reference internal" href="reference_elements.html#sampleselement"><span>samples</span></a>> <<a class="reference internal" href="reference_elements.html#sampleselement"><span>/samples</span></a>>
 
-      <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>computed_vector</em></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><em>/computed_vector</em></a>>
+      <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>computed_vector</span></a>> ... <<a class="reference internal" href="reference_elements.html#computedvectorelement"><span>/computed_vector</span></a>>
 
-      <<a class="reference internal" href="reference_elements.html#filterselement"><em>filters</em></a>>
-        <<a class="reference internal" href="reference_elements.html#filterelement"><em>filter</em></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><em>/filter</em></a>>
-        <<a class="reference internal" href="reference_elements.html#filterelement"><em>filter</em></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><em>/filter</em></a>>
+      <<a class="reference internal" href="reference_elements.html#filterselement"><span>filters</span></a>>
+        <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
+        <<a class="reference internal" href="reference_elements.html#filterelement"><span>filter</span></a>> ... <<a class="reference internal" href="reference_elements.html#filterelement"><span>/filter</span></a>>
         ...
-      <<a class="reference internal" href="reference_elements.html#filterselement"><em>/filters</em></a>>
+      <<a class="reference internal" href="reference_elements.html#filterselement"><span>/filters</span></a>>
 
-      <<a class="reference internal" href="reference_elements.html#operatorselement"><em>operators</em></a>>
+      <<a class="reference internal" href="reference_elements.html#operatorselement"><span>operators</span></a>>
 
-        <<a class="reference internal" href="reference_elements.html#operatorelement"><em>operator</em></a>>
-          <<a class="reference internal" href="reference_elements.html#boundaryconditionelement"><em>boundary_condition</em></a>>
-            <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-            <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><em>CDATA</em></a> [
+        <<a class="reference internal" href="reference_elements.html#operatorelement"><span>operator</span></a>>
+          <<a class="reference internal" href="reference_elements.html#boundaryconditionelement"><span>boundary_condition</span></a>>
+            <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+            <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
             ]]>
-          <<a class="reference internal" href="reference_elements.html#boundaryconditionelement"><em>/boundary_condition</em></a>>
-          <<a class="reference internal" href="reference_elements.html#operatornameselement"><em>operator_names</em></a>> <<a class="reference internal" href="reference_elements.html#operatornameselement"><em>/operator_names</em></a>>
-          <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-          <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><em>CDATA</em></a> [
+          <<a class="reference internal" href="reference_elements.html#boundaryconditionelement"><span>/boundary_condition</span></a>>
+          <<a class="reference internal" href="reference_elements.html#operatornameselement"><span>operator_names</span></a>> <<a class="reference internal" href="reference_elements.html#operatornameselement"><span>/operator_names</span></a>>
+          <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+          <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
           ]]>
-        <<a class="reference internal" href="reference_elements.html#operatorelement"><em>/operator</em></a>>
+        <<a class="reference internal" href="reference_elements.html#operatorelement"><span>/operator</span></a>>
 
-        <<a class="reference internal" href="reference_elements.html#operatorelement"><em>operator</em></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><em>/operator</em></a>>
-        <<a class="reference internal" href="reference_elements.html#operatorelement"><em>operator</em></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><em>/operator</em></a>>
+        <<a class="reference internal" href="reference_elements.html#operatorelement"><span>operator</span></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><span>/operator</span></a>>
+        <<a class="reference internal" href="reference_elements.html#operatorelement"><span>operator</span></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><span>/operator</span></a>>
         ...
 
-        <<a class="reference internal" href="reference_elements.html#integrationvectorselement"><em>integration_vectors</em></a>> <<a class="reference internal" href="reference_elements.html#integrationvectorselement"><em>/integration_vectors</em></a>>
-        <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-        <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><em>CDATA</em></a> [
+        <<a class="reference internal" href="reference_elements.html#integrationvectorselement"><span>integration_vectors</span></a>> <<a class="reference internal" href="reference_elements.html#integrationvectorselement"><span>/integration_vectors</span></a>>
+        <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+        <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
         ]]>
 
-      <<a class="reference internal" href="reference_elements.html#operatorselement"><em>/operators</em></a>>
+      <<a class="reference internal" href="reference_elements.html#operatorselement"><span>/operators</span></a>>
 
-    <<a class="reference internal" href="reference_elements.html#integrateelement"><em>/integrate</em></a>>
+    <<a class="reference internal" href="reference_elements.html#integrateelement"><span>/integrate</span></a>>
 
-    <<a class="reference internal" href="reference_elements.html#breakpointelement"><em>breakpoint</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-    <<a class="reference internal" href="reference_elements.html#breakpointelement"><em>/breakpoint</em></a>>
+    <<a class="reference internal" href="reference_elements.html#breakpointelement"><span>breakpoint</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+    <<a class="reference internal" href="reference_elements.html#breakpointelement"><span>/breakpoint</span></a>>
 
-  <<a class="reference internal" href="reference_elements.html#sequenceelement"><em>/sequence</em></a>>
+  <<a class="reference internal" href="reference_elements.html#sequenceelement"><span>/sequence</span></a>>
 
-  <<a class="reference internal" href="reference_elements.html#outputelement"><em>output</em></a>>
-    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>sampling_group</em></a>>
-      <<a class="reference internal" href="reference_elements.html#dependencies"><em>dependencies</em></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><em>/dependencies</em></a>>
-      <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>moments</em></a>> <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>/moments</em></a>>
-      <<a class="reference internal" href="reference_elements.html#operatorelement"><em>operator</em></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><em>/operator</em></a>>
-      <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><em>CDATA</em></a> [
+  <<a class="reference internal" href="reference_elements.html#outputelement"><span>output</span></a>>
+    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>sampling_group</span></a>>
+      <<a class="reference internal" href="reference_elements.html#dependencies"><span>dependencies</span></a>> <<a class="reference internal" href="reference_elements.html#dependencies"><span>/dependencies</span></a>>
+      <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>moments</span></a>> <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>/moments</span></a>>
+      <<a class="reference internal" href="reference_elements.html#operatorelement"><span>operator</span></a>> ... <<a class="reference internal" href="reference_elements.html#operatorelement"><span>/operator</span></a>>
+      <![<a class="reference internal" href="reference_elements.html#xmdscsyntax"><span>CDATA</span></a> [
       ]]>
-    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>/sampling_group</em></a>>
+    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>/sampling_group</span></a>>
 
-    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>sampling_group</em></a>> ... <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>/sampling_group</em></a>>
-    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>sampling_group</em></a>> ... <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><em>/sampling_group</em></a>>
+    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>sampling_group</span></a>> ... <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>/sampling_group</span></a>>
+    <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>sampling_group</span></a>> ... <<a class="reference internal" href="reference_elements.html#samplinggroupelement"><span>/sampling_group</span></a>>
     ...
 
-  <<a class="reference internal" href="reference_elements.html#outputelement"><em>/output</em></a>>
+  <<a class="reference internal" href="reference_elements.html#outputelement"><span>/output</span></a>>
 
-<<a class="reference internal" href="reference_elements.html#simulationelement"><em>/simulation</em></a>>
+<<a class="reference internal" href="reference_elements.html#simulationelement"><span>/simulation</span></a>>
 </pre>
 </div>
 
@@ -207,12 +217,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -229,7 +239,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -241,14 +251,14 @@
         <li class="right" >
           <a href="reference_usefulXMLSyntax.html" title="Useful XML Syntax"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" >Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" >Reference section</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/reference_usefulXMLSyntax.html b/documentation/reference_usefulXMLSyntax.html
index fef0e2e..638d1c9 100644
--- a/documentation/reference_usefulXMLSyntax.html
+++ b/documentation/reference_usefulXMLSyntax.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Useful XML Syntax — XMDS2 2.2.2 documentation</title>
+    <title>Useful XML Syntax — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,13 +25,13 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="up" title="Reference section" href="reference_index.html" />
     <link rel="next" title="XMDS2 XML Schema" href="reference_schema.html" />
     <link rel="prev" title="Configuration, installation and runtime options" href="reference_installation_and_configuration.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -43,15 +43,15 @@
         <li class="right" >
           <a href="reference_installation_and_configuration.html" title="Configuration, installation and runtime options"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" accesskey="U">Reference section</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="useful-xml-syntax">
 <span id="referenceusefulxmlsyntax"></span><h1>Useful XML Syntax<a class="headerlink" href="#useful-xml-syntax" title="Permalink to this headline">¶</a></h1>
@@ -79,12 +79,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -101,7 +101,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -113,14 +113,14 @@
         <li class="right" >
           <a href="reference_installation_and_configuration.html" title="Configuration, installation and runtime options"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li>
-          <li><a href="reference_index.html" >Reference section</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li>
+          <li class="nav-item nav-item-1"><a href="reference_index.html" >Reference section</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/search.html b/documentation/search.html
index a5210c0..b80ecc1 100644
--- a/documentation/search.html
+++ b/documentation/search.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Search — XMDS2 2.2.2 documentation</title>
+    <title>Search — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -26,7 +26,7 @@
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <script type="text/javascript" src="_static/searchtools.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
   <script type="text/javascript">
     jQuery(function() { Search.loadIndex("searchindex.js"); });
   </script>
@@ -35,21 +35,21 @@
    
 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <h1 id="search-documentation">Search</h1>
   <div id="fallback" class="admonition warning">
@@ -78,7 +78,7 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -87,19 +87,19 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/searchindex.js b/documentation/searchindex.js
index 53af04f..3b8b71e 100644
--- a/documentation/searchindex.js
+++ b/documentation/searchindex.js
@@ -1 +1 @@
-Search.setIndex({envversion:42,terms:{orthogon:3,ridden:19,interchang:13,four:[15,13],secondli:[8,9],prefix:[2,3],forget:4,xmds2:[9,14],xmds1:[6,7,2,17],accur:[8,19,3],"const":[15,3],wigner_arguments_mpi:15,openmpi:[4,2],matlab:[6,7,12,2,17],under:[5,15,13,3],slowest:3,worth:8,merchant:13,digit:3,everi:[4,13,16],risk:13,vastli:19,"void":13,vector:[10,9,14,16],terabyt:3,matric:14,readthedoc:16,initialis:[6,4,15,7,14,16,17,18,19,3],number_7:3,direct:[6,17,7,3,4],sourceforg:[5,8,2,16],conse [...]
\ No newline at end of file
+Search.setIndex({envversion:46,filenames:["advanced_topics","bulirschStoer","developer","documentation_toc","faq","index","installation","introduction","licensing","news","news_content","optimisation_hints","reference_elements","reference_index","reference_installation_and_configuration","reference_schema","reference_usefulXMLSyntax","tutorial","upgrade","worked_examples","xsil2graphics2"],objects:{},objnames:{},objtypes:{},terms:{"000000e":[17,19],"05457148e":19,"0e5":19,"10th":[5,9,10] [...]
\ No newline at end of file
diff --git a/documentation/tutorial.html b/documentation/tutorial.html
index 934cc25..7116d43 100644
--- a/documentation/tutorial.html
+++ b/documentation/tutorial.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Quickstart Tutorial — XMDS2 2.2.2 documentation</title>
+    <title>Quickstart Tutorial — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Worked Examples" href="worked_examples.html" />
     <link rel="prev" title="Installation" href="installation.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,14 +42,14 @@
         <li class="right" >
           <a href="installation.html" title="Installation"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="quickstart-tutorial">
 <span id="quickstarttutorial"></span><span id="index-0"></span><h1>Quickstart Tutorial<a class="headerlink" href="#quickstart-tutorial" title="Permalink to this headline">¶</a></h1>
@@ -202,10 +202,10 @@ ListPointPlot3D[ll]
   <span class="nt"></description></span>
 </pre></div>
 </div>
-<p>One of the advantages of an XML format is that these tags are almost entirely self-explanatory.  XMDS2 files follow full XML syntax, so elements can be commented out using the <tt class="docutils literal"><span class="pre"><!--</span></tt> and <tt class="docutils literal"><span class="pre">--></span></tt> brackets, and we have an example of that here.</p>
-<p>The first line, <tt class="docutils literal"><span class="pre"><?xml</span> <span class="pre">...></span></tt>, just specifies the encoding and XML version. It is optional, but its presence helps some text editors perform the correct syntax highlighting.</p>
-<p>The <tt class="docutils literal"><span class="pre"><simulation></span></tt> element is mandatory, and encloses the entire simulation script.</p>
-<p>The <tt class="docutils literal"><span class="pre"><name></span></tt> element is optional, but recommended. It defines the name of the executable program that will be generated, as well as the default name of the output data files (although this can be over-ridden in the <tt class="docutils literal"><span class="pre"><output></span></tt> element if desired). If <tt class="docutils literal"><span class="pre"><name></span></tt> is not present, it will default to the fi [...]
+<p>One of the advantages of an XML format is that these tags are almost entirely self-explanatory.  XMDS2 files follow full XML syntax, so elements can be commented out using the <code class="docutils literal"><span class="pre"><!--</span></code> and <code class="docutils literal"><span class="pre">--></span></code> brackets, and we have an example of that here.</p>
+<p>The first line, <code class="docutils literal"><span class="pre"><?xml</span> <span class="pre">...></span></code>, just specifies the encoding and XML version. It is optional, but its presence helps some text editors perform the correct syntax highlighting.</p>
+<p>The <code class="docutils literal"><span class="pre"><simulation></span></code> element is mandatory, and encloses the entire simulation script.</p>
+<p>The <code class="docutils literal"><span class="pre"><name></span></code> element is optional, but recommended. It defines the name of the executable program that will be generated, as well as the default name of the output data files (although this can be over-ridden in the <code class="docutils literal"><span class="pre"><output></span></code> element if desired). If <code class="docutils literal"><span class="pre"><name></span></code> is not present, it will defau [...]
 <p>The next element we have used can be skipped entirely if you wish to use the default set of features and you don’t want to define any global constants for your simulation.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><features></span>
   <span class="nt"><globals></span>
@@ -218,15 +218,15 @@ ListPointPlot3D[ll]
  <span class="nt"></features></span>
 </pre></div>
 </div>
-<p>The <tt class="docutils literal"><span class="pre"><features></span></tt> element can be used to choose a large number of features that will be discussed later, but here we have only used it to define a <tt class="docutils literal"><span class="pre"><globals></span></tt> element.  This element contains a block of text with <tt class="docutils literal"><span class="pre"><![CDATA[</span></tt> at the start and <tt class="docutils literal"><span class="pre">]]></span></t [...]
-<p>The next element is the essential <tt class="docutils literal"><span class="pre"><geometry></span></tt> element.</p>
+<p>The <code class="docutils literal"><span class="pre"><features></span></code> element can be used to choose a large number of features that will be discussed later, but here we have only used it to define a <code class="docutils literal"><span class="pre"><globals></span></code> element.  This element contains a block of text with <code class="docutils literal"><span class="pre"><![CDATA[</span></code> at the start and <code class="docutils literal"><span class="pre">]] [...]
+<p>The next element is the essential <code class="docutils literal"><span class="pre"><geometry></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><geometry></span>
   <span class="nt"><propagation_dimension></span> t <span class="nt"></propagation_dimension></span>
 <span class="nt"></geometry></span>
 </pre></div>
 </div>
-<p>This element is used to define all the dimensions in the problem.  We only require the time dimension, which we are labelling ‘t’, so this is a trivial example.  We will discuss transverse dimensions in more detail in the next worked example (<a class="reference internal" href="worked_examples.html#nonlinearschrodingerequation"><em>The nonlinear Schrödinger equation</em></a>), where we deal with the integration of a partial differential equation rather than ordinary differ [...]
-<p>Next, we have the <tt class="docutils literal"><span class="pre"><vector></span></tt> element.</p>
+<p>This element is used to define all the dimensions in the problem.  We only require the time dimension, which we are labelling ‘t’, so this is a trivial example.  We will discuss transverse dimensions in more detail in the next worked example (<a class="reference internal" href="worked_examples.html#nonlinearschrodingerequation"><span>The nonlinear Schrödinger equation</span></a>), where we deal with the integration of a partial differential equation rather than ordinary di [...]
+<p>Next, we have the <code class="docutils literal"><span class="pre"><vector></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><vector</span> <span class="na">name=</span><span class="s">"position"</span> <span class="na">type=</span><span class="s">"real"</span><span class="nt">></span>
   <span class="nt"><components></span>
     x y z
@@ -239,8 +239,8 @@ ListPointPlot3D[ll]
 <span class="nt"></vector></span>
 </pre></div>
 </div>
-<p>We can define multiple vectors, but here we only need the variables that we wish to integrate.  We named this vector “position”, as it defines the position in phase space.  These variables are real-valued (as opposed to, say, complex numbers), so we define <tt class="docutils literal"><span class="pre">type="real"</span></tt>.  The <tt class="docutils literal"><span class="pre"><components></span></tt> element defines the names of the elements of this vecto [...]
-<p>Now we come to the heart of the simulation, where we define the evolution of our vector.  This evolution is held in the <tt class="docutils literal"><span class="pre"><sequence></span></tt> element, which contains an ordered sequence of actions upon any defined vectors.  Vectors can be altered with a <tt class="docutils literal"><span class="pre"><filter></span></tt> element, or integrated in the propagation dimension with an <tt class="docutils literal"><span class="pre"> [...]
+<p>We can define multiple vectors, but here we only need the variables that we wish to integrate.  We named this vector “position”, as it defines the position in phase space.  These variables are real-valued (as opposed to, say, complex numbers), so we define <code class="docutils literal"><span class="pre">type="real"</span></code>.  The <code class="docutils literal"><span class="pre"><components></span></code> element defines the names of the elements of th [...]
+<p>Now we come to the heart of the simulation, where we define the evolution of our vector.  This evolution is held in the <code class="docutils literal"><span class="pre"><sequence></span></code> element, which contains an ordered sequence of actions upon any defined vectors.  Vectors can be altered with a <code class="docutils literal"><span class="pre"><filter></span></code> element, or integrated in the propagation dimension with an <code class="docutils literal"><span cl [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><sequence></span>
   <span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"ARK89"</span> <span class="na">interval=</span><span class="s">"20.0"</span> <span class="na">tolerance=</span><span class="s">"1e-7"</span><span class="nt">></span>
     <span class="nt"><samples></span>5000<span class="nt"></samples></span>
@@ -256,9 +256,9 @@ ListPointPlot3D[ll]
 <span class="nt"></sequence></span>
 </pre></div>
 </div>
-<p>Here our sequence consists of a single <tt class="docutils literal"><span class="pre"><integrate></span></tt> element.  It contains several important pieces of information.  At the heart, the <tt class="docutils literal"><span class="pre"><operators></span></tt> element contains the equations of motion as described above, written in a very human-readable fashion.  It also contains an <tt class="docutils literal"><span class="pre"><integration_vectors></span></tt> ele [...]
-<p>All integrate blocks must define which algorithm is to be used - in this case the 8th (embedded 9th) order adaptive Runge-Kutta method, called “ARK89”.  The details of different algorithms will be described later (FIXME: Link!), but for now all we need to know is that this algorithm requires a tolerance, and that smaller means more accurate, so we’ll make it <span class="math">\(10^{-7}\)</span> by setting <tt class="docutils literal"><span class="pre">tolerance=&quo [...]
-<p>The <tt class="docutils literal"><span class="pre"><samples></span></tt> element says that the values of the output groups will be sampled 5000 times during this interval.  The nature of the output is defined in the last element in the simulation: the <tt class="docutils literal"><span class="pre"><output></span></tt> element.</p>
+<p>Here our sequence consists of a single <code class="docutils literal"><span class="pre"><integrate></span></code> element.  It contains several important pieces of information.  At the heart, the <code class="docutils literal"><span class="pre"><operators></span></code> element contains the equations of motion as described above, written in a very human-readable fashion.  It also contains an <code class="docutils literal"><span class="pre"><integration_vectors></span [...]
+<p>All integrate blocks must define which algorithm is to be used - in this case the 8th (embedded 9th) order adaptive Runge-Kutta method, called “ARK89”.  The details of different algorithms will be described later (FIXME: Link!), but for now all we need to know is that this algorithm requires a tolerance, and that smaller means more accurate, so we’ll make it <span class="math">\(10^{-7}\)</span> by setting <code class="docutils literal"><span class="pre">tolerance=&q [...]
+<p>The <code class="docutils literal"><span class="pre"><samples></span></code> element says that the values of the output groups will be sampled 5000 times during this interval.  The nature of the output is defined in the last element in the simulation: the <code class="docutils literal"><span class="pre"><output></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><output</span> <span class="na">format=</span><span class="s">"hdf5"</span> <span class="na">filename=</span><span class="s">"lorenz.xsil"</span><span class="nt">></span>
   <span class="nt"><sampling_group</span> <span class="na">initial_sample=</span><span class="s">"yes"</span><span class="nt">></span>
     <span class="nt"><moments></span>xR yR zR<span class="nt"></moments></span>
@@ -272,21 +272,21 @@ ListPointPlot3D[ll]
 <span class="nt"></output></span>
 </pre></div>
 </div>
-<p>The two top-level arguments in the <tt class="docutils literal"><span class="pre"><output></span></tt> element are “format” and “filename”.  Here we define the output filename, although it would have defaulted to this value.  We also choose the format to be HDF5, which is why the simulation resulted in the binary file “lorenz.h5” as well as “lorenz.xsil”.  If we had instead said <tt class="docutils literal"><span class="pre">format [...]
-<p>The <tt class="docutils literal"><span class="pre"><output></span></tt> element can contain any non-zero number of <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> elements, which specify the entire output of the program.  They allow for subsampling, integration of some or all of the transverse dimensions, and/or conversion of some dimensions into Fourier space, but these will be described in more detail in the following examples.  We have a <tt  [...]
-<p>And that’s it.  This is quite a large framework to integrate three coupled ordinary differential equations, but the advantage of using XMDS2 is that vastly more complicated simulations can be performed without increasing the length or complexity of the XMDS2 script significantly.  The <a class="reference internal" href="worked_examples.html#workedexamples"><em>Worked Examples</em></a> section will provide more complicated examples with stochastic equations and partial differenti [...]
+<p>The two top-level arguments in the <code class="docutils literal"><span class="pre"><output></span></code> element are “format” and “filename”.  Here we define the output filename, although it would have defaulted to this value.  We also choose the format to be HDF5, which is why the simulation resulted in the binary file “lorenz.h5” as well as “lorenz.xsil”.  If we had instead said <code class="docutils literal"><span class="pre"> [...]
+<p>The <code class="docutils literal"><span class="pre"><output></span></code> element can contain any non-zero number of <code class="docutils literal"><span class="pre"><sampling_group></span></code> elements, which specify the entire output of the program.  They allow for subsampling, integration of some or all of the transverse dimensions, and/or conversion of some dimensions into Fourier space, but these will be described in more detail in the following examples.  We hav [...]
+<p>And that’s it.  This is quite a large framework to integrate three coupled ordinary differential equations, but the advantage of using XMDS2 is that vastly more complicated simulations can be performed without increasing the length or complexity of the XMDS2 script significantly.  The <a class="reference internal" href="worked_examples.html#workedexamples"><span>Worked Examples</span></a> section will provide more complicated examples with stochastic equations and partial differ [...]
 </div>
 
 
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -303,7 +303,7 @@ ListPointPlot3D[ll]
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -315,13 +315,13 @@ ListPointPlot3D[ll]
         <li class="right" >
           <a href="installation.html" title="Installation"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/upgrade.html b/documentation/upgrade.html
index 6215818..091ed18 100644
--- a/documentation/upgrade.html
+++ b/documentation/upgrade.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Upgrading From XMDS 1.X — XMDS2 2.2.2 documentation</title>
+    <title>Upgrading From XMDS 1.X — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Optimisation Hints" href="optimisation_hints.html" />
     <link rel="prev" title="Frequently Asked Questions" href="faq.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,18 +42,18 @@
         <li class="right" >
           <a href="faq.html" title="Frequently Asked Questions"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="upgrading-from-xmds-1-x">
 <span id="upgradefromxmds1"></span><h1>Upgrading From XMDS 1.X<a class="headerlink" href="#upgrading-from-xmds-1-x" title="Permalink to this headline">¶</a></h1>
-<p>While <strong>XMDS2</strong> is a complete rewrite of the <strong>XMDS</strong> project, much of the syntax has remained very similar.  That said, your code will have to be rewritten as an XMDS2 program.  We recommend that you work through the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a> and perhaps the <a class="reference internal" href="worked_examples.html#workedexamples"><em>Worked Examples</em></a> sections, and then you s [...]
+<p>While <strong>XMDS2</strong> is a complete rewrite of the <strong>XMDS</strong> project, much of the syntax has remained very similar.  That said, your code will have to be rewritten as an XMDS2 program.  We recommend that you work through the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a> and perhaps the <a class="reference internal" href="worked_examples.html#workedexamples"><span>Worked Examples</span></a> sections, and th [...]
 <p>The main news when switching to XMDS2 is the long list of new things you can do.  If it’s an initial value problem, XMDS2 has a good chance of being able to solve it.</p>
 <p>We have made the decision to call the executables “xmds2” and “xsil2graphics2” so that you can keep using your old installation in parallel with the new version.</p>
 </div>
@@ -62,12 +62,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -84,7 +84,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -96,13 +96,13 @@
         <li class="right" >
           <a href="faq.html" title="Frequently Asked Questions"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/worked_examples.html b/documentation/worked_examples.html
index d7c88ac..05707e1 100644
--- a/documentation/worked_examples.html
+++ b/documentation/worked_examples.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Worked Examples — XMDS2 2.2.2 documentation</title>
+    <title>Worked Examples — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Reference section" href="reference_index.html" />
     <link rel="prev" title="Quickstart Tutorial" href="tutorial.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,27 +42,27 @@
         <li class="right" >
           <a href="tutorial.html" title="Quickstart Tutorial"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="worked-examples">
 <span id="workedexamples"></span><span id="index-0"></span><h1>Worked Examples<a class="headerlink" href="#worked-examples" title="Permalink to this headline">¶</a></h1>
 <p>One of the best ways to learn XMDS2 is to see several illustrative examples.  Here are a set of example scripts and explanations of the code, which will be a good way to get started.  As an instructional aid, they are meant to be read sequentially, but the adventurous could try starting with one that looked like a simulation they wanted to run, and adapt for their own purposes.</p>
 <blockquote>
-<div><p><a class="reference internal" href="#nonlinearschrodingerequation"><em>The nonlinear Schrödinger equation</em></a> (partial differential equation)</p>
-<p><a class="reference internal" href="#kubo"><em>Kubo Oscillator</em></a> (stochastic differential equations)</p>
-<p><a class="reference internal" href="#fibre"><em>Fibre Noise</em></a> (stochastic partial differential equation using parallel processing)</p>
-<p><a class="reference internal" href="#integerdimensionexample"><em>Integer Dimensions</em></a> (integer dimensions)</p>
-<p><a class="reference internal" href="#wignerarguments"><em>Wigner Function</em></a> (two dimensional PDE using parallel processing, passing arguments in at run time)</p>
-<p><a class="reference internal" href="#groundstatebec"><em>Finding the Ground State of a BEC (continuous renormalisation)</em></a> (PDE with continual renormalisation - computed vectors, filters, breakpoints)</p>
-<p><a class="reference internal" href="#hermitegaussgroundstatebec"><em>Finding the Ground State of a BEC again</em></a> (Hermite-Gaussian basis)</p>
-<p><a class="reference internal" href="#dmultistatese"><em>Multi-component Schrödinger equation</em></a> (combined integer and continuous dimensions with matrix multiplication, aliases)</p>
+<div><p><a class="reference internal" href="#nonlinearschrodingerequation"><span>The nonlinear Schrödinger equation</span></a> (partial differential equation)</p>
+<p><a class="reference internal" href="#kubo"><span>Kubo Oscillator</span></a> (stochastic differential equations)</p>
+<p><a class="reference internal" href="#fibre"><span>Fibre Noise</span></a> (stochastic partial differential equation using parallel processing)</p>
+<p><a class="reference internal" href="#integerdimensionexample"><span>Integer Dimensions</span></a> (integer dimensions)</p>
+<p><a class="reference internal" href="#wignerarguments"><span>Wigner Function</span></a> (two dimensional PDE using parallel processing, passing arguments in at run time)</p>
+<p><a class="reference internal" href="#groundstatebec"><span>Finding the Ground State of a BEC (continuous renormalisation)</span></a> (PDE with continual renormalisation - computed vectors, filters, breakpoints)</p>
+<p><a class="reference internal" href="#hermitegaussgroundstatebec"><span>Finding the Ground State of a BEC again</span></a> (Hermite-Gaussian basis)</p>
+<p><a class="reference internal" href="#dmultistatese"><span>Multi-component Schrödinger equation</span></a> (combined integer and continuous dimensions with matrix multiplication, aliases)</p>
 </div></blockquote>
 <p>All of these scripts are available in the included “examples” folder, along with more examples that demonstrate other tricks.  Together, they provide starting points for a huge range of different simulations.</p>
 <div class="section" id="the-nonlinear-schrodinger-equation">
@@ -171,9 +171,9 @@
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>Let us examine the new items in the <tt class="docutils literal"><span class="pre"><features></span></tt> element that we have demonstrated here.  The existence of the <tt class="docutils literal"><span class="pre"><benchmark></span></tt> element causes the simulation to be timed.  The <tt class="docutils literal"><span class="pre"><bing></span></tt> element causes the computer to make a sound upon the conclusion of the simulation.  The <tt class="docutils literal">< [...]
-<p>Finally, we use two tags to make the simulation run faster.  The <tt class="docutils literal"><span class="pre"><auto_vectorise></span></tt> element switches on several loop optimisations that exist in later versions of the GCC compiler.  The <tt class="docutils literal"><span class="pre"><openmp></span></tt> element turns on threaded parallel processing using the OpenMP standard where possible.  These options are not activated by default as they only exist on certain comp [...]
-<p>Let us examine the <tt class="docutils literal"><span class="pre"><geometry></span></tt> element.</p>
+<p>Let us examine the new items in the <code class="docutils literal"><span class="pre"><features></span></code> element that we have demonstrated here.  The existence of the <code class="docutils literal"><span class="pre"><benchmark></span></code> element causes the simulation to be timed.  The <code class="docutils literal"><span class="pre"><bing></span></code> element causes the computer to make a sound upon the conclusion of the simulation.  The <code class="docut [...]
+<p>Finally, we use two tags to make the simulation run faster.  The <code class="docutils literal"><span class="pre"><auto_vectorise></span></code> element switches on several loop optimisations that exist in later versions of the GCC compiler.  The <code class="docutils literal"><span class="pre"><openmp></span></code> element turns on threaded parallel processing using the OpenMP standard where possible.  These options are not activated by default as they only exist on cert [...]
+<p>Let us examine the <code class="docutils literal"><span class="pre"><geometry></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><geometry></span>
     <span class="nt"><propagation_dimension></span> xi <span class="nt"></propagation_dimension></span>
     <span class="nt"><transverse_dimensions></span>
@@ -183,9 +183,9 @@
 </pre></div>
 </div>
 <p>This is the first example that includes a transverse dimension.  We have only one dimension, and we have labelled it “tau”.  It is a continuous dimension, but only defined on a grid containing 128 points (defined with the lattice variable), and on a domain from -6 to 6.  The default is that transforms in continuous dimensions are fast Fourier transforms, which means that this dimension is effectively defined on a loop, and the “tau=-6” and “tau=6” p [...]
-<p>Two vector elements have been defined in this simulation.  One defines the complex-valued wavefunction “phi” that we wish to evolve.  We define the transverse dimensions over which this vector is defined by the <tt class="docutils literal"><span class="pre">dimensions</span></tt> tag in the description.  By default, it is defined over all of the transverse dimensions in the <tt class="docutils literal"><span class="pre"><geometry></span></tt> element, so even though  [...]
-<p>The second vector element contains the component “Gamma” which is a function of the transverse variable tau, as specified in the equation of motion for the field.  This second vector could have been avoided in two ways.  First, the function could have been written explicitly in the integrate block where it is required, but calculating it once and then recalling it from memory is far more efficient.  Second, it could have been included in the “wavefunction” vect [...]
-<p>The <tt class="docutils literal"><span class="pre"><integrate></span></tt> element for a partial differential equation has some new features:</p>
+<p>Two vector elements have been defined in this simulation.  One defines the complex-valued wavefunction “phi” that we wish to evolve.  We define the transverse dimensions over which this vector is defined by the <code class="docutils literal"><span class="pre">dimensions</span></code> tag in the description.  By default, it is defined over all of the transverse dimensions in the <code class="docutils literal"><span class="pre"><geometry></span></code> element, so even [...]
+<p>The second vector element contains the component “Gamma” which is a function of the transverse variable tau, as specified in the equation of motion for the field.  This second vector could have been avoided in two ways.  First, the function could have been written explicitly in the integrate block where it is required, but calculating it once and then recalling it from memory is far more efficient.  Second, it could have been included in the “wavefunction” vect [...]
+<p>The <code class="docutils literal"><span class="pre"><integrate></span></code> element for a partial differential equation has some new features:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><integrate</span> <span class="na">algorithm=</span><span class="s">"ARK45"</span> <span class="na">interval=</span><span class="s">"20.0"</span> <span class="na">tolerance=</span><span class="s">"1e-7"</span><span class="nt">></span>
   <span class="nt"><samples></span>10 100 10<span class="nt"></samples></span>
   <span class="nt"><operators></span>
@@ -204,11 +204,11 @@
 <span class="nt"></integrate></span>
 </pre></div>
 </div>
-<p>There are some trivial changes from the tutorial script, such as the fact that we are using the ARK45 algorithm rather than ARK89.  Higher order algorithms are often better, but not always.  Also, since this script has multiple output groups, we have to specify how many times each of these output groups are sampled in the <tt class="docutils literal"><span class="pre"><samples></span></tt> element, so there are three numbers there.  Besides the vectors that are to be integrated, [...]
-<p>The equation of motion as written in the CDATA block looks almost identical to our desired equation of motion, except for the term based on the second derivative, which introduces an important new concept.  Inside the <tt class="docutils literal"><span class="pre"><operators></span></tt> element, we can define any number of operators.  Operators are used to define functions in the transformed space of each dimension, which in this case is Fourier space.  The derivative of a func [...]
-<p>Operators can be explicit (<tt class="docutils literal"><span class="pre">kind="ex"</span></tt>) or in the interaction picture (<tt class="docutils literal"><span class="pre">kind="ip"</span></tt>).  The interaction picture can be more efficient, but it restricts the possible syntax of the equation of motion.  Safe utilisation of interaction picture operators will be described later, but for now let us emphasise that <strong>explicit operators should be used</stron [...]
+<p>There are some trivial changes from the tutorial script, such as the fact that we are using the ARK45 algorithm rather than ARK89.  Higher order algorithms are often better, but not always.  Also, since this script has multiple output groups, we have to specify how many times each of these output groups are sampled in the <code class="docutils literal"><span class="pre"><samples></span></code> element, so there are three numbers there.  Besides the vectors that are to be integra [...]
+<p>The equation of motion as written in the CDATA block looks almost identical to our desired equation of motion, except for the term based on the second derivative, which introduces an important new concept.  Inside the <code class="docutils literal"><span class="pre"><operators></span></code> element, we can define any number of operators.  Operators are used to define functions in the transformed space of each dimension, which in this case is Fourier space.  The derivative of a  [...]
+<p>Operators can be explicit (<code class="docutils literal"><span class="pre">kind="ex"</span></code>) or in the interaction picture (<code class="docutils literal"><span class="pre">kind="ip"</span></code>).  The interaction picture can be more efficient, but it restricts the possible syntax of the equation of motion.  Safe utilisation of interaction picture operators will be described later, but for now let us emphasise that <strong>explicit operators should be use [...]
 <p>The output of a partial differential equation offers more possibilities than an ordinary differential equation, and we examine some in this example.</p>
-<p>For vectors with transverse dimensions, we can sample functions of the vectors on the full lattice or a subset of the points.  In the <tt class="docutils literal"><span class="pre"><sampling_group></span></tt> element, we must add a string called “basis” that determines the space in which each transverse dimension is to be sampled, optionally followed by the number of points to be sampled in parentheses.  If the number of points is not specified, it will default to a [...]
+<p>For vectors with transverse dimensions, we can sample functions of the vectors on the full lattice or a subset of the points.  In the <code class="docutils literal"><span class="pre"><sampling_group></span></code> element, we must add a string called “basis” that determines the space in which each transverse dimension is to be sampled, optionally followed by the number of points to be sampled in parentheses.  If the number of points is not specified, it will default  [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><sampling_group</span> <span class="na">basis=</span><span class="s">"tau"</span> <span class="na">initial_sample=</span><span class="s">"yes"</span><span class="nt">></span>
   <span class="nt"><moments></span>density<span class="nt"></moments></span>
   <span class="nt"><dependencies></span>wavefunction<span class="nt"></dependencies></span>
@@ -308,17 +308,17 @@
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p id="index-3">The first new item in this script is the <tt class="docutils literal"><span class="pre"><driver></span></tt> element.  This element enables us to change top level management of the simulation.  Without this element, XMDS2 will integrate the stochastic equation as described.  With this element and the option <tt class="docutils literal"><span class="pre">name="multi-path"</span></tt>, it will integrate it multiple times, using different random numbers each  [...]
-<p>In the <tt class="docutils literal"><span class="pre"><features></span></tt> element we have included the <tt class="docutils literal"><span class="pre"><error_check></span></tt> element.  This performs the integration first with the specified number of steps (or with the specified tolerance), and then with twice the number of steps (or equivalently reduced tolerance).  The output then includes the difference between the output variables on the coarse and the fine grids as [...]
-<p id="index-4">We define the stochastic elements in a simulation with the <tt class="docutils literal"><span class="pre"><noise_vector></span></tt> element.</p>
+<p id="index-3">The first new item in this script is the <code class="docutils literal"><span class="pre"><driver></span></code> element.  This element enables us to change top level management of the simulation.  Without this element, XMDS2 will integrate the stochastic equation as described.  With this element and the option <code class="docutils literal"><span class="pre">name="multi-path"</span></code>, it will integrate it multiple times, using different random numbe [...]
+<p>In the <code class="docutils literal"><span class="pre"><features></span></code> element we have included the <code class="docutils literal"><span class="pre"><error_check></span></code> element.  This performs the integration first with the specified number of steps (or with the specified tolerance), and then with twice the number of steps (or equivalently reduced tolerance).  The output then includes the difference between the output variables on the coarse and the fine  [...]
+<p id="index-4">We define the stochastic elements in a simulation with the <code class="docutils literal"><span class="pre"><noise_vector></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><noise_vector</span> <span class="na">name=</span><span class="s">"drivingNoise"</span> <span class="na">dimensions=</span><span class="s">""</span> <span class="na">kind=</span><span class="s">"wiener"</span> <span class="na">type=</span><span class="s">"real"</span> <span class="na">method=</span><span class="s">"dsfmt"</span> <span class="na">seed=</span><sp [...]
  <span class="nt"><components></span>eta<span class="nt"></components></span>
 <span class="nt"></noise_vector></span>
 </pre></div>
 </div>
-<p>This defines a vector that is used like any other, but it will be randomly generated with particular statistics and characteristics rather than initialised.  The name, dimensions and type tags are defined just as for normal vectors.  The names of the components are also defined in the same way.  The noise is defined as a Wiener noise here (<tt class="docutils literal"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">"wiener"</span></tt>), which is a [...]
+<p>This defines a vector that is used like any other, but it will be randomly generated with particular statistics and characteristics rather than initialised.  The name, dimensions and type tags are defined just as for normal vectors.  The names of the components are also defined in the same way.  The noise is defined as a Wiener noise here (<code class="docutils literal"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">"wiener"</span></code>), which  [...]
 <p>We may also define a noise method to choose a non-default pseudo random number generator, and a seed for the random number generator.  Using a seed can be very useful when debugging the behaviour of a simulation, and many compilers have pseudo-random number generators that are superior to the default option (posix).</p>
-<p>The integrate block is using the semi-implicit algorithm (<tt class="docutils literal"><span class="pre">algorithm="SI"</span></tt>), which is a good default choice for stochastic problems, even though it is only second order convergent for deterministic equations.  More will be said about algorithm choice later, but for now we should note that adaptive algorithms based on Runge-Kutta methods are not guaranteed to converge safely for stochastic equations.  This can be partic [...]
+<p>The integrate block is using the semi-implicit algorithm (<code class="docutils literal"><span class="pre">algorithm="SI"</span></code>), which is a good default choice for stochastic problems, even though it is only second order convergent for deterministic equations.  More will be said about algorithm choice later, but for now we should note that adaptive algorithms based on Runge-Kutta methods are not guaranteed to converge safely for stochastic equations.  This can be pa [...]
 <p>We include elements from the noise vector in the equation of motion just as we do for any other vector.  The default SI and Runge-Kutta algorithms converge to the <em>Stratonovich</em> integral.  Ito stochastic equations can be converted to Stratonovich form and vice versa.</p>
 <p>Executing the generated program ‘kubo’ gives slightly different output due to the “multi-path” driver.</p>
 <div class="highlight-none"><div class="highlight"><pre>$ ./kubo
@@ -344,19 +344,19 @@ Time elapsed for simulation is: 2.71 seconds
 </pre></div>
 </div>
 <p>The maximum step error in each moment group is given in absolute terms.  This is the largest difference between the full step integration and the half step integration.  While a single path might be very stochastic:</p>
-<div class="figure align-center">
+<div class="figure align-center" id="id1">
 <img alt="_images/kuboSingle.png" src="_images/kuboSingle.png" />
-<p class="caption">The mean value of the real and imaginary components of the z variable for a single path of the simulation.</p>
+<p class="caption"><span class="caption-text">The mean value of the real and imaginary components of the z variable for a single path of the simulation.</span></p>
 </div>
 <p>The average over multiple paths can be increasingly smooth.</p>
-<div class="figure align-center">
+<div class="figure align-center" id="id2">
 <img alt="_images/kubo10000.png" src="_images/kubo10000.png" />
-<p class="caption">The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation.  It agrees within the standard error with the expected result of <span class="math">\(\exp(-t/2)\)</span>.</p>
+<p class="caption"><span class="caption-text">The mean and standard error of the z variable averaged over 10000 paths, as given by this simulation.  It agrees within the standard error with the expected result of <span class="math">\(\exp(-t/2)\)</span>.</span></p>
 </div>
 </div>
 <div class="section" id="fibre-noise">
 <span id="fibre"></span><span id="index-5"></span><h2>Fibre Noise<a class="headerlink" href="#fibre-noise" title="Permalink to this headline">¶</a></h2>
-<p>This simulation is a stochastic partial differential equation, in which a one-dimensional damped field is subject to a complex noise. This script can be found in <tt class="docutils literal"><span class="pre">examples/fibre.xmds</span></tt>.</p>
+<p>This simulation is a stochastic partial differential equation, in which a one-dimensional damped field is subject to a complex noise. This script can be found in <code class="docutils literal"><span class="pre">examples/fibre.xmds</span></code>.</p>
 <div class="math">
 \[\frac{\partial \psi}{\partial t} = -i \frac{\partial^2 \psi}{\partial x^2} -\gamma \psi+\beta \frac{1}{\sqrt{2}}\left(\eta_1(x)+i\eta_2(x)\right)\]</div>
 <p>where the noise terms <span class="math">\(\eta_j(x,t)\)</span> are Wiener differentials and the equation is interpreted as a Stratonovich differential equation.  On a finite grid, these increments have variance <span class="math">\(\frac{1}{\Delta x \Delta t}\)</span>.</p>
@@ -432,8 +432,8 @@ Time elapsed for simulation is: 2.71 seconds
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>Note that the noise vector used in this example is complex-valued, and has the argument <tt class="docutils literal"><span class="pre">dimensions="x"</span></tt> to define it as a field of delta-correlated noises along the x-dimension.</p>
-<span class="target" id="index-6"></span><p id="index-7">This simulation demonstrates the ease with which XMDS2 can be used in a parallel processing environment.  Instead of using the stochastic driver “multi-path”, we simply replace it with “mpi-multi-path”.  This instructs XMDS2 to write a parallel version of the program based on the widespread <a class="reference external" href="http://www.open-mpi.org/">MPI standard</a>.  This protocol allows multiple processo [...]
+<p>Note that the noise vector used in this example is complex-valued, and has the argument <code class="docutils literal"><span class="pre">dimensions="x"</span></code> to define it as a field of delta-correlated noises along the x-dimension.</p>
+<span class="target" id="index-6"></span><p id="index-7">This simulation demonstrates the ease with which XMDS2 can be used in a parallel processing environment.  Instead of using the stochastic driver “multi-path”, we simply replace it with “mpi-multi-path”.  This instructs XMDS2 to write a parallel version of the program based on the widespread <a class="reference external" href="http://www.open-mpi.org/">MPI standard</a>.  This protocol allows multiple processo [...]
 <p>Executing this program is slightly different with the MPI option.  The details can change between MPI implementations, but as an example:</p>
 <div class="highlight-none"><div class="highlight"><pre>$xmds2 fibre.xmds
 xmds2 version 2.1 "Happy Mollusc" (r2543)
@@ -477,14 +477,14 @@ Time elapsed for simulation is: 20.99 seconds
 <div class="math">
 \[\langle |\psi(k,t)|^2 \rangle = \exp(-2\gamma t)|\psi(k,0)|^2 +\frac{\beta^2 L_x}{4\pi \gamma} \left(1-\exp(-2\gamma t)\right)\]</div>
 <p>where <span class="math">\(L_x\)</span> is the length of the x domain.  We see that a single integration of these equations is quite chaotic:</p>
-<div class="figure align-center">
+<div class="figure align-center" id="id3">
 <img alt="_images/fibreSingle.png" src="_images/fibreSingle.png" />
-<p class="caption">The momentum space density of the field as a function of time for a single path realisation.</p>
+<p class="caption"><span class="caption-text">The momentum space density of the field as a function of time for a single path realisation.</span></p>
 </div>
-<p>while an average of 1024 paths (change <tt class="docutils literal"><span class="pre">paths="8"</span></tt> to <tt class="docutils literal"><span class="pre">paths="1024"</span></tt> in the <tt class="docutils literal"><span class="pre"><driver></span></tt> element) converges nicely to the analytic solution:</p>
-<div class="figure align-center">
+<p>while an average of 1024 paths (change <code class="docutils literal"><span class="pre">paths="8"</span></code> to <code class="docutils literal"><span class="pre">paths="1024"</span></code> in the <code class="docutils literal"><span class="pre"><driver></span></code> element) converges nicely to the analytic solution:</p>
+<div class="figure align-center" id="id4">
 <img alt="_images/fibre1024.png" src="_images/fibre1024.png" />
-<p class="caption">The momentum space density of the field as a function of time for an average of 1024 paths.</p>
+<p class="caption"><span class="caption-text">The momentum space density of the field as a function of time for an average of 1024 paths.</span></p>
 </div>
 </div>
 <div class="section" id="integer-dimensions">
@@ -552,14 +552,14 @@ Time elapsed for simulation is: 20.99 seconds
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>The first extra feature we have used in this script is the <tt class="docutils literal"><span class="pre"><diagnostics></span></tt> element.  It performs run-time checking that our generated code does not accidentally attempt to access a part of our vector that does not exist.  Removing this tag will increase the speed of the simulation, but its presence helps catch coding errors.</p>
+<p>The first extra feature we have used in this script is the <code class="docutils literal"><span class="pre"><diagnostics></span></code> element.  It performs run-time checking that our generated code does not accidentally attempt to access a part of our vector that does not exist.  Removing this tag will increase the speed of the simulation, but its presence helps catch coding errors.</p>
 <p>The simulation defines a vector with a single transverse dimension labelled “j”, of type “integer” (“int” and “long” can also be used as synonyms for “integer”).  In the absence of an explicit type, the dimension is assumed to be real-valued.  The dimension has a “domain” argument as normal, defining the minimum and maximum values of the dimension’s range.  The lattice element, if specified, is used as a che [...]
-<p>Integer-valued dimensions can be called non-locally.  Real-valued dimensions are typically coupled non-locally only through local operations in the transformed space of the dimension, but can be called non-locally in certain other situations as described in <a class="reference internal" href="reference_elements.html#referencingnonlocal"><em>the reference</em></a>.  The syntax for calling integer dimensions non-locally can be seen in the initialisation CDATA block:</p>
+<p>Integer-valued dimensions can be called non-locally.  Real-valued dimensions are typically coupled non-locally only through local operations in the transformed space of the dimension, but can be called non-locally in certain other situations as described in <a class="reference internal" href="reference_elements.html#referencingnonlocal"><span>the reference</span></a>.  The syntax for calling integer dimensions non-locally can be seen in the initialisation CDATA block:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre>x = 1.0e-3;
 x(j => 0) = 1.0;
 </pre></div>
 </div>
-<p>where the syntax <tt class="docutils literal"><span class="pre">x(j</span> <span class="pre">=></span> <span class="pre">0)</span></tt> is used to reference the variable <span class="math">\(x_0\)</span> directly.  We see a more elaborate example in the integrate CDATA block:</p>
+<p>where the syntax <code class="docutils literal"><span class="pre">x(j</span> <span class="pre">=></span> <span class="pre">0)</span></code> is used to reference the variable <span class="math">\(x_0\)</span> directly.  We see a more elaborate example in the integrate CDATA block:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre>dx_dt(j => j) = x(j => j)*(x(j => j_minus_one) - x(j => j_plus_one));
 </pre></div>
 </div>
@@ -575,7 +575,7 @@ x(j => 0) = 1.0;
 &\phantom{=\Bigg[} - \frac{U_{int}}{16 \hbar}\left(x\left(\frac{\partial^3}{\partial x^2 \partial y}
 +\frac{\partial^3}{\partial y^3}\right)-y\left(\frac{\partial^3}{\partial y^2 \partial x}+\frac{\partial^3}{\partial x^3}\right)\right)\Bigg]W(x,y,t)
 \end{split}\end{split}\]</div>
-<p>with the added restriction that the derivative is forced to zero outside a certain radius.  This extra condition helps maintain the long-term stability of the integration. The script can be found in <tt class="docutils literal"><span class="pre">examples/wigner_arguments_mpi.xmds</span></tt> under your XMDS2 installation directory.</p>
+<p>with the added restriction that the derivative is forced to zero outside a certain radius.  This extra condition helps maintain the long-term stability of the integration. The script can be found in <code class="docutils literal"><span class="pre">examples/wigner_arguments_mpi.xmds</span></code> under your XMDS2 installation directory.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
   <span class="nt"><name></span>wigner<span class="nt"></name></span>
   <span class="nt"><author></span>Graham Dennis and Joe Hope<span class="nt"></author></span>
@@ -677,7 +677,7 @@ x(j => 0) = 1.0;
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<span class="target" id="index-9"></span><p id="index-10">This example demonstrates two new features of XMDS2.  The first is the use of parallel processing for a deterministic problem.  The FFTW library only allows MPI processing of multidimensional vectors.  For multidimensional simulations, the generated program can be parallelised simply by adding the <tt class="docutils literal"><span class="pre">name="distributed-mpi"</span></tt> argument to the <tt class="docutils literal [...]
+<span class="target" id="index-9"></span><p id="index-10">This example demonstrates two new features of XMDS2.  The first is the use of parallel processing for a deterministic problem.  The FFTW library only allows MPI processing of multidimensional vectors.  For multidimensional simulations, the generated program can be parallelised simply by adding the <code class="docutils literal"><span class="pre">name="distributed-mpi"</span></code> argument to the <code class="docutils l [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre>$ xmds2 wigner_argument_mpi.xmds
 xmds2 version 2.1 "Happy Mollusc" (r2680)
 Copyright 2000-2012 Graham Dennis, Joseph Hope, Mattias Johnsson
@@ -701,7 +701,7 @@ Current timestep: 4.543131e-06
 </pre></div>
 </div>
 <p>The possible acceleration achievable when parallelising a given simulation depends on a great many things including available memory and cache.  As a general rule, it will improve as the simulation size gets larger, but the easiest way to find out is to test.  The optimum speed up is obviously proportional to the number of available processing cores.</p>
-<p id="index-11">The second new feature in this simulation is the <tt class="docutils literal"><span class="pre"><arguments></span></tt> element in the <tt class="docutils literal"><span class="pre"><features></span></tt> block.  This is a way of specifying global variables with a given type that can then be input at run time.  The variables are specified in a self explanatory way</p>
+<p id="index-11">The second new feature in this simulation is the <code class="docutils literal"><span class="pre"><arguments></span></code> element in the <code class="docutils literal"><span class="pre"><features></span></code> block.  This is a way of specifying global variables with a given type that can then be input at run time.  The variables are specified in a self explanatory way</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><arguments></span>
   <span class="nt"><argument</span> <span class="na">name=</span><span class="s">"omega"</span> <span class="na">type=</span><span class="s">"real"</span> <span class="na">default_value=</span><span class="s">"0.0"</span> <span class="nt">/></span>
     ...
@@ -709,7 +709,7 @@ Current timestep: 4.543131e-06
 <span class="nt"></arguments></span>
 </pre></div>
 </div>
-<p>where the “default_value” is used as the valuable of the variable if no arguments are given.  In the absence of the generating script, the program can document its options with the <tt class="docutils literal"><span class="pre">--help</span></tt> argument:</p>
+<p>where the “default_value” is used as the valuable of the variable if no arguments are given.  In the absence of the generating script, the program can document its options with the <code class="docutils literal"><span class="pre">--help</span></code> argument:</p>
 <div class="highlight-none"><div class="highlight"><pre>$ ./wigner --help
 Usage: wigner --omega <real> --alpha_0 <real> --absorb <real> --width <real> --Uint_hbar <real>
 
@@ -770,7 +770,7 @@ Variables that can be specified on the command line:
 <div class="math">
 \[\frac{\partial \phi}{\partial t} = \left[\frac{1}{2}\frac{\partial^2}{\partial y^2} - V(y) - U_{int}|\phi|^2\right]\phi\]</div>
 <p>but we will need to use new XMDS2 features to manage the normalisation of the function <span class="math">\(\phi(y,t)\)</span>.  The normalisation for a non-linear Schrödinger equation is given by <span class="math">\(\int dy |\phi(y,t)|^2 = N_{particles}\)</span>, where <span class="math">\(N_{particles}\)</span> is the number of particles described by the wavefunction.</p>
-<p>The code for this simulation can be found in <tt class="docutils literal"><span class="pre">examples/groundstate_workedexamples.xmds</span></tt>:</p>
+<p>The code for this simulation can be found in <code class="docutils literal"><span class="pre">examples/groundstate_workedexamples.xmds</span></code>:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
   <span class="nt"><name></span>groundstate<span class="nt"></name></span>
   <span class="nt"><author></span>Joe Hope<span class="nt"></author></span>
@@ -899,9 +899,9 @@ Variables that can be specified on the command line:
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>We have used the <tt class="docutils literal"><span class="pre">plan="exhaustive"</span></tt> option in the <tt class="docutils literal"><span class="pre"><fftw></span></tt> element to ensure that the absolute fastest transform method is found.  Because the FFTW package stores the results of its tests (by default in the ~/.xmds/wisdom directory), this option does not cause significant computational overhead, except perhaps on the very first run of a new program.</p>
-<p id="index-13">This simulation introduces the first example of a very powerful feature in XMDS2: the <tt class="docutils literal"><span class="pre"><computed_vector></span></tt> element.  This has syntax like any other vector, including possible dependencies on other vectors, and an ability to be used in any element that can use vectors.  The difference is that, much like noise vectors, computed vectors are recalculated each time they are required.  This means that a computed vec [...]
-<p>The difference between a computed vector and a stored vector is emphasised by the replacement of the <tt class="docutils literal"><span class="pre"><initialisation></span></tt> element with an <tt class="docutils literal"><span class="pre"><evaluation></span></tt> element.  Apart from the name, they have virtually identical purpose and syntax.</p>
+<p>We have used the <code class="docutils literal"><span class="pre">plan="exhaustive"</span></code> option in the <code class="docutils literal"><span class="pre"><fftw></span></code> element to ensure that the absolute fastest transform method is found.  Because the FFTW package stores the results of its tests (by default in the ~/.xmds/wisdom directory), this option does not cause significant computational overhead, except perhaps on the very first run of a new program.</p>
+<p id="index-13">This simulation introduces the first example of a very powerful feature in XMDS2: the <code class="docutils literal"><span class="pre"><computed_vector></span></code> element.  This has syntax like any other vector, including possible dependencies on other vectors, and an ability to be used in any element that can use vectors.  The difference is that, much like noise vectors, computed vectors are recalculated each time they are required.  This means that a computed [...]
+<p>The difference between a computed vector and a stored vector is emphasised by the replacement of the <code class="docutils literal"><span class="pre"><initialisation></span></code> element with an <code class="docutils literal"><span class="pre"><evaluation></span></code> element.  Apart from the name, they have virtually identical purpose and syntax.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><computed_vector</span> <span class="na">name=</span><span class="s">"normalisation"</span> <span class="na">dimensions=</span><span class="s">""</span> <span class="na">type=</span><span class="s">"real"</span><span class="nt">></span>
   <span class="nt"><components></span> Ncalc <span class="nt"></components></span>
   <span class="nt"><evaluation></span>
@@ -914,8 +914,8 @@ Variables that can be specified on the command line:
 <span class="nt"></computed_vector></span>
 </pre></div>
 </div>
-<p>Here, our computed vector has no transverse dimensions and depends on the components of “wavefunction”, so the extra transverse dimensions are integrated out.  This code therefore integrates the square modulus of the field, and returns it in the variable “Ncalc”.  This will be used below to renormalise the “phi” field.  Before we examine that process, we have to introduce the <tt class="docutils literal"><span class="pre"><filter></span></tt>  [...]
-<p>The <tt class="docutils literal"><span class="pre"><filter></span></tt> element can be placed in the <tt class="docutils literal"><span class="pre"><sequence></span></tt> element, or inside <tt class="docutils literal"><span class="pre"><integrate></span></tt> elements as we will see next.  Elements placed in the <tt class="docutils literal"><span class="pre"><sequence></span></tt> element are executed in the order they are found in the .xmds file.  Filter elem [...]
+<p>Here, our computed vector has no transverse dimensions and depends on the components of “wavefunction”, so the extra transverse dimensions are integrated out.  This code therefore integrates the square modulus of the field, and returns it in the variable “Ncalc”.  This will be used below to renormalise the “phi” field.  Before we examine that process, we have to introduce the <code class="docutils literal"><span class="pre"><filter></span></co [...]
+<p>The <code class="docutils literal"><span class="pre"><filter></span></code> element can be placed in the <code class="docutils literal"><span class="pre"><sequence></span></code> element, or inside <code class="docutils literal"><span class="pre"><integrate></span></code> elements as we will see next.  Elements placed in the <code class="docutils literal"><span class="pre"><sequence></span></code> element are executed in the order they are found in the .xmds fi [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><filter></span>
   <span class="cp"><![CDATA[</span>
     <span class="n">printf</span><span class="p">(</span><span class="s">"Hello world from a filter segment!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
@@ -923,7 +923,7 @@ Variables that can be specified on the command line:
 <span class="nt"></filter></span>
 </pre></div>
 </div>
-<p>This filter block merely prints a string into the output when the generated program is run.  If the <tt class="docutils literal"><span class="pre"><filter></span></tt> element contains dependencies, then the variables defined in those vectors (or computed vectors, or noise vectors) will be available, and the CDATA block will be placed inside loops that run over all the transverse dimensions used by the included vectors.  The second filter block in this example depends on both th [...]
+<p>This filter block merely prints a string into the output when the generated program is run.  If the <code class="docutils literal"><span class="pre"><filter></span></code> element contains dependencies, then the variables defined in those vectors (or computed vectors, or noise vectors) will be available, and the CDATA block will be placed inside loops that run over all the transverse dimensions used by the included vectors.  The second filter block in this example depends on bot [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><filter></span>
     <span class="nt"><dependencies></span>normalisation wavefunction<span class="nt"></dependencies></span>
   <span class="cp"><![CDATA[</span>
@@ -933,7 +933,7 @@ Variables that can be specified on the command line:
 </pre></div>
 </div>
 <p>Since this filter depends on a vector with the transverse dimension “y”, this filter will execute for each point in “y”.  This code multiplies the value of the field “phi” by the factor required to produce a normalised function in the sense that  <span class="math">\(\int dy |\phi(y,t)|^2 = N_{particles}\)</span>.</p>
-<p>The next usage of a <tt class="docutils literal"><span class="pre"><filter></span></tt> element in this program is inside the <tt class="docutils literal"><span class="pre"><integrate></span></tt> element, where all filters are placed inside a <tt class="docutils literal"><span class="pre"><filters></span></tt> element.</p>
+<p>The next usage of a <code class="docutils literal"><span class="pre"><filter></span></code> element in this program is inside the <code class="docutils literal"><span class="pre"><integrate></span></code> element, where all filters are placed inside a <code class="docutils literal"><span class="pre"><filters></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><filters</span> <span class="na">where=</span><span class="s">"step end"</span><span class="nt">></span>
   <span class="nt"><filter></span>
     <span class="nt"><dependencies></span>wavefunction normalisation<span class="nt"></dependencies></span>
@@ -945,33 +945,33 @@ Variables that can be specified on the command line:
 <span class="nt"></filters></span>
 </pre></div>
 </div>
-<p>Filters placed in an integration block are applied each integration step.  The “where” flag is used to determine whether the filter should be applied directly before or directly after each integration step.  The default value for the where flag is <tt class="docutils literal"><span class="pre">where="step</span> <span class="pre">start"</span></tt>, but in this case we chose “step end” to make sure that the final output was normalised after the last i [...]
-<p>At the end of the sequence element we introduce the <tt class="docutils literal"><span class="pre"><breakpoint></span></tt> element.  This serves two purposes.  The first is a simple matter of convenience.  Often when we manage our input and output from a simulation, we are interested solely in storing the exact state of our integration vectors.  A breakpoint element does exactly that, storing the components of any vectors contained within, taking all the normal options of the < [...]
+<p>Filters placed in an integration block are applied each integration step.  The “where” flag is used to determine whether the filter should be applied directly before or directly after each integration step.  The default value for the where flag is <code class="docutils literal"><span class="pre">where="step</span> <span class="pre">start"</span></code>, but in this case we chose “step end” to make sure that the final output was normalised after the la [...]
+<p>At the end of the sequence element we introduce the <code class="docutils literal"><span class="pre"><breakpoint></span></code> element.  This serves two purposes.  The first is a simple matter of convenience.  Often when we manage our input and output from a simulation, we are interested solely in storing the exact state of our integration vectors.  A breakpoint element does exactly that, storing the components of any vectors contained within, taking all the normal options of t [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><breakpoint</span> <span class="na">filename=</span><span class="s">"groundstate_break.xsil"</span><span class="nt">></span>
   <span class="nt"><dependencies</span> <span class="na">basis=</span><span class="s">"ky"</span><span class="nt">></span>wavefunction<span class="nt"></dependencies></span>
 <span class="nt"></breakpoint></span>
 </pre></div>
 </div>
-<p>If the filename argument is omitted, the output filenames are numbered sequentially.  Any given <tt class="docutils literal"><span class="pre"><breakpoint></span></tt> element must only depend on vectors with identical dimensions.</p>
+<p>If the filename argument is omitted, the output filenames are numbered sequentially.  Any given <code class="docutils literal"><span class="pre"><breakpoint></span></code> element must only depend on vectors with identical dimensions.</p>
 <p>This program begins with a very crude guess to the ground state, but it rapidly converges to the lowest eigenstate.</p>
-<div class="figure align-center">
+<div class="figure align-center" id="id5">
 <img alt="_images/groundstateU2.png" src="_images/groundstateU2.png" />
-<p class="caption">The shape of the ground state rapidly approaches the lowest eigenstate.  For weak nonlinearities, it is nearly Gaussian.</p>
+<p class="caption"><span class="caption-text">The shape of the ground state rapidly approaches the lowest eigenstate.  For weak nonlinearities, it is nearly Gaussian.</span></p>
 </div>
-<div class="figure align-center">
+<div class="figure align-center" id="id6">
 <img alt="_images/groundstateU20.png" src="_images/groundstateU20.png" />
-<p class="caption">When the nonlinear term is larger (<span class="math">\(U=20\)</span>), the ground state is wider and more parabolic.</p>
+<p class="caption"><span class="caption-text">When the nonlinear term is larger (<span class="math">\(U=20\)</span>), the ground state is wider and more parabolic.</span></p>
 </div>
 </div>
 <div class="section" id="finding-the-ground-state-of-a-bec-again">
 <span id="hermitegaussgroundstatebec"></span><h2>Finding the Ground State of a BEC again<a class="headerlink" href="#finding-the-ground-state-of-a-bec-again" title="Permalink to this headline">¶</a></h2>
-<p>Here we repeat the same simulation as in the <a class="reference internal" href="#groundstatebec"><em>Finding the Ground State of a BEC (continuous renormalisation)</em></a> example, using a different transform basis.  While spectral methods are very effective, and Fourier transforms are typically very efficient due to the Fast Fourier transform algorithm, it is often desirable to describe nonlocal evolution in bases other than the Fourier basis.  The previous calculation was the Schr [...]
+<p>Here we repeat the same simulation as in the <a class="reference internal" href="#groundstatebec"><span>Finding the Ground State of a BEC (continuous renormalisation)</span></a> example, using a different transform basis.  While spectral methods are very effective, and Fourier transforms are typically very efficient due to the Fast Fourier transform algorithm, it is often desirable to describe nonlocal evolution in bases other than the Fourier basis.  The previous calculation was the  [...]
 <div class="math">
 \[\left[-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\right]\phi_n(x) = E_n \phi_n(x)\]</div>
 <p>where</p>
 <div class="math">
 \[\phi_n(x,t) = \sqrt{\frac{1}{2^n n!}} \left(\frac{m \omega}{\hbar \pi}\right)^\frac{1}{4} e^{-\frac{m \omega x^2}{2\hbar}} H_n\left(\sqrt{\frac{m \omega}{\hbar}x}\right),\;\;\;\;\;\;E_n = \left(n+\frac{1}{2}\right) \omega\]</div>
-<p>where <span class="math">\(H_n(u)\)</span> are the physicist’s version of the Hermite polynomials.  Rather than describing the derivatives as diagonal terms in Fourier space, we therefore have the option of describing the entire <span class="math">\(-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\)</span> term as a diagonal term in the Hermite-Gaussian basis.  Here is an XMDS2 simulation that performs the integration in this basis. The following is a  [...]
+<p>where <span class="math">\(H_n(u)\)</span> are the physicist’s version of the Hermite polynomials.  Rather than describing the derivatives as diagonal terms in Fourier space, we therefore have the option of describing the entire <span class="math">\(-\frac{\hbar}{2 m}\frac{\partial^2}{\partial x^2} + \frac{1}{2}\omega^2 x^2\)</span> term as a diagonal term in the Hermite-Gaussian basis.  Here is an XMDS2 simulation that performs the integration in this basis. The following is a  [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><simulation</span> <span class="na">xmds-version=</span><span class="s">"2"</span><span class="nt">></span>
   <span class="nt"><name></span>hermitegauss_groundstate<span class="nt"></name></span>
   <span class="nt"><author></span>Graham Dennis<span class="nt"></author></span>
@@ -1085,12 +1085,12 @@ Variables that can be specified on the command line:
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p>The major difference in this simulation code, aside from the switch back from dimensionless units, is the new transverse dimension type in the <tt class="docutils literal"><span class="pre"><geometry></span></tt> element.</p>
+<p>The major difference in this simulation code, aside from the switch back from dimensionless units, is the new transverse dimension type in the <code class="docutils literal"><span class="pre"><geometry></span></code> element.</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><dimension</span> <span class="na">name=</span><span class="s">"x"</span> <span class="na">lattice=</span><span class="s">"100"</span> <span class="na">length_scale=</span><span class="s">"sqrt(hbar/(M*omegarho))"</span> <span class="na">transform=</span><span class="s">"hermite-gauss"</span> <span class="nt">/></span>
 </pre></div>
 </div>
-<p>We have explicitly defined the “transform” option, which by default expects the Fourier transform.  The <tt class="docutils literal"><span class="pre">transform="hermite-gauss"</span></tt> option requires the ‘mpmath’ package installed, just as Fourier transforms require the FFTW package to be installed.  The “lattice” option details the number of hermite-Gaussian eigenstates to include, and automatically starts from the zeroth order polyn [...]
-<p>The <tt class="docutils literal"><span class="pre">length_scale="sqrt(hbar/(M*omegarho))"</span></tt> option requires a real number, but since this script defines it in terms of variables, XMDS2 is unable to verify that the resulting function is real-valued at the time of generating the code.  XMDS2 will therefore fail to compile this program without the feature:</p>
+<p>We have explicitly defined the “transform” option, which by default expects the Fourier transform.  The <code class="docutils literal"><span class="pre">transform="hermite-gauss"</span></code> option requires the ‘mpmath’ package installed, just as Fourier transforms require the FFTW package to be installed.  The “lattice” option details the number of hermite-Gaussian eigenstates to include, and automatically starts from the zeroth order p [...]
+<p>The <code class="docutils literal"><span class="pre">length_scale="sqrt(hbar/(M*omegarho))"</span></code> option requires a real number, but since this script defines it in terms of variables, XMDS2 is unable to verify that the resulting function is real-valued at the time of generating the code.  XMDS2 will therefore fail to compile this program without the feature:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><validation</span> <span class="na">kind=</span><span class="s">"run-time"</span> <span class="nt">/></span>
 </pre></div>
 </div>
@@ -1211,7 +1211,7 @@ Variables that can be specified on the command line:
 <span class="nt"></simulation></span>
 </pre></div>
 </div>
-<p id="index-14">The only truly new feature in this script is the “aliases” option on a dimension.  The integer-valued dimension in this script indexes the components of the PDE (in this case only two).  The  <span class="math">\(V_{j k}\)</span> term is required to be a square array of dimension of this number of components.  If we wrote the k-index of <span class="math">\(V_{j k}\)</span> using a separate <tt class="docutils literal"><span class="pre"><dimension></spa [...]
+<p id="index-14">The only truly new feature in this script is the “aliases” option on a dimension.  The integer-valued dimension in this script indexes the components of the PDE (in this case only two).  The  <span class="math">\(V_{j k}\)</span> term is required to be a square array of dimension of this number of components.  If we wrote the k-index of <span class="math">\(V_{j k}\)</span> using a separate <code class="docutils literal"><span class="pre"><dimension></s [...]
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><dimension</span> <span class="na">name=</span><span class="s">"j"</span> <span class="na">type=</span><span class="s">"integer"</span> <span class="na">lattice=</span><span class="s">"2"</span> <span class="na">domain=</span><span class="s">"(0,1)"</span> <span class="na">aliases=</span><span class="s">"k"</span><span class="nt">/></span>
 </pre></div>
 </div>
@@ -1231,7 +1231,7 @@ Variables that can be specified on the command line:
 </pre></div>
 </div>
 <p>Since the output dimensions of the computed vector do not include a “k” index, this index is integrated.  The volume element for this summation is the spacing between neighbouring values of “j”, and since this spacing is one, this integration is just a sum over k, as required.</p>
-<p>This example also demonstrates an optimisation for the IP operators by separating the <span class="math">\(x\)</span> and <span class="math">\(y\)</span> parts of the operator (see <a class="reference internal" href="optimisation_hints.html#optimisingipoperators"><em>Optimising with the Interaction Picture (IP) operator</em></a>).  This gives an approximately 30% speed improvement over the more straightforward implementation:</p>
+<p>This example also demonstrates an optimisation for the IP operators by separating the <span class="math">\(x\)</span> and <span class="math">\(y\)</span> parts of the operator (see <a class="reference internal" href="optimisation_hints.html#optimisingipoperators"><span>Optimising with the Interaction Picture (IP) operator</span></a>).  This gives an approximately 30% speed improvement over the more straightforward implementation:</p>
 <div class="highlight-xpdeint"><div class="highlight"><pre><span class="nt"><operator</span> <span class="na">kind=</span><span class="s">"ip"</span><span class="nt">></span>
   <span class="nt"><operator_names></span>L<span class="nt"></operator_names></span>
   <span class="cp"><![CDATA[</span>
@@ -1243,7 +1243,7 @@ Variables that can be specified on the command line:
 <span class="cp">]]></span>
 </pre></div>
 </div>
-<p>By this point, we have introduced most of the important features in XMDS2.  More details on other transform options and rarely used features can be found in the <a class="reference internal" href="advanced_topics.html#advancedtopics"><em>Advanced Topics</em></a> section.</p>
+<p>By this point, we have introduced most of the important features in XMDS2.  More details on other transform options and rarely used features can be found in the <a class="reference internal" href="advanced_topics.html#advancedtopics"><span>Advanced Topics</span></a> section.</p>
 </div>
 </div>
 
@@ -1251,7 +1251,7 @@ Variables that can be specified on the command line:
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
@@ -1271,7 +1271,7 @@ Variables that can be specified on the command line:
 </li>
 </ul>
 
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -1288,7 +1288,7 @@ Variables that can be specified on the command line:
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -1300,13 +1300,13 @@ Variables that can be specified on the command line:
         <li class="right" >
           <a href="tutorial.html" title="Quickstart Tutorial"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/documentation/xsil2graphics2.html b/documentation/xsil2graphics2.html
index 759344d..b9f46cc 100644
--- a/documentation/xsil2graphics2.html
+++ b/documentation/xsil2graphics2.html
@@ -6,15 +6,15 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>xsil2graphics2 — XMDS2 2.2.2 documentation</title>
+    <title>xsil2graphics2 — XMDS2 2.2.3 documentation</title>
     
-    <link rel="stylesheet" href="_static/default.css" type="text/css" />
+    <link rel="stylesheet" href="_static/classic.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
     
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '2.2.2',
+        VERSION:     '2.2.3',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -25,12 +25,12 @@
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML,http://www.xmds.org/_static/mathjax-use-tex-fonts.js"></script>
     <link rel="shortcut icon" href="_static/xmds_favicon.ico"/>
-    <link rel="top" title="XMDS2 2.2.2 documentation" href="index.html" />
+    <link rel="top" title="XMDS2 2.2.3 documentation" href="index.html" />
     <link rel="next" title="Developer Documentation" href="developer.html" />
     <link rel="prev" title="Optimisation Hints" href="optimisation_hints.html" /> 
   </head>
-  <body>
-    <div class="related">
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -42,18 +42,18 @@
         <li class="right" >
           <a href="optimisation_hints.html" title="Optimisation Hints"
              accesskey="P">previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>  
 
     <div class="document">
       <div class="documentwrapper">
         <div class="bodywrapper">
-          <div class="body">
+          <div class="body" role="main">
             
   <div class="section" id="xsil2graphics2">
 <span id="index-0"></span><span id="id1"></span><h1>xsil2graphics2<a class="headerlink" href="#xsil2graphics2" title="Permalink to this headline">¶</a></h1>
-<p><strong>xsil2graphics2</strong> is a way of converting ”.xsil” files to formats that other programs can read.  The syntax is described in the <a class="reference internal" href="tutorial.html#quickstarttutorial"><em>Quickstart Tutorial</em></a>, and by using the <tt class="docutils literal"><span class="pre">xsil2graphics2</span> <span class="pre">--help</span></tt> option.  It currently can covert any output format for use by Mathematica, MATLAB and Octave.</p>
+<p><strong>xsil2graphics2</strong> is a way of converting ”.xsil” files to formats that other programs can read.  The syntax is described in the <a class="reference internal" href="tutorial.html#quickstarttutorial"><span>Quickstart Tutorial</span></a>, and by using the <code class="docutils literal"><span class="pre">xsil2graphics2</span> <span class="pre">--help</span></code> option.  It currently can covert any output format for use by Mathematica, MATLAB and Octave.</p>
 <p>We recommend HDF5 format instead of the binary format for output and input, as many visualisation tools can already read/write to this format directly.</p>
 </div>
 
@@ -61,12 +61,12 @@
           </div>
         </div>
       </div>
-      <div class="sphinxsidebar">
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
             <p class="logo"><a href="index.html">
               <img class="logo" src="_static/xmds_logo.png" alt="Logo"/>
             </a></p>
-<div id="searchbox" style="display: none">
+<div id="searchbox" style="display: none" role="search">
   <h3>Quick search</h3>
     <form class="search" action="search.html" method="get">
       <input type="text" name="q" />
@@ -83,7 +83,7 @@
       </div>
       <div class="clearer"></div>
     </div>
-    <div class="related">
+    <div class="related" role="navigation" aria-label="related navigation">
       <h3>Navigation</h3>
       <ul>
         <li class="right" style="margin-right: 10px">
@@ -95,13 +95,13 @@
         <li class="right" >
           <a href="optimisation_hints.html" title="Optimisation Hints"
              >previous</a> |</li>
-        <li><a href="index.html">XMDS2 2.2.2 documentation</a> »</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">XMDS2 2.2.3 documentation</a> »</li> 
       </ul>
     </div>
-    <div class="footer">
+    <div class="footer" role="contentinfo">
         © Copyright 2008-2014, Graham Dennis, Joe Hope and Mattias Johnsson. Licensed under the GNU FDL.
-      Last updated on Oct 14, 2014.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2b1.
+      Last updated on Jan 21, 2017.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
 </html>
\ No newline at end of file
diff --git a/examples/groundstate_gaussian.xmds b/examples/groundstate_gaussian.xmds
index 82d7603..0156c64 100644
--- a/examples/groundstate_gaussian.xmds
+++ b/examples/groundstate_gaussian.xmds
@@ -20,7 +20,13 @@
     </transverse_dimensions>
   </geometry>
   
-  <vector name="potential" initial_basis="y" type="complex">
+  <filter name="toplevelfilter">
+    <![CDATA[
+      printf("Hello world from a named filter!\n");
+    ]]>
+  </filter>
+
+   <vector name="potential" initial_basis="y" type="complex">
     <components> V1 </components>
     <initialisation>
       <![CDATA[
@@ -57,10 +63,17 @@
   </computed_vector>
   
   <sequence>
+      <filter name="sequencelevelfilter">
+        <![CDATA[
+          toplevelfilter();
+          normalisy();
+        ]]>
+      </filter>
+  
     <integrate algorithm="RK4" interval="10.0" steps="10000" tolerance="1e-8">
       <samples>50 50 1</samples>
       <filters>
-        <filter>
+        <filter name="normalisy">
           <dependencies>wavefunction normalisation</dependencies>
           <![CDATA[
             // Correct normalisation of the wavefunction
diff --git a/examples/lubrication_equation.xmds b/examples/lubrication_equation.xmds
new file mode 100644
index 0000000..cd58a74
--- /dev/null
+++ b/examples/lubrication_equation.xmds
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<simulation xmds-version="2">
+  <name>le</name>
+
+  <author>Chaojie Mo</author>
+  <description>
+    The program solves the nonlinear lubrication equation. 
+  </description>
+
+  <features>
+      <benchmark />
+      <bing />
+      <fftw plan="patient" />
+
+      <auto_vectorise />
+      <globals>
+          <![CDATA[
+          const double rho = 6;
+          const double mu = 5;
+          const double lambda = 7.2;
+          const double R = 6.0;
+          const double pi = 3.1415926;
+          ]]>
+       </globals>
+     </features>
+
+  <geometry>
+      <propagation_dimension> t </propagation_dimension>
+      <transverse_dimensions>
+        <dimension name="z" lattice="120"  domain="(-30, 30)" transform="dft"/>
+      </transverse_dimensions>
+   </geometry>
+
+  <vector name="hv" type="complex" dimensions="z">
+    <components>h v</components>
+    <initialisation>
+      <![CDATA[
+      h = R-0.01*R*cos(pi*z/60.0);
+      v = 0;
+      ]]>
+    </initialisation>
+  </vector>
+
+  <sequence>
+    <integrate algorithm="ARK89" interval="240.0" tolerance="1e-7">
+      <samples>100</samples>
+      <operators>
+        <integration_vectors>hv</integration_vectors>
+        <operator kind="ex">
+          <operator_names>Lz</operator_names>
+          <![CDATA[
+            Lz = i*kz;
+          ]]>
+        </operator>
+
+        <operator kind="ex">
+          <operator_names>Lzzz</operator_names>
+          <![CDATA[
+            Lzzz = -i*kz*kz*kz;
+          ]]>
+        </operator>
+
+        <operator kind="ex">
+          <operator_names>Lzz</operator_names>
+          <![CDATA[
+            Lzz = -kz*kz;
+          ]]>
+        </operator>
+
+ 
+        <![CDATA[
+          dh_dt = -v*Lz[h] - h*Lz[v]/2.0;
+          dv_dt = -v*Lz[v]  + 3.0*mu/rho/h/h*(2.0*h*Lz[h]*Lz[v]+h*h*Lzz[v]) - lambda/rho*((-Lz[h]*sqrt(1+Lz[h]*Lz[h]) - h*Lz[h]*Lzz[h]/sqrt(1+Lz[h]*Lz[h]))/(h*h*(1+Lz[h]*Lz[h])) - (Lzzz[h]*pow(1+Lz[h]*Lz[h],3.0/2.0)-3.0*Lz[h]*Lzz[h]*Lzz[h]*sqrt(1+Lz[h]*Lz[h]))/pow(1+Lz[h]*Lz[h],3.0));
+        ]]>
+ 
+      </operators>
+    </integrate>
+  </sequence>
+
+  <output>
+      <sampling_group basis="z" initial_sample="yes">
+        <moments>hR hI vR vI</moments>
+        <dependencies>hv</dependencies>
+        <![CDATA[
+          hR = h.Re();
+          hI = h.Im();
+          vR = v.Re();
+          vI = v.Im();
+        ]]>
+      </sampling_group>
+  </output>
+
+</simulation>
+
diff --git a/man/xmds2.1 b/man/xmds2.1
index f1544c2..31d1ef1 100644
--- a/man/xmds2.1
+++ b/man/xmds2.1
@@ -31,7 +31,7 @@ Verbose mode
 .TP
 .BR \-g ", " \-\-debug
 Debug mode. Compiler error messages report errors in the .cc
-file, not the .xmds file. Implies \fB\-\-verbose\fR. Mostly useful when debuging xmds
+file, not the .xmds file. Implies \fB\-\-verbose\fR. Mostly useful when debugging xmds
 code generation.
 .TP
 .BR \-n ", " \-\-no\-compile
diff --git a/setup.py b/setup.py
index 59835a8..483d43e 100755
--- a/setup.py
+++ b/setup.py
@@ -17,7 +17,7 @@ for root, dirs, files in os.walk('xpdeint'):
         packages.append(root.replace(os.sep, '.'))
 
 setup(name="xmds2",
-      version="2.2.2",
+      version="2.2.3",
       description="Stochastic ODE/PDE integrator",
       url="http://xmds.sourceforge.net",
       license="GPLv2",
diff --git a/testsuite/fast/bessel_cosine_evolution.xmds b/testsuite/fast/bessel_cosine_evolution.xmds
index 1bbe138..b5ecb8c 100644
--- a/testsuite/fast/bessel_cosine_evolution.xmds
+++ b/testsuite/fast/bessel_cosine_evolution.xmds
@@ -99,4 +99,4 @@
         ]]>
       </sampling_group>
   </output>
-</simulation>
\ No newline at end of file
+</simulation>
diff --git a/testsuite/fast/bessel_cosine_evolution_expected.h5 b/testsuite/fast/bessel_cosine_evolution_expected.h5
index c59114a..1117c44 100644
Binary files a/testsuite/fast/bessel_cosine_evolution_expected.h5 and b/testsuite/fast/bessel_cosine_evolution_expected.h5 differ
diff --git a/testsuite/fast/bessel_cosine_evolution_expected.xsil b/testsuite/fast/bessel_cosine_evolution_expected.xsil
index 0b41983..fc63c60 100644
--- a/testsuite/fast/bessel_cosine_evolution_expected.xsil
+++ b/testsuite/fast/bessel_cosine_evolution_expected.xsil
@@ -1,8 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<simulation xmds-version="2">
+<?xml version="1.0" ?><simulation xmds-version="2">
   <testing>
-    <input_xsil_file name="bessel_cosine_groundstate_breakpoint_expected.xsil" />
-    <xsil_file name="bessel_cosine_evolution.xsil" expected="bessel_cosine_evolution_expected.xsil" absolute_tolerance="1e-7" relative_tolerance="1e-5" />
+    <input_xsil_file name="bessel_cosine_groundstate_breakpoint_expected.xsil"/>
+    <xsil_file absolute_tolerance="1e10" expected="bessel_cosine_evolution_expected.xsil" name="bessel_cosine_evolution.xsil" relative_tolerance="8e-5"/>
   </testing>
   
   <name>bessel_cosine_evolution</name>
@@ -18,9 +17,9 @@
   </description>
   
   <features>
-    <auto_vectorise />
-    <benchmark />
-    <bing />
+    <auto_vectorise/>
+    <benchmark/>
+    <bing/>
     <globals>
       <![CDATA[
         const real omegaz = 2*M_PI*20;
@@ -44,8 +43,8 @@
   <geometry>
     <propagation_dimension> t </propagation_dimension>
     <transverse_dimensions>
-      <dimension name="z" lattice="32"  domain="(0.0, 1.0e-4)" transform="dct" />
-      <dimension name="r" lattice="32"  domain="(0.0, 1.0e-5)" transform="bessel" />
+      <dimension domain="(0.0, 1.0e-4)" lattice="32" name="z" transform="dct" volume_prefactor="2.0"/>
+      <dimension domain="(0.0, 1.0e-5)" lattice="32" name="r" transform="bessel" volume_prefactor="2.0*M_PI"/>
     </transverse_dimensions>
   </geometry>
   
@@ -73,10 +72,10 @@
   </vector>
   
   <sequence>
-    <integrate algorithm="ARK45" tolerance="1e-6" interval="1e-3">
+    <integrate algorithm="ARK45" interval="1e-3" tolerance="1e-6">
       <samples>10</samples>
       <operators>
-        <operator kind="ip" constant="yes" type="imaginary">
+        <operator constant="yes" kind="ip" type="imaginary">
           <operator_names>T</operator_names>
           <![CDATA[
             T = -i*0.5*hbar/M*(kr*kr + kz*kz);
@@ -91,9 +90,7 @@
     </integrate>
   </sequence>
   <output format="hdf5">
-      <sampling_group initial_sample="no">
-        <dimension name="r" />
-        <dimension name="z" />
+      <sampling_group basis="r z" initial_sample="no">
         <moments>dens</moments>
         <dependencies>wavefunction</dependencies>
         <![CDATA[
@@ -103,7 +100,7 @@
   </output>
 
 <info>
-Script compiled with xpdeint version VERSION_PLACEHOLDER (SUBVERSION_REVISION_PLACEHOLDER)
+Script compiled with XMDS2 version 2.2.2 "XMDS2 is a game of two halves" (r2973)
 See http://www.xmds.org for more information.
 </info>
 
diff --git a/testsuite/geometry/nonlocal_access_multiple_components.xmds b/testsuite/geometry/nonlocal_access_multiple_components.xmds
new file mode 100644
index 0000000..ec71a36
--- /dev/null
+++ b/testsuite/geometry/nonlocal_access_multiple_components.xmds
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<simulation xmds-version="2">
+  <testing>
+    <xsil_file name="nonlocal_access_multiple_components.xsil" expected="nonlocal_access_multiple_components_expected.xsil" absolute_tolerance="1e-7" relative_tolerance="1e-5" />
+  </testing>
+  
+  <name>nonlocal_access_multiple_components</name>
+  <author>Mattias Johnsson</author>
+  <description>
+     Attempted simulation of Keyu's differential equation
+  </description>
+  
+  <features>
+    <benchmark />
+    <!-- <error_check /> -->
+    <bing />
+    <fftw plan="patient" />
+    <halt_non_finite />
+
+    <globals>
+      <![CDATA[
+        const real x0 = -5.0;
+        const real xp0 = 5.0;
+      ]]>
+    </globals>
+  </features>
+  
+  <geometry>
+    <propagation_dimension> t </propagation_dimension>
+    <transverse_dimensions>
+      <dimension name="x" lattice="16"  domain="(-10, 10)"  aliases="xp" />
+    </transverse_dimensions>
+  </geometry>
+  
+  <vector name="main" dimensions="x xp" type="real" >
+    <components> phia phips </components>
+    <initialisation>
+      <![CDATA[
+        phia = 0.0;
+        phips = 0.0;
+      ]]>
+    </initialisation>
+  </vector>
+  
+  <sequence>
+    <integrate algorithm="ARK45" tolerance="1e-5" interval="1" steps="1000">
+      <samples> 10 </samples>
+
+      <operators>
+
+        <integration_vectors> main </integration_vectors>
+        <![CDATA[
+          dphia_dt = phips(x=>x,xp=>x);
+          dphips_dt = 1.0;
+        ]]>
+      </operators>
+
+    </integrate>
+  </sequence>
+  
+  <output>
+
+      <sampling_group basis="x xp" initial_sample="yes">
+        <moments> phiaOut phipsOut </moments>
+        <dependencies> main </dependencies>
+        <![CDATA[
+          phiaOut = phia;
+          phipsOut = phips;
+        ]]>
+      </sampling_group>
+
+  </output>
+</simulation>
diff --git a/testsuite/geometry/nonlocal_access_multiple_components_expected.h5 b/testsuite/geometry/nonlocal_access_multiple_components_expected.h5
new file mode 100644
index 0000000..2bd8e7e
Binary files /dev/null and b/testsuite/geometry/nonlocal_access_multiple_components_expected.h5 differ
diff --git a/testsuite/geometry/nonlocal_access_multiple_components_expected.xsil b/testsuite/geometry/nonlocal_access_multiple_components_expected.xsil
new file mode 100644
index 0000000..84533dd
--- /dev/null
+++ b/testsuite/geometry/nonlocal_access_multiple_components_expected.xsil
@@ -0,0 +1,96 @@
+<?xml version="1.0" ?><simulation xmds-version="2">
+  <testing>
+    <xsil_file absolute_tolerance="1e-7" expected="nonlocal_access_multiple_components_expected.xsil" name="nonlocal_access_multiple_components.xsil" relative_tolerance="1e-5"/>
+  </testing>
+  
+  <name>nonlocal_access_multiple_components</name>
+  <author>Mattias Johnsson</author>
+  <description>
+     Attempted simulation of Keyu's differential equation
+  </description>
+  
+  <features>
+    <benchmark/>
+    <!-- <error_check /> -->
+    <bing/>
+    <fftw plan="patient"/>
+    <halt_non_finite/>
+
+    <globals>
+      <![CDATA[
+        const real x0 = -5.0;
+        const real xp0 = 5.0;
+      ]]>
+    </globals>
+  </features>
+  
+  <geometry>
+    <propagation_dimension> t </propagation_dimension>
+    <transverse_dimensions>
+      <dimension aliases="xp" domain="(-10, 10)" lattice="16" name="x"/>
+    </transverse_dimensions>
+  </geometry>
+  
+  <vector dimensions="x xp" name="main" type="real">
+    <components> phia phips </components>
+    <initialisation>
+      <![CDATA[
+        phia = 0.0;
+        phips = 0.0;
+      ]]>
+    </initialisation>
+  </vector>
+  
+  <sequence>
+    <integrate algorithm="ARK45" interval="1" steps="1000" tolerance="1e-5">
+      <samples> 10 </samples>
+
+      <operators>
+
+        <integration_vectors> main </integration_vectors>
+        <![CDATA[
+          dphia_dt = phips(x=>x,xp=>x);
+          dphips_dt = 1.0;
+        ]]>
+      </operators>
+
+    </integrate>
+  </sequence>
+  
+  <output>
+
+      <sampling_group basis="x xp" initial_sample="yes">
+        <moments> phiaOut phipsOut </moments>
+        <dependencies> main </dependencies>
+        <![CDATA[
+          phiaOut = phia;
+          phipsOut = phips;
+        ]]>
+      </sampling_group>
+
+  </output>
+
+<info>
+Script compiled with XMDS2 version VERSION_PLACEHOLDER (SUBVERSION_REVISION_PLACEHOLDER)
+See http://www.xmds.org for more information.
+</info>
+
+<XSIL Name="moment_group_1">
+  <Param Name="n_independent">3</Param>
+  <Array Name="variables" Type="Text">
+    <Dim>5</Dim>
+    <Stream><Metalink Format="Text" Delimiter=" \n"/>
+t x xp phiaOut phipsOut 
+    </Stream>
+  </Array>
+  <Array Name="data" Type="double">
+    <Dim>11</Dim>
+    <Dim>16</Dim>
+    <Dim>16</Dim>
+    <Dim>5</Dim>
+    <Stream><Metalink Format="HDF5" Type="Remote" Group="/1"/>
+nonlocal_access_multiple_components_expected.h5
+    </Stream>
+  </Array>
+</XSIL>
+</simulation>
diff --git a/xpdeint/CodeParser.py b/xpdeint/CodeParser.py
index b358fcc..7464946 100755
--- a/xpdeint/CodeParser.py
+++ b/xpdeint/CodeParser.py
@@ -151,7 +151,32 @@ def nonlocalDimensionAccessForComponents(components, codeBlock):
     for tokens, start, end in parser.scanString(codeBlock.codeString):
         if tokens.name not in components: continue
         accessDict = {}
-        tokenDict = tokens.access[0].asDict()
+
+        # Note by MTJ:
+        #
+        # The original implementation of the following code was 
+        #
+        # tokenDict = tokens.access[0].asDict()
+        #
+        # The problem is that later versions of pyparsing return different
+        # result strings for the asDict() method compared to earlier ones.
+        # The specific breakage that occurred was between Ubuntu 16.04 (pyparsing 2.0.3)
+        # and Ubuntu 16.10 (pyparsing 2.1.8). The dictionary returned by 
+        # pyparsing 2.1.8 has elements laid out in a different form, which then
+        # breaks later code in this function (specifically 
+        # accessDict[key] = (' '.join(value[0].asList()), value.slice.start) )
+        # 
+        # To fix this, I skip the call to .asDict() and replace it with a simpler 
+        # version of what pyparsing 2.0.3 was doing internally.
+        # This is backwards and forwards compatible for our purposes.
+        # It's not Python 3 safe, though; also the pyparsing people may have changed
+        # their code for good reason. Beware.
+
+        # Addendum by Joe: this occasionally killed us on macOS.  Switching from 
+        #   .iterItems() to .items() seems to fix it though. 
+        
+        tokenDict = dict(tokens.access[0].items())
+
         for key, value in tokenDict.items():
             accessDict[key] = (' '.join(value[0].asList()), value.slice.start)
         results.append((tokens.name, accessDict, slice(start, end)))
diff --git a/xpdeint/Features/Arguments.py b/xpdeint/Features/Arguments.py
index 469f2a7..d9ec7d7 100644
--- a/xpdeint/Features/Arguments.py
+++ b/xpdeint/Features/Arguments.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.13526
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Arguments.tmpl'
+__CHEETAH_genTime__ = 1484975071.209611
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Arguments.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue May 22 16:27:12 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/AsciiFormat.py b/xpdeint/Features/AsciiFormat.py
index ee2db17..d407cd5 100644
--- a/xpdeint/Features/AsciiFormat.py
+++ b/xpdeint/Features/AsciiFormat.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.12765
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/AsciiFormat.tmpl'
+__CHEETAH_genTime__ = 1484975071.200571
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/AsciiFormat.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:42:26 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/AutoVectorise.py b/xpdeint/Features/AutoVectorise.py
index fe1be6f..0124a31 100644
--- a/xpdeint/Features/AutoVectorise.py
+++ b/xpdeint/Features/AutoVectorise.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.088236
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/AutoVectorise.tmpl'
+__CHEETAH_genTime__ = 1484975071.213774
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/AutoVectorise.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Benchmark.py b/xpdeint/Features/Benchmark.py
index f939467..c300cfe 100644
--- a/xpdeint/Features/Benchmark.py
+++ b/xpdeint/Features/Benchmark.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.142942
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Benchmark.tmpl'
+__CHEETAH_genTime__ = 1484975071.218864
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Benchmark.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/BinaryFormat.py b/xpdeint/Features/BinaryFormat.py
index 353e77c..6bdde8b 100644
--- a/xpdeint/Features/BinaryFormat.py
+++ b/xpdeint/Features/BinaryFormat.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.210154
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/BinaryFormat.tmpl'
+__CHEETAH_genTime__ = 1484975071.273359
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/BinaryFormat.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 14 17:42:18 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Bing.py b/xpdeint/Features/Bing.py
index 7ebdef7..36c0e64 100644
--- a/xpdeint/Features/Bing.py
+++ b/xpdeint/Features/Bing.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.208631
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Bing.tmpl'
+__CHEETAH_genTime__ = 1484975071.222325
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Bing.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/CFlags.py b/xpdeint/Features/CFlags.py
index bf7d9f5..34d18d4 100644
--- a/xpdeint/Features/CFlags.py
+++ b/xpdeint/Features/CFlags.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.225695
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/CFlags.tmpl'
+__CHEETAH_genTime__ = 1484975071.255787
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/CFlags.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/ChunkedOutput.py b/xpdeint/Features/ChunkedOutput.py
index 7692daf..0538f24 100644
--- a/xpdeint/Features/ChunkedOutput.py
+++ b/xpdeint/Features/ChunkedOutput.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.239109
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/ChunkedOutput.tmpl'
+__CHEETAH_genTime__ = 1484975071.270118
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/ChunkedOutput.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug  1 11:52:34 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Diagnostics.py b/xpdeint/Features/Diagnostics.py
index 3e38b03..965dd15 100644
--- a/xpdeint/Features/Diagnostics.py
+++ b/xpdeint/Features/Diagnostics.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.286962
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Diagnostics.tmpl'
+__CHEETAH_genTime__ = 1484975071.313475
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Diagnostics.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/ErrorCheck.py b/xpdeint/Features/ErrorCheck.py
index f49578f..969e30a 100644
--- a/xpdeint/Features/ErrorCheck.py
+++ b/xpdeint/Features/ErrorCheck.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.373374
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/ErrorCheck.tmpl'
+__CHEETAH_genTime__ = 1484975071.29573
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/ErrorCheck.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Globals.py b/xpdeint/Features/Globals.py
index 38353e8..3184c3d 100644
--- a/xpdeint/Features/Globals.py
+++ b/xpdeint/Features/Globals.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.304341
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Globals.tmpl'
+__CHEETAH_genTime__ = 1484975071.299779
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Globals.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Feb 22 16:33:31 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/HDF5Format.py b/xpdeint/Features/HDF5Format.py
index dea82b5..6585c80 100644
--- a/xpdeint/Features/HDF5Format.py
+++ b/xpdeint/Features/HDF5Format.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.386303
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/HDF5Format.tmpl'
+__CHEETAH_genTime__ = 1484975071.383431
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/HDF5Format.tmpl'
 __CHEETAH_srcLastModified__ = 'Sun Nov 24 20:15:20 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/HaltNonFinite.py b/xpdeint/Features/HaltNonFinite.py
index 1460d59..69b1023 100644
--- a/xpdeint/Features/HaltNonFinite.py
+++ b/xpdeint/Features/HaltNonFinite.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.366156
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/HaltNonFinite.tmpl'
+__CHEETAH_genTime__ = 1484975071.340251
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/HaltNonFinite.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/MaxIterations.py b/xpdeint/Features/MaxIterations.py
index 11e26ba..f98335c 100644
--- a/xpdeint/Features/MaxIterations.py
+++ b/xpdeint/Features/MaxIterations.py
@@ -32,9 +32,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.395405
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/MaxIterations.tmpl'
+__CHEETAH_genTime__ = 1484975071.326111
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/MaxIterations.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/OpenMP.py b/xpdeint/Features/OpenMP.py
index 605ab5b..a9d97c6 100644
--- a/xpdeint/Features/OpenMP.py
+++ b/xpdeint/Features/OpenMP.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.554493
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/OpenMP.tmpl'
+__CHEETAH_genTime__ = 1484975071.389027
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/OpenMP.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Oct 18 19:50:44 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Output.py b/xpdeint/Features/Output.py
index 64aecaf..2bf550b 100644
--- a/xpdeint/Features/Output.py
+++ b/xpdeint/Features/Output.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.602075
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Output.tmpl'
+__CHEETAH_genTime__ = 1484975071.410333
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Output.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Sep  3 14:15:51 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/OutputFormat.py b/xpdeint/Features/OutputFormat.py
index c9050c4..da54f27 100644
--- a/xpdeint/Features/OutputFormat.py
+++ b/xpdeint/Features/OutputFormat.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.578692
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/OutputFormat.tmpl'
+__CHEETAH_genTime__ = 1484975071.448313
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/OutputFormat.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 29 13:43:25 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -230,7 +230,7 @@ void _close_xsil_file(FILE*& fp)
         #  Find the end tag in a case-insensitive way
         indexForEndTag = VFN(VFN(VFFSL(SL,"expandedInputScript",True),"lower",False)(),"rfind",False)('</simulation>')
         xsilOutputHeader = VFFSL(SL,"expandedInputScript",True)[0:VFFSL(SL,"indexForEndTag",True)]
-        _orig_filter_97044573 = _filter
+        _orig_filter_77565613 = _filter
         _filter = self._CHEETAH__currentFilter = VFFSL(SL,"PrintfSafeFilter",True)(self).filter
         for line in VFN(VFFSL(SL,"xsilOutputHeader",True),"splitlines",False)(): # generated from line 92, col 5
             write(u'''  fprintf(fp, "''')
@@ -249,7 +249,7 @@ void _close_xsil_file(FILE*& fp)
         write(u''')\\n");
   fprintf(fp, "See http://www.xmds.org for more information.\\n");
 ''')
-        _filter = self._CHEETAH__currentFilter = _orig_filter_97044573
+        _filter = self._CHEETAH__currentFilter = _orig_filter_77565613
         # 
         featureOrderingXSILInfo = ['Arguments', 'Stochastic']
         write(u'''  ''')
diff --git a/xpdeint/Features/Stochastic.py b/xpdeint/Features/Stochastic.py
index 4376478..72ccbd7 100644
--- a/xpdeint/Features/Stochastic.py
+++ b/xpdeint/Features/Stochastic.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.589078
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Stochastic.tmpl'
+__CHEETAH_genTime__ = 1484975071.488134
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Stochastic.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug 28 15:52:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/Basis.py b/xpdeint/Features/Transforms/Basis.py
index f6d46ea..9bbddb5 100644
--- a/xpdeint/Features/Transforms/Basis.py
+++ b/xpdeint/Features/Transforms/Basis.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.634602
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/Basis.tmpl'
+__CHEETAH_genTime__ = 1484975071.477601
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/Basis.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Jul  5 16:29:35 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/BesselBasis.py b/xpdeint/Features/Transforms/BesselBasis.py
index a722a7e..d76f263 100644
--- a/xpdeint/Features/Transforms/BesselBasis.py
+++ b/xpdeint/Features/Transforms/BesselBasis.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.624187
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/BesselBasis.tmpl'
+__CHEETAH_genTime__ = 1484975071.497521
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/BesselBasis.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:52:00 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/BesselNeumannTransform.py b/xpdeint/Features/Transforms/BesselNeumannTransform.py
index 2a5f72a..895647c 100644
--- a/xpdeint/Features/Transforms/BesselNeumannTransform.py
+++ b/xpdeint/Features/Transforms/BesselNeumannTransform.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.675892
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/BesselNeumannTransform.tmpl'
+__CHEETAH_genTime__ = 1484975071.499117
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/BesselNeumannTransform.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 28 08:44:05 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/BesselTransform.py b/xpdeint/Features/Transforms/BesselTransform.py
index 071ff98..b016a29 100644
--- a/xpdeint/Features/Transforms/BesselTransform.py
+++ b/xpdeint/Features/Transforms/BesselTransform.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.669284
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/BesselTransform.tmpl'
+__CHEETAH_genTime__ = 1484975071.503213
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/BesselTransform.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:52:00 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/EPBasis.py b/xpdeint/Features/Transforms/EPBasis.py
index 174b11c..443ea26 100644
--- a/xpdeint/Features/Transforms/EPBasis.py
+++ b/xpdeint/Features/Transforms/EPBasis.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.745645
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/EPBasis.tmpl'
+__CHEETAH_genTime__ = 1484975071.534305
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/EPBasis.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/FourierTransformFFTW3.py b/xpdeint/Features/Transforms/FourierTransformFFTW3.py
index 4ee2b96..d25a495 100644
--- a/xpdeint/Features/Transforms/FourierTransformFFTW3.py
+++ b/xpdeint/Features/Transforms/FourierTransformFFTW3.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.820628
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/FourierTransformFFTW3.tmpl'
+__CHEETAH_genTime__ = 1484975071.576725
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/FourierTransformFFTW3.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Jul  5 16:29:35 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.py b/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.py
index 0688170..dd96f11 100644
--- a/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.py
+++ b/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.py
@@ -37,9 +37,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.028882
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.tmpl'
+__CHEETAH_genTime__ = 1484975071.654019
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/FourierTransformFFTW3MPI.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue May 22 16:27:12 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.py b/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.py
index 8711512..da812e1 100644
--- a/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.py
+++ b/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.757965
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.tmpl'
+__CHEETAH_genTime__ = 1484975071.56642
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/FourierTransformFFTW3Threads.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/HermiteGaussEPBasis.py b/xpdeint/Features/Transforms/HermiteGaussEPBasis.py
index e481dcf..6b7d42d 100644
--- a/xpdeint/Features/Transforms/HermiteGaussEPBasis.py
+++ b/xpdeint/Features/Transforms/HermiteGaussEPBasis.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.825637
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/HermiteGaussEPBasis.tmpl'
+__CHEETAH_genTime__ = 1484975071.60533
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/HermiteGaussEPBasis.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.py b/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.py
index e6a3c15..05bf15f 100644
--- a/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.py
+++ b/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.829972
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.tmpl'
+__CHEETAH_genTime__ = 1484975071.661459
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/HermiteGaussFourierEPBasis.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Jul  3 14:24:15 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/HermiteGaussTransform.py b/xpdeint/Features/Transforms/HermiteGaussTransform.py
index 48579ce..6c8016e 100644
--- a/xpdeint/Features/Transforms/HermiteGaussTransform.py
+++ b/xpdeint/Features/Transforms/HermiteGaussTransform.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.869091
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/HermiteGaussTransform.tmpl'
+__CHEETAH_genTime__ = 1484975071.658616
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/HermiteGaussTransform.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:49:57 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.py b/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.py
index 159af83..e0aac4a 100644
--- a/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.py
+++ b/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.85994
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.tmpl'
+__CHEETAH_genTime__ = 1484975071.644868
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/HermiteGaussTwiddleBasis.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Jul  5 16:29:35 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/MMT.py b/xpdeint/Features/Transforms/MMT.py
index 1de2699..efe43da 100644
--- a/xpdeint/Features/Transforms/MMT.py
+++ b/xpdeint/Features/Transforms/MMT.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.903466
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/MMT.tmpl'
+__CHEETAH_genTime__ = 1484975071.673601
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/MMT.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:49:57 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/NoTransformMPI.py b/xpdeint/Features/Transforms/NoTransformMPI.py
index d4ffb2c..ca6d478 100644
--- a/xpdeint/Features/Transforms/NoTransformMPI.py
+++ b/xpdeint/Features/Transforms/NoTransformMPI.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.929159
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/NoTransformMPI.tmpl'
+__CHEETAH_genTime__ = 1484975071.682656
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/NoTransformMPI.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Feb 23 00:45:53 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Transforms/TransformMultiplexer.py b/xpdeint/Features/Transforms/TransformMultiplexer.py
index 334d0f0..ad503a9 100644
--- a/xpdeint/Features/Transforms/TransformMultiplexer.py
+++ b/xpdeint/Features/Transforms/TransformMultiplexer.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.109169
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Transforms/TransformMultiplexer.tmpl'
+__CHEETAH_genTime__ = 1484975071.720635
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Transforms/TransformMultiplexer.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:42:26 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Features/Validation.py b/xpdeint/Features/Validation.py
index 9a5a59d..da67fac 100644
--- a/xpdeint/Features/Validation.py
+++ b/xpdeint/Features/Validation.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234538.979266
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:58 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Features/Validation.tmpl'
+__CHEETAH_genTime__ = 1484975071.706055
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Features/Validation.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Aug 22 16:32:53 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/BesselDimensionRepresentation.py b/xpdeint/Geometry/BesselDimensionRepresentation.py
index baa31de..4481811 100644
--- a/xpdeint/Geometry/BesselDimensionRepresentation.py
+++ b/xpdeint/Geometry/BesselDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.036378
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/BesselDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.731568
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/BesselDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:52:00 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/BesselNeumannDimensionRepresentation.py b/xpdeint/Geometry/BesselNeumannDimensionRepresentation.py
index ae656ba..08986ca 100644
--- a/xpdeint/Geometry/BesselNeumannDimensionRepresentation.py
+++ b/xpdeint/Geometry/BesselNeumannDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.02252
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/BesselNeumannDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.738499
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/BesselNeumannDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 28 08:44:05 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/DimensionRepresentation.py b/xpdeint/Geometry/DimensionRepresentation.py
index 29774c3..cc21314 100644
--- a/xpdeint/Geometry/DimensionRepresentation.py
+++ b/xpdeint/Geometry/DimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.05478
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/DimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.747762
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/DimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue May 22 16:27:12 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/FieldElement.py b/xpdeint/Geometry/FieldElement.py
index 0931978..5fe5490 100644
--- a/xpdeint/Geometry/FieldElement.py
+++ b/xpdeint/Geometry/FieldElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.061874
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/FieldElement.tmpl'
+__CHEETAH_genTime__ = 1484975071.75229
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/FieldElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/GeometryElement.py b/xpdeint/Geometry/GeometryElement.py
index 249297d..e6fa455 100644
--- a/xpdeint/Geometry/GeometryElement.py
+++ b/xpdeint/Geometry/GeometryElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.080814
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/GeometryElement.tmpl'
+__CHEETAH_genTime__ = 1484975071.755831
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/GeometryElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/HermiteGaussDimensionRepresentation.py b/xpdeint/Geometry/HermiteGaussDimensionRepresentation.py
index a2b651b..72477fb 100644
--- a/xpdeint/Geometry/HermiteGaussDimensionRepresentation.py
+++ b/xpdeint/Geometry/HermiteGaussDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.133008
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/HermiteGaussDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.778588
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/HermiteGaussDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Jul 11 19:41:11 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/NonUniformDimensionRepresentation.py b/xpdeint/Geometry/NonUniformDimensionRepresentation.py
index 8b022ef..c2b164a 100644
--- a/xpdeint/Geometry/NonUniformDimensionRepresentation.py
+++ b/xpdeint/Geometry/NonUniformDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.160585
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/NonUniformDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.779476
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/NonUniformDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue May 22 16:27:12 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/SphericalBesselDimensionRepresentation.py b/xpdeint/Geometry/SphericalBesselDimensionRepresentation.py
index 6c36fff..8f621bb 100644
--- a/xpdeint/Geometry/SphericalBesselDimensionRepresentation.py
+++ b/xpdeint/Geometry/SphericalBesselDimensionRepresentation.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.156838
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/SphericalBesselDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.787663
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/SphericalBesselDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 26 20:52:00 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/SplitUniformDimensionRepresentation.py b/xpdeint/Geometry/SplitUniformDimensionRepresentation.py
index c8fe919..96a18a2 100644
--- a/xpdeint/Geometry/SplitUniformDimensionRepresentation.py
+++ b/xpdeint/Geometry/SplitUniformDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.238212
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/SplitUniformDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.881351
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/SplitUniformDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Jul 13 16:21:46 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Geometry/UniformDimensionRepresentation.py b/xpdeint/Geometry/UniformDimensionRepresentation.py
index 320f82e..9de43a7 100644
--- a/xpdeint/Geometry/UniformDimensionRepresentation.py
+++ b/xpdeint/Geometry/UniformDimensionRepresentation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.27518
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Geometry/UniformDimensionRepresentation.tmpl'
+__CHEETAH_genTime__ = 1484975071.810958
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Geometry/UniformDimensionRepresentation.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Jul 13 16:21:46 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/HDF5.py b/xpdeint/HDF5.py
index 19f4d09..a8fbb96 100644
--- a/xpdeint/HDF5.py
+++ b/xpdeint/HDF5.py
@@ -36,9 +36,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.357535
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/HDF5.tmpl'
+__CHEETAH_genTime__ = 1484975071.895736
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/HDF5.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Apr 23 13:26:13 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -308,12 +308,12 @@ mem_stride[''')
             write(u''';
 
 ''')
-            ## START CAPTURE REGION: _92615617 writeLoopContents at line 122, col 5 in the source.
-            _orig_trans_92615617 = trans
-            _wasBuffering_92615617 = self._CHEETAH__isBuffering
+            ## START CAPTURE REGION: _69257830 writeLoopContents at line 122, col 5 in the source.
+            _orig_trans_69257830 = trans
+            _wasBuffering_69257830 = self._CHEETAH__isBuffering
             self._CHEETAH__isBuffering = True
-            trans = _captureCollector_92615617 = DummyTransaction()
-            write = _captureCollector_92615617.response().write
+            trans = _captureCollector_69257830 = DummyTransaction()
+            write = _captureCollector_69257830.response().write
             for offset, componentName in components: # generated from line 123, col 7
                 write(u'''mem_start[''')
                 _v = VFFSL(SL,"dimensionCount",True) # u'${dimensionCount}' on line 124, col 11
@@ -350,13 +350,13 @@ if (dataset_''')
                 if _v is not None: write(_filter(_v, rawExpr=u'${variable.arrayName}')) # from line 138, col 106.
                 write(u''');
 ''')
-            trans = _orig_trans_92615617
+            trans = _orig_trans_69257830
             write = trans.response().write
-            self._CHEETAH__isBuffering = _wasBuffering_92615617 
-            writeLoopContents = _captureCollector_92615617.response().getvalue()
-            del _orig_trans_92615617
-            del _captureCollector_92615617
-            del _wasBuffering_92615617
+            self._CHEETAH__isBuffering = _wasBuffering_69257830 
+            writeLoopContents = _captureCollector_69257830.response().getvalue()
+            del _orig_trans_69257830
+            del _captureCollector_69257830
+            del _wasBuffering_69257830
             # 
             #  Permit the driver to modify the writeLoopContents
             featureOrdering = ['Driver']
diff --git a/xpdeint/MomentGroupElement.py b/xpdeint/MomentGroupElement.py
index 41ee183..9b72ee8 100644
--- a/xpdeint/MomentGroupElement.py
+++ b/xpdeint/MomentGroupElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.32724
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/MomentGroupElement.tmpl'
+__CHEETAH_genTime__ = 1484975071.882794
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/MomentGroupElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 13:11:27 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/ConstantEXOperator.py b/xpdeint/Operators/ConstantEXOperator.py
index e8fe8d6..1058684 100644
--- a/xpdeint/Operators/ConstantEXOperator.py
+++ b/xpdeint/Operators/ConstantEXOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.325718
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/ConstantEXOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.891827
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/ConstantEXOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:43:31 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/ConstantIPOperator.py b/xpdeint/Operators/ConstantIPOperator.py
index c658b24..ad129e3 100644
--- a/xpdeint/Operators/ConstantIPOperator.py
+++ b/xpdeint/Operators/ConstantIPOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.351316
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/ConstantIPOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.904887
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/ConstantIPOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:15 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/CrossPropagationOperator.py b/xpdeint/Operators/CrossPropagationOperator.py
index 3a023fe..c22c0af 100644
--- a/xpdeint/Operators/CrossPropagationOperator.py
+++ b/xpdeint/Operators/CrossPropagationOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.381211
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/CrossPropagationOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.927449
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/CrossPropagationOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/DeltaAOperator.py b/xpdeint/Operators/DeltaAOperator.py
index 2a14f89..adf3495 100644
--- a/xpdeint/Operators/DeltaAOperator.py
+++ b/xpdeint/Operators/DeltaAOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.397398
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/DeltaAOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.918227
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/DeltaAOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:42:26 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/FilterOperator.py b/xpdeint/Operators/FilterOperator.py
index 863001d..dc273fe 100644
--- a/xpdeint/Operators/FilterOperator.py
+++ b/xpdeint/Operators/FilterOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.39523
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/FilterOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.923468
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/FilterOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:42:26 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/FunctionsOperator.py b/xpdeint/Operators/FunctionsOperator.py
index 9387223..82efa20 100644
--- a/xpdeint/Operators/FunctionsOperator.py
+++ b/xpdeint/Operators/FunctionsOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.405071
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/FunctionsOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.931398
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/FunctionsOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/NonConstantEXOperator.py b/xpdeint/Operators/NonConstantEXOperator.py
index 6171440..4c13b86 100644
--- a/xpdeint/Operators/NonConstantEXOperator.py
+++ b/xpdeint/Operators/NonConstantEXOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.436112
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/NonConstantEXOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.945769
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/NonConstantEXOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:43:31 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/NonConstantIPOperator.py b/xpdeint/Operators/NonConstantIPOperator.py
index 978a559..322d3cb 100644
--- a/xpdeint/Operators/NonConstantIPOperator.py
+++ b/xpdeint/Operators/NonConstantIPOperator.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.500089
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/NonConstantIPOperator.tmpl'
+__CHEETAH_genTime__ = 1484975071.951559
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/NonConstantIPOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/Operator.py b/xpdeint/Operators/Operator.py
index a72bae7..d421bce 100644
--- a/xpdeint/Operators/Operator.py
+++ b/xpdeint/Operators/Operator.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.491823
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/Operator.tmpl'
+__CHEETAH_genTime__ = 1484975071.994494
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/Operator.tmpl'
 __CHEETAH_srcLastModified__ = 'Tue Nov 20 11:51:47 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Operators/OperatorContainer.py b/xpdeint/Operators/OperatorContainer.py
index b8e2917..43ebf05 100644
--- a/xpdeint/Operators/OperatorContainer.py
+++ b/xpdeint/Operators/OperatorContainer.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.521221
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/OperatorContainer.tmpl'
+__CHEETAH_genTime__ = 1484975071.969837
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:31 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/OperatorContainer.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Oct  3 21:15:17 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -226,12 +226,12 @@ class OperatorContainer(_OperatorContainer):
             for operatorComponentNumber, (operatorComponentName, operatorComponentVectors) in enumerate(VFN(VFFSL(SL,"ipOperator.operatorComponents",True),"iteritems",False)()): # generated from line 83, col 5
                 for targetVectorComponents in operatorComponentVectors.itervalues(): # generated from line 84, col 7
                     for targetVectorComponent in targetVectorComponents: # generated from line 85, col 9
-                        ## START CAPTURE REGION: _81012125 operation at line 86, col 11 in the source.
-                        _orig_trans_81012125 = trans
-                        _wasBuffering_81012125 = self._CHEETAH__isBuffering
+                        ## START CAPTURE REGION: _20113695 operation at line 86, col 11 in the source.
+                        _orig_trans_20113695 = trans
+                        _wasBuffering_20113695 = self._CHEETAH__isBuffering
                         self._CHEETAH__isBuffering = True
-                        trans = _captureCollector_81012125 = DummyTransaction()
-                        write = _captureCollector_81012125.response().write
+                        trans = _captureCollector_20113695 = DummyTransaction()
+                        write = _captureCollector_20113695.response().write
                         write(u'''/* ''')
                         _v = VFFSL(SL,"operatorComponentName",True) # u'${operatorComponentName}' on line 87, col 4
                         if _v is not None: write(_filter(_v, rawExpr=u'${operatorComponentName}')) # from line 87, col 4.
@@ -253,13 +253,13 @@ class OperatorContainer(_OperatorContainer):
                             if _v is not None: write(_filter(_v, rawExpr=u'${ipOperator.id}')) # from line 89, col 5.
                             write(u'''_exponentIndex''')
                         write(u''']''')
-                        trans = _orig_trans_81012125
+                        trans = _orig_trans_20113695
                         write = trans.response().write
-                        self._CHEETAH__isBuffering = _wasBuffering_81012125 
-                        operation = _captureCollector_81012125.response().getvalue()
-                        del _orig_trans_81012125
-                        del _captureCollector_81012125
-                        del _wasBuffering_81012125
+                        self._CHEETAH__isBuffering = _wasBuffering_20113695 
+                        operation = _captureCollector_20113695.response().getvalue()
+                        del _orig_trans_20113695
+                        del _captureCollector_20113695
+                        del _wasBuffering_20113695
                         # 
                         operationsDict.setdefault(targetVectorComponent, [])
                         operationsDict[targetVectorComponent].append(operation)
diff --git a/xpdeint/Operators/SICDeltaAOperator.py b/xpdeint/Operators/SICDeltaAOperator.py
index abff3d3..6e87c84 100644
--- a/xpdeint/Operators/SICDeltaAOperator.py
+++ b/xpdeint/Operators/SICDeltaAOperator.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.63372
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Operators/SICDeltaAOperator.tmpl'
+__CHEETAH_genTime__ = 1484975072.07045
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Operators/SICDeltaAOperator.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Jul 23 09:42:26 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Preferences.py b/xpdeint/Preferences.py
index 94c26bd..bb1f353 100755
--- a/xpdeint/Preferences.py
+++ b/xpdeint/Preferences.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 import os
 
-versionString = '2.2.2 "XMDS2 is a game of two halves"'
+versionString = '2.2.3 "It came from the deep"'
 
 if 'XMDS_USER_DATA' in os.environ:
     xpdeintUserDataPath = os.environ['XMDS_USER_DATA']
diff --git a/xpdeint/ScriptElement.py b/xpdeint/ScriptElement.py
index 7e7b92d..860c91d 100644
--- a/xpdeint/ScriptElement.py
+++ b/xpdeint/ScriptElement.py
@@ -34,10 +34,10 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.082975
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/ScriptElement.tmpl'
-__CHEETAH_srcLastModified__ = 'Thu Nov 21 19:01:19 2013'
+__CHEETAH_genTime__ = 1484975072.447894
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/ScriptElement.tmpl'
+__CHEETAH_srcLastModified__ = 'Sat Apr 11 14:05:45 2015'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
 if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
@@ -209,12 +209,12 @@ class ScriptElement(_ScriptElement):
             VFFSL(SL,"templateVariables",True)['vector'] = VFFSL(SL,"vector",True)
             _v = VFFSL(SL,"insertCodeForFeatures",False)('loopOverVectorsWithInnerContentTemplateBegin', VFFSL(SL,"loopFeatureOrdering",True), VFFSL(SL,"dict",True)) # u"${insertCodeForFeatures('loopOverVectorsWithInnerContentTemplateBegin', $loopFeatureOrdering, $dict)}" on line 155, col 1
             if _v is not None: write(_filter(_v, rawExpr=u"${insertCodeForFeatures('loopOverVectorsWithInnerContentTemplateBegin', $loopFeatureOrdering, $dict)}")) # from line 155, col 1.
-            ## START CAPTURE REGION: _11035573 loopString at line 156, col 5 in the source.
-            _orig_trans_11035573 = trans
-            _wasBuffering_11035573 = self._CHEETAH__isBuffering
+            ## START CAPTURE REGION: _27522821 loopString at line 156, col 5 in the source.
+            _orig_trans_27522821 = trans
+            _wasBuffering_27522821 = self._CHEETAH__isBuffering
             self._CHEETAH__isBuffering = True
-            trans = _captureCollector_11035573 = DummyTransaction()
-            write = _captureCollector_11035573.response().write
+            trans = _captureCollector_27522821 = DummyTransaction()
+            write = _captureCollector_27522821.response().write
             if basis is None: # generated from line 157, col 7
                 vectorSize = vector.allocSize
             else: # generated from line 159, col 7
@@ -230,13 +230,13 @@ class ScriptElement(_ScriptElement):
             if _v is not None: write(_filter(_v, autoIndent=True, rawExpr=u'${innerLoopTemplate, autoIndent=True}')) # from line 163, col 3.
             write(u'''}
 ''')
-            trans = _orig_trans_11035573
+            trans = _orig_trans_27522821
             write = trans.response().write
-            self._CHEETAH__isBuffering = _wasBuffering_11035573 
-            loopString = _captureCollector_11035573.response().getvalue()
-            del _orig_trans_11035573
-            del _captureCollector_11035573
-            del _wasBuffering_11035573
+            self._CHEETAH__isBuffering = _wasBuffering_27522821 
+            loopString = _captureCollector_27522821.response().getvalue()
+            del _orig_trans_27522821
+            del _captureCollector_27522821
+            del _wasBuffering_27522821
             _v = VFFSL(SL,"loopString",True) # u"${loopString, extraIndent=dict['extraIndent']}" on line 166, col 1
             if _v is not None: write(_filter(_v, extraIndent=dict['extraIndent'], rawExpr=u"${loopString, extraIndent=dict['extraIndent']}")) # from line 166, col 1.
             write(u'''
@@ -647,13 +647,14 @@ class ScriptElement(_ScriptElement):
             write(u'''_''')
             _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 448, col 2
             if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 448, col 2.
-            write(u'''_index_pointer += ''')
-            _v = VFFSL(SL,"dimRep.loopIndex",True) # u'${dimRep.loopIndex}' on line 448, col 32
-            if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.loopIndex}')) # from line 448, col 32.
-            write(u''' * ''')
-            _v = VFN(VFFSL(SL,"field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'${field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)}' on line 449, col 4
-            if _v is not None: write(_filter(_v, rawExpr=u'${field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)}')) # from line 449, col 4.
-            write(u''';
+            write(u'''_index_pointer += ( 0''')
+            write(u''' ''')
+            _v = VFFSL(SL,"explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis",False)(vector, dimRep, field, basis, indexOverrides) # u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}' on line 449, col 2
+            if _v is not None: write(_filter(_v, rawExpr=u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}')) # from line 449, col 2.
+            write(u''' ) * _''')
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 450, col 7
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 450, col 7.
+            write(u'''_ncomponents;
 ''')
         write(u'''
 ''')
@@ -672,7 +673,7 @@ class ScriptElement(_ScriptElement):
         Set index pointers for those vectors requiring it to be set explicitly
         """
 
-        ## CHEETAH: generated from @def setExplicitIndexPointersForVectorsWithFieldAndBasis($vectors, $field, $basis, $indexOverrides) at line 456, col 1.
+        ## CHEETAH: generated from @def setExplicitIndexPointersForVectorsWithFieldAndBasis($vectors, $field, $basis, $indexOverrides) at line 457, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -690,24 +691,24 @@ class ScriptElement(_ScriptElement):
         # 
         #  There's no need to (re-)set the index pointer for fields that have no dimensions
         vectorsNeedingExplicitIndexPointers = [vector for vector in vectors if vector.field.dimensions]
-        if len(vectorsNeedingExplicitIndexPointers) == 0: # generated from line 461, col 3
+        if len(vectorsNeedingExplicitIndexPointers) == 0: # generated from line 462, col 3
             return
         # 
         #  For the vectors that are not in the field $field, set their index pointers
         write(u'''// Set index pointers explicitly for (some) vectors
 ''')
-        for vector in vectorsNeedingExplicitIndexPointers: # generated from line 467, col 3
+        for vector in vectorsNeedingExplicitIndexPointers: # generated from line 468, col 3
             # 
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 469, col 2
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 469, col 2.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 470, col 2
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 470, col 2.
             write(u'''_index_pointer = ( 0''')
-            for dimRep in vector.field.inBasis(basis): # generated from line 470, col 5
-                _v = VFFSL(SL,"explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis",False)(vector, dimRep, field, basis, indexOverrides) # u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}' on line 471, col 1
-                if _v is not None: write(_filter(_v, rawExpr=u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}')) # from line 471, col 1.
+            for dimRep in vector.field.inBasis(basis): # generated from line 471, col 5
+                _v = VFFSL(SL,"explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis",False)(vector, dimRep, field, basis, indexOverrides) # u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}' on line 472, col 1
+                if _v is not None: write(_filter(_v, rawExpr=u'${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}')) # from line 472, col 1.
             write(u''' ) * _''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 473, col 7
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 473, col 7.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 474, col 7
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 474, col 7.
             write(u'''_ncomponents;
 ''')
         # 
@@ -722,7 +723,7 @@ class ScriptElement(_ScriptElement):
 
 
 
-        ## CHEETAH: generated from @def explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis($vector, $dimRep, $field, $basis, $indexOverrides) at line 478, col 1.
+        ## CHEETAH: generated from @def explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis($vector, $dimRep, $field, $basis, $indexOverrides) at line 479, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -748,7 +749,7 @@ class ScriptElement(_ScriptElement):
         #  First, check the case that they both have this dimension
         fieldDimRepList = [dr for dr in field.inBasis(basis) if dr.name == dimRep.name]
         # 
-        if fieldDimRepList: # generated from line 489, col 3
+        if fieldDimRepList: # generated from line 490, col 3
             #  First, consider when they both contain this dimension
             # 
             assert len(fieldDimRepList) == 1
@@ -757,36 +758,36 @@ class ScriptElement(_ScriptElement):
             #  If the lattices are the same, then there is nothing special to be done for this dimension
             #  We also require that there are neither dimension could have a local offset
             hasLocalOffset = dimRep.hasLocalOffset or fieldDimRep.hasLocalOffset
-            if dimRep.runtimeLattice == fieldDimRep.runtimeLattice and not hasLocalOffset: # generated from line 498, col 5
+            if dimRep.runtimeLattice == fieldDimRep.runtimeLattice and not hasLocalOffset: # generated from line 499, col 5
                 write(u'''   + ''')
-                _v = VFFSL(SL,"fieldDimRep.loopIndex",True) # u'${fieldDimRep.loopIndex}' on line 499, col 6
-                if _v is not None: write(_filter(_v, rawExpr=u'${fieldDimRep.loopIndex}')) # from line 499, col 6.
+                _v = VFFSL(SL,"fieldDimRep.loopIndex",True) # u'${fieldDimRep.loopIndex}' on line 500, col 6
+                if _v is not None: write(_filter(_v, rawExpr=u'${fieldDimRep.loopIndex}')) # from line 500, col 6.
                 write(u''' * ''')
-                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 500, col 4
-                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 500, col 4.
-            else: # generated from line 501, col 5
+                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 501, col 4
+                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 501, col 4.
+            else: # generated from line 502, col 5
                 write(u'''   + ( ''')
-                _v = VFN(VFFSL(SL,"dimRep",True),"localIndexFromIndexForDimensionRep",False)(fieldDimRep) # u'${dimRep.localIndexFromIndexForDimensionRep(fieldDimRep)}' on line 502, col 8
-                if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.localIndexFromIndexForDimensionRep(fieldDimRep)}')) # from line 502, col 8.
+                _v = VFN(VFFSL(SL,"dimRep",True),"localIndexFromIndexForDimensionRep",False)(fieldDimRep) # u'${dimRep.localIndexFromIndexForDimensionRep(fieldDimRep)}' on line 503, col 8
+                if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.localIndexFromIndexForDimensionRep(fieldDimRep)}')) # from line 503, col 8.
                 write(u''' )''')
                 write(u''' * ''')
-                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 503, col 4
-                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 503, col 4.
-        else: # generated from line 505, col 3
+                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 504, col 4
+                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 504, col 4.
+        else: # generated from line 506, col 3
             #  Now, consider when $field doesn't contain this dimension. If this dimension has an index override, then
             #  use the index pointers from that.
-            if indexOverrides.has_key(dimRep.name): # generated from line 508, col 5
+            if indexOverrides.has_key(dimRep.name): # generated from line 509, col 5
                 #  We do have an index override for this dimension
                 # 
                 #  Check that we actually have an entry for this vector's field
                 assert indexOverrides[dimRep.name].has_key(vector.field)
                 write(u'''   + ''')
-                _v = VFFSL(SL,"indexOverrides",True)[dimRep.name][vector.field] # u'${indexOverrides[dimRep.name][vector.field]}' on line 513, col 6
-                if _v is not None: write(_filter(_v, rawExpr=u'${indexOverrides[dimRep.name][vector.field]}')) # from line 513, col 6.
+                _v = VFFSL(SL,"indexOverrides",True)[dimRep.name][vector.field] # u'${indexOverrides[dimRep.name][vector.field]}' on line 514, col 6
+                if _v is not None: write(_filter(_v, rawExpr=u'${indexOverrides[dimRep.name][vector.field]}')) # from line 514, col 6.
                 write(u'''  * ''')
-                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 514, col 5
-                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 514, col 5.
-            else: # generated from line 515, col 5
+                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 515, col 5
+                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 515, col 5.
+            else: # generated from line 516, col 5
                 #  We don't have an index override for this dimension.
                 #  What happens in this case depends on whether or not the vector
                 #  is in fourier space in this dimension. If it is, then we want to take its
@@ -796,12 +797,12 @@ class ScriptElement(_ScriptElement):
                 #  Either way, this is handled by the dimension. But we can't have this dimension distributed.
                 assert not dimRep.hasLocalOffset, "Can't do single point samples with the distributed-mpi driver."
                 write(u'''   + ( ''')
-                _v = VFFSL(SL,"dimRep.indexForSinglePointSample",True) # u'${dimRep.indexForSinglePointSample}' on line 524, col 8
-                if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.indexForSinglePointSample}')) # from line 524, col 8.
+                _v = VFFSL(SL,"dimRep.indexForSinglePointSample",True) # u'${dimRep.indexForSinglePointSample}' on line 525, col 8
+                if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.indexForSinglePointSample}')) # from line 525, col 8.
                 write(u''' )''')
                 write(u'''  * ''')
-                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 525, col 5
-                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 525, col 5.
+                _v = VFN(VFFSL(SL,"vector.field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(dimRep, basis) # u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)' on line 526, col 5
+                if _v is not None: write(_filter(_v, rawExpr=u'$vector.field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)')) # from line 526, col 5.
         # 
         
         ########################################
@@ -817,7 +818,7 @@ class ScriptElement(_ScriptElement):
         Integrate the overridden vectors
         """
 
-        ## CHEETAH: generated from @def epilogueToIntegrateOverriddenVectorsForSamplingFieldInBasis($vectorOverrides, $field, $basis) at line 532, col 1.
+        ## CHEETAH: generated from @def epilogueToIntegrateOverriddenVectorsForSamplingFieldInBasis($vectorOverrides, $field, $basis) at line 533, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -834,7 +835,7 @@ class ScriptElement(_ScriptElement):
         
         # 
         #  Loop over the overridden vectors
-        for vector in VFFSL(SL,"vectorOverrides",True): # generated from line 536, col 3
+        for vector in VFFSL(SL,"vectorOverrides",True): # generated from line 537, col 3
             write(u'''
 ''')
             #  Determine which dimensions are being integrated over (if any)
@@ -842,24 +843,24 @@ class ScriptElement(_ScriptElement):
             dimensionsIntegratedOver = [dim for dim in field.dimensions if not vector.field.hasDimension(dim)]
             # 
             #  Loop over the components in each vector
-            for componentNumber, componentName in enumerate(VFFSL(SL,"vector.components",True)): # generated from line 543, col 5
+            for componentNumber, componentName in enumerate(VFFSL(SL,"vector.components",True)): # generated from line 544, col 5
                 write(u'''_active_''')
-                _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 544, col 9
-                if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 544, col 9.
+                _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 545, col 9
+                if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 545, col 9.
                 write(u'''[_''')
-                _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 544, col 23
-                if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 544, col 23.
+                _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 545, col 23
+                if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 545, col 23.
                 write(u'''_index_pointer + ''')
-                _v = VFFSL(SL,"componentNumber",True) # u'${componentNumber}' on line 544, col 52
-                if _v is not None: write(_filter(_v, rawExpr=u'${componentNumber}')) # from line 544, col 52.
+                _v = VFFSL(SL,"componentNumber",True) # u'${componentNumber}' on line 545, col 52
+                if _v is not None: write(_filter(_v, rawExpr=u'${componentNumber}')) # from line 545, col 52.
                 write(u'''] += ''')
-                _v = VFFSL(SL,"componentName",True) # u'${componentName}' on line 544, col 75
-                if _v is not None: write(_filter(_v, rawExpr=u'${componentName}')) # from line 544, col 75.
+                _v = VFFSL(SL,"componentName",True) # u'${componentName}' on line 545, col 75
+                if _v is not None: write(_filter(_v, rawExpr=u'${componentName}')) # from line 545, col 75.
                 #  Loop over the dimensions
-                for dimension in VFFSL(SL,"dimensionsIntegratedOver",True): # generated from line 546, col 7
+                for dimension in VFFSL(SL,"dimensionsIntegratedOver",True): # generated from line 547, col 7
                     write(u''' * d''')
-                    _v = VFN(VFN(VFFSL(SL,"dimension",True),"inBasis",False)(basis),"name",True) # u'${dimension.inBasis(basis).name}' on line 547, col 5
-                    if _v is not None: write(_filter(_v, rawExpr=u'${dimension.inBasis(basis).name}')) # from line 547, col 5.
+                    _v = VFN(VFN(VFFSL(SL,"dimension",True),"inBasis",False)(basis),"name",True) # u'${dimension.inBasis(basis).name}' on line 548, col 5
+                    if _v is not None: write(_filter(_v, rawExpr=u'${dimension.inBasis(basis).name}')) # from line 548, col 5.
                 write(u''';
 ''')
         # 
@@ -877,7 +878,7 @@ class ScriptElement(_ScriptElement):
         Increment index pointers but only for those in field `field` or in a field with the same dimensions.
         """
 
-        ## CHEETAH: generated from @def incrementIndexPointersForVectorsWithFieldBasisAndLastLoopDimRep($vectors, $field, $basis, $lastLoopDimRep) at line 556, col 1.
+        ## CHEETAH: generated from @def incrementIndexPointersForVectorsWithFieldBasisAndLastLoopDimRep($vectors, $field, $basis, $lastLoopDimRep) at line 557, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -896,14 +897,14 @@ class ScriptElement(_ScriptElement):
         #  For the vectors that are in the field $field, increment their index pointers.
         # 
         #  If none of $vectors have field $field, then there's nothing to do
-        if len(vectors) == 0: # generated from line 562, col 3
+        if len(vectors) == 0: # generated from line 563, col 3
             return
         write(u'''// Increment index pointers for vectors in field ''')
-        _v = VFFSL(SL,"field.name",True) # u'$field.name' on line 565, col 50
-        if _v is not None: write(_filter(_v, rawExpr=u'$field.name')) # from line 565, col 50.
+        _v = VFFSL(SL,"field.name",True) # u'$field.name' on line 566, col 50
+        if _v is not None: write(_filter(_v, rawExpr=u'$field.name')) # from line 566, col 50.
         write(u''' (or having the same dimensions)
 ''')
-        for vector in vectors: # generated from line 566, col 3
+        for vector in vectors: # generated from line 567, col 3
             #  We can only do this for vectors in $field
             #  or that have the same dimensions
             assert vector.field.dimensions == field.dimensions
@@ -914,14 +915,14 @@ class ScriptElement(_ScriptElement):
             #  but _stuff_latticeN * _stuff_ncomponents (etc.)
             #  This is needed for cross-propagation when cross-propagating along the last dimension.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 576, col 2
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 576, col 2.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 577, col 2
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 577, col 2.
             write(u'''_index_pointer += ''')
-            _v = VFN(VFFSL(SL,"field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(lastLoopDimRep, basis) # u'$field.localPointsInDimensionsAfterDimRepInBasis(lastLoopDimRep, basis)' on line 576, col 32
-            if _v is not None: write(_filter(_v, rawExpr=u'$field.localPointsInDimensionsAfterDimRepInBasis(lastLoopDimRep, basis)')) # from line 576, col 32.
+            _v = VFN(VFFSL(SL,"field",True),"localPointsInDimensionsAfterDimRepInBasis",False)(lastLoopDimRep, basis) # u'$field.localPointsInDimensionsAfterDimRepInBasis(lastLoopDimRep, basis)' on line 577, col 32
+            if _v is not None: write(_filter(_v, rawExpr=u'$field.localPointsInDimensionsAfterDimRepInBasis(lastLoopDimRep, basis)')) # from line 577, col 32.
             write(u''' * _''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 576, col 107
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 576, col 107.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 577, col 107
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 577, col 107.
             write(u'''_ncomponents;
 ''')
         write(u'''
@@ -942,7 +943,7 @@ class ScriptElement(_ScriptElement):
         All noises vectors must have the same static/dynamic type as that passed in.
         """
 
-        ## CHEETAH: generated from @def evaluateComputedVectors($vectors, $static = True) at line 582, col 1.
+        ## CHEETAH: generated from @def evaluateComputedVectors($vectors, $static = True) at line 583, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -958,9 +959,9 @@ class ScriptElement(_ScriptElement):
         ## START - generated method body
         
         # 
-        for vector in self.evaluationOrderForVectors(vectors, static, predicate = lambda x: x.isComputed): # generated from line 588, col 3
-            _v = VFN(VFN(VFFSL(SL,"vector",True),"functions",True)['evaluate'],"call",False)() # u"${vector.functions['evaluate'].call()}" on line 589, col 1
-            if _v is not None: write(_filter(_v, rawExpr=u"${vector.functions['evaluate'].call()}")) # from line 589, col 1.
+        for vector in self.evaluationOrderForVectors(vectors, static, predicate = lambda x: x.isComputed): # generated from line 589, col 3
+            _v = VFN(VFN(VFFSL(SL,"vector",True),"functions",True)['evaluate'],"call",False)() # u"${vector.functions['evaluate'].call()}" on line 590, col 1
+            if _v is not None: write(_filter(_v, rawExpr=u"${vector.functions['evaluate'].call()}")) # from line 590, col 1.
             write(u'''
 ''')
         # 
@@ -978,7 +979,7 @@ class ScriptElement(_ScriptElement):
         Copy the contents of `vecSrc` into `vecDest`
         """
 
-        ## CHEETAH: generated from @def copyVectors($vectors, $destPrefix, $srcPrefix = None) at line 594, col 1.
+        ## CHEETAH: generated from @def copyVectors($vectors, $destPrefix, $srcPrefix = None) at line 595, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -994,25 +995,25 @@ class ScriptElement(_ScriptElement):
         ## START - generated method body
         
         # 
-        for vector in VFFSL(SL,"vectors",True): # generated from line 597, col 3
+        for vector in VFFSL(SL,"vectors",True): # generated from line 598, col 3
             write(u'''memcpy(''')
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 598, col 8
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 598, col 8.
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 599, col 8
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 599, col 8.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 598, col 22
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 598, col 22.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 599, col 22
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 599, col 22.
             write(u''', ''')
-            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 598, col 36
-            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 598, col 36.
+            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 599, col 36
+            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 599, col 36.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 598, col 49
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 598, col 49.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 599, col 49
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 599, col 49.
             write(u''', sizeof(''')
-            _v = VFFSL(SL,"vector.type",True) # u'${vector.type}' on line 598, col 70
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.type}')) # from line 598, col 70.
+            _v = VFFSL(SL,"vector.type",True) # u'${vector.type}' on line 599, col 70
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.type}')) # from line 599, col 70.
             write(u''') * ''')
-            _v = VFFSL(SL,"vector.allocSize",True) # u'${vector.allocSize}' on line 598, col 88
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.allocSize}')) # from line 598, col 88.
+            _v = VFFSL(SL,"vector.allocSize",True) # u'${vector.allocSize}' on line 599, col 88
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.allocSize}')) # from line 599, col 88.
             write(u''');
 ''')
         # 
@@ -1027,7 +1028,7 @@ class ScriptElement(_ScriptElement):
 
 
 
-        ## CHEETAH: generated from @def swapVectorPointers($vectors, $destPrefix, $srcPrefix = None) at line 603, col 1.
+        ## CHEETAH: generated from @def swapVectorPointers($vectors, $destPrefix, $srcPrefix = None) at line 604, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -1046,48 +1047,48 @@ class ScriptElement(_ScriptElement):
         # 
         write(u'''{
 ''')
-        for vector in VFFSL(SL,"vectors",True): # generated from line 607, col 3
+        for vector in VFFSL(SL,"vectors",True): # generated from line 608, col 3
             write(u'''  ''')
-            _v = VFFSL(SL,"vector.type",True) # u'${vector.type}' on line 608, col 3
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.type}')) # from line 608, col 3.
+            _v = VFFSL(SL,"vector.type",True) # u'${vector.type}' on line 609, col 3
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.type}')) # from line 609, col 3.
             write(u'''* _temp_''')
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 608, col 25
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 608, col 25.
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 609, col 25
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 609, col 25.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 608, col 39
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 608, col 39.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 609, col 39
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 609, col 39.
             write(u''' = ''')
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 608, col 54
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 608, col 54.
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 609, col 54
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 609, col 54.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 608, col 68
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 608, col 68.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 609, col 68
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 609, col 68.
             write(u''';
   ''')
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 609, col 3
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 609, col 3.
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 610, col 3
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 610, col 3.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 609, col 17
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 609, col 17.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 610, col 17
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 610, col 17.
             write(u''' = ''')
-            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 609, col 32
-            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 609, col 32.
+            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 610, col 32
+            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 610, col 32.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 609, col 45
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 609, col 45.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 610, col 45
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 610, col 45.
             write(u''';
   ''')
-            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 610, col 3
-            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 610, col 3.
+            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 611, col 3
+            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 611, col 3.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 610, col 16
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 610, col 16.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 611, col 16
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 611, col 16.
             write(u''' = _temp_''')
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 610, col 37
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 610, col 37.
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 611, col 37
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 611, col 37.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 610, col 51
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 610, col 51.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 611, col 51
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 611, col 51.
             write(u''';
 ''')
         write(u'''}
@@ -1104,7 +1105,7 @@ class ScriptElement(_ScriptElement):
 
 
 
-        ## CHEETAH: generated from @def assignVectorPointers($vectors, $destPrefix, $srcPrefix = None) at line 616, col 1.
+        ## CHEETAH: generated from @def assignVectorPointers($vectors, $destPrefix, $srcPrefix = None) at line 617, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -1121,18 +1122,18 @@ class ScriptElement(_ScriptElement):
         
         # dex: Assign the pointer of `vecSrc` to `vecDest`
         # 
-        for vector in VFFSL(SL,"vectors",True): # generated from line 619, col 3
-            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 620, col 1
-            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 620, col 1.
+        for vector in VFFSL(SL,"vectors",True): # generated from line 620, col 3
+            _v = VFFSL(SL,"destPrefix",True) # u'${destPrefix}' on line 621, col 1
+            if _v is not None: write(_filter(_v, rawExpr=u'${destPrefix}')) # from line 621, col 1.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 620, col 15
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 620, col 15.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 621, col 15
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 621, col 15.
             write(u''' = ''')
-            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 620, col 30
-            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 620, col 30.
+            _v = VFFSL(SL,"srcPrefix",True) # u'${srcPrefix}' on line 621, col 30
+            if _v is not None: write(_filter(_v, rawExpr=u'${srcPrefix}')) # from line 621, col 30.
             write(u'''_''')
-            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 620, col 43
-            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 620, col 43.
+            _v = VFFSL(SL,"vector.id",True) # u'${vector.id}' on line 621, col 43
+            if _v is not None: write(_filter(_v, rawExpr=u'${vector.id}')) # from line 621, col 43.
             write(u''';
 ''')
         # 
diff --git a/xpdeint/ScriptElement.tmpl b/xpdeint/ScriptElement.tmpl
index 3d3e7f2..836d955 100644
--- a/xpdeint/ScriptElement.tmpl
+++ b/xpdeint/ScriptElement.tmpl
@@ -445,8 +445,9 @@ unsigned long ${dimRep.loopIndex} = ${indexOverrides[dimRep.name][field]};
   @# loop over the vectors in field $field, because we need to fix up their index pointers
   @# and those vectors with the same dimensions
   @for $vector in [v for v in vectors if v.field.dimensions == field.dimensions]
-_${vector.id}_index_pointer += ${dimRep.loopIndex}@slurp
- * ${field.localPointsInDimensionsAfterDimRepInBasis(dimRep, basis)};
+_${vector.id}_index_pointer += ( 0 at slurp
+ ${explicitIndexPointerTermForVectorAndDimRepWithFieldAndBasis(vector, dimRep, field, basis, indexOverrides)}@slurp
+ ) * _${vector.id}_ncomponents;
   @end for
 
   @#
diff --git a/xpdeint/Segments/BreakpointSegment.py b/xpdeint/Segments/BreakpointSegment.py
index 7c38d80..afccf00 100644
--- a/xpdeint/Segments/BreakpointSegment.py
+++ b/xpdeint/Segments/BreakpointSegment.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.605982
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/BreakpointSegment.tmpl'
+__CHEETAH_genTime__ = 1484975072.063163
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/BreakpointSegment.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug  1 11:52:34 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/FilterSegment.py b/xpdeint/Segments/FilterSegment.py
index 33202e8..af70c5a 100644
--- a/xpdeint/Segments/FilterSegment.py
+++ b/xpdeint/Segments/FilterSegment.py
@@ -34,10 +34,10 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.650927
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/FilterSegment.tmpl'
-__CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
+__CHEETAH_genTime__ = 1484975072.093732
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/FilterSegment.tmpl'
+__CHEETAH_srcLastModified__ = 'Sat Dec 13 16:51:33 2014'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
 if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
@@ -115,15 +115,19 @@ class FilterSegment(_FilterSegment):
         ########################################
         ## START - generated method body
         
-        _v = VFFSL(SL,"evaluateComputedVectors",False)(VFFSL(SL,"dynamicVectorsNeedingPrecalculationForOperatorContainers",False)(VFFSL(SL,"operatorContainers",True))) # u'${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContainers($operatorContainers))}' on line 34, col 1
-        if _v is not None: write(_filter(_v, rawExpr=u'${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContainers($operatorContainers))}')) # from line 34, col 1.
-        # 
-        for operatorContainer in VFFSL(SL,"operatorContainers",True): # generated from line 36, col 3
-            write(u'''
+        if VFFSL(SL,"onlyWhenCalled",True): # generated from line 34, col 1
+            write(u'''// This filter is only activated when called explicitly
 ''')
-            _v = VFN(VFFSL(SL,"operatorContainer",True),"evaluateOperators",False)(parentFunction = function) # u'${operatorContainer.evaluateOperators(parentFunction = function)}' on line 38, col 1
-            if _v is not None: write(_filter(_v, rawExpr=u'${operatorContainer.evaluateOperators(parentFunction = function)}')) # from line 38, col 1.
-        # 
+        else: # generated from line 36, col 1
+            _v = VFFSL(SL,"evaluateComputedVectors",False)(VFFSL(SL,"dynamicVectorsNeedingPrecalculationForOperatorContainers",False)(VFFSL(SL,"operatorContainers",True))) # u'${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContainers($operatorContainers))}' on line 37, col 1
+            if _v is not None: write(_filter(_v, rawExpr=u'${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContainers($operatorContainers))}')) # from line 37, col 1.
+            # 
+            for operatorContainer in VFFSL(SL,"operatorContainers",True): # generated from line 39, col 3
+                write(u'''
+''')
+                _v = VFN(VFFSL(SL,"operatorContainer",True),"evaluateOperators",False)(parentFunction = function) # u'${operatorContainer.evaluateOperators(parentFunction = function)}' on line 41, col 1
+                if _v is not None: write(_filter(_v, rawExpr=u'${operatorContainer.evaluateOperators(parentFunction = function)}')) # from line 41, col 1.
+            # 
         
         ########################################
         ## END - generated method body
diff --git a/xpdeint/Segments/FilterSegment.tmpl b/xpdeint/Segments/FilterSegment.tmpl
index 4e12dbc..4cea05c 100644
--- a/xpdeint/Segments/FilterSegment.tmpl
+++ b/xpdeint/Segments/FilterSegment.tmpl
@@ -31,6 +31,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
   Function implementations
 *@
 @def segmentFunctionBody($function)
+ at if $onlyWhenCalled
+// This filter is only activated when called explicitly
+ at else
 ${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContainers($operatorContainers))}@slurp
   @#
   @for $operatorContainer in $operatorContainers
@@ -38,5 +41,6 @@ ${evaluateComputedVectors($dynamicVectorsNeedingPrecalculationForOperatorContain
 ${operatorContainer.evaluateOperators(parentFunction = function)}@slurp
   @end for
   @#
+ at end if
 @end def
 
diff --git a/xpdeint/Segments/Integrators/AdaptiveStep.py b/xpdeint/Segments/Integrators/AdaptiveStep.py
index b65f17e..33e0699 100644
--- a/xpdeint/Segments/Integrators/AdaptiveStep.py
+++ b/xpdeint/Segments/Integrators/AdaptiveStep.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.026674
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/AdaptiveStep.tmpl'
+__CHEETAH_genTime__ = 1484975072.30826
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/AdaptiveStep.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:08 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/FixedStep.py b/xpdeint/Segments/Integrators/FixedStep.py
index 94d3f81..01e3add 100644
--- a/xpdeint/Segments/Integrators/FixedStep.py
+++ b/xpdeint/Segments/Integrators/FixedStep.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.915661
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/FixedStep.tmpl'
+__CHEETAH_genTime__ = 1484975072.185116
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/FixedStep.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -409,12 +409,12 @@ for (long _istep = 0; _istep < ''')
         # 
         innerLoopTemplate = VFFSL(SL,"templateObjectFromStringWithTemplateVariables",False)(VFFSL(SL,"templateString",True), {'componentIndex': '_icomp'})
         # 
-        ## START CAPTURE REGION: _75824916 loopContents at line 157, col 3 in the source.
-        _orig_trans_75824916 = trans
-        _wasBuffering_75824916 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _32598231 loopContents at line 157, col 3 in the source.
+        _orig_trans_32598231 = trans
+        _wasBuffering_32598231 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_75824916 = DummyTransaction()
-        write = _captureCollector_75824916.response().write
+        trans = _captureCollector_32598231 = DummyTransaction()
+        write = _captureCollector_32598231.response().write
         for reducedVector, vector in VFN(VFFSL(SL,"vectorMap",True),"iteritems",False)(): # generated from line 158, col 5
             if vector.field.hasDimensionName(VFFSL(SL,"propagationDimension",True)): # generated from line 159, col 7
                 propagationDimensionObject = vector.field.dimensionWithName(VFFSL(SL,"propagationDimension",True))
@@ -431,13 +431,13 @@ for (long _istep = 0; _istep < ''')
             write(u'''}
 ''')
             del innerLoopTemplate.skipSize
-        trans = _orig_trans_75824916
+        trans = _orig_trans_32598231
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_75824916 
-        loopContents = _captureCollector_75824916.response().getvalue()
-        del _orig_trans_75824916
-        del _captureCollector_75824916
-        del _wasBuffering_75824916
+        self._CHEETAH__isBuffering = _wasBuffering_32598231 
+        loopContents = _captureCollector_32598231.response().getvalue()
+        del _orig_trans_32598231
+        del _captureCollector_32598231
+        del _wasBuffering_32598231
         # 
         _v = VFFSL(SL,"loopOverFieldInBasisWithVectorsAndInnerContent",False)(VFFSL(SL,"parent.reducedField",True), VFFSL(SL,"homeBasis",True), VFFSL(SL,"setOfVectorsToLoopOver",True),
                                                  VFFSL(SL,"loopContents",True), indexOverrides = VFFSL(SL,"indexOverrides",True),
diff --git a/xpdeint/Segments/Integrators/FixedStepWithCross.py b/xpdeint/Segments/Integrators/FixedStepWithCross.py
index eb464f2..29cec7a 100644
--- a/xpdeint/Segments/Integrators/FixedStepWithCross.py
+++ b/xpdeint/Segments/Integrators/FixedStepWithCross.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.68705
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/FixedStepWithCross.tmpl'
+__CHEETAH_genTime__ = 1484975072.184019
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/FixedStepWithCross.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/Integrator.py b/xpdeint/Segments/Integrators/Integrator.py
index 1f1d92c..9f60a90 100644
--- a/xpdeint/Segments/Integrators/Integrator.py
+++ b/xpdeint/Segments/Integrators/Integrator.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234539.988392
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:08:59 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/Integrator.tmpl'
+__CHEETAH_genTime__ = 1484975072.240465
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/Integrator.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/MMStepper.py b/xpdeint/Segments/Integrators/MMStepper.py
index 5363157..0623859 100644
--- a/xpdeint/Segments/Integrators/MMStepper.py
+++ b/xpdeint/Segments/Integrators/MMStepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.096815
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/MMStepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.2875
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/MMStepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 21 19:01:19 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/RK45Stepper.py b/xpdeint/Segments/Integrators/RK45Stepper.py
index 5121682..ffa9361 100644
--- a/xpdeint/Segments/Integrators/RK45Stepper.py
+++ b/xpdeint/Segments/Integrators/RK45Stepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.119409
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/RK45Stepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.291069
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/RK45Stepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Oct 21 12:39:43 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/RK4Stepper.py b/xpdeint/Segments/Integrators/RK4Stepper.py
index 4884008..d8cd03b 100644
--- a/xpdeint/Segments/Integrators/RK4Stepper.py
+++ b/xpdeint/Segments/Integrators/RK4Stepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.157806
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/RK4Stepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.358964
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/RK4Stepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/RK89Stepper.py b/xpdeint/Segments/Integrators/RK89Stepper.py
index fe505e4..4c21477 100644
--- a/xpdeint/Segments/Integrators/RK89Stepper.py
+++ b/xpdeint/Segments/Integrators/RK89Stepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.310062
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/RK89Stepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.541034
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/RK89Stepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/RK9Stepper.py b/xpdeint/Segments/Integrators/RK9Stepper.py
index 512a1d4..9cb2d4b 100644
--- a/xpdeint/Segments/Integrators/RK9Stepper.py
+++ b/xpdeint/Segments/Integrators/RK9Stepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.550486
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/RK9Stepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.620946
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/RK9Stepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/RichardsonFixedStep.py b/xpdeint/Segments/Integrators/RichardsonFixedStep.py
index b5f3683..f0793e5 100644
--- a/xpdeint/Segments/Integrators/RichardsonFixedStep.py
+++ b/xpdeint/Segments/Integrators/RichardsonFixedStep.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.341579
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/RichardsonFixedStep.tmpl'
+__CHEETAH_genTime__ = 1484975072.431613
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/RichardsonFixedStep.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 21 19:01:19 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/SICStepper.py b/xpdeint/Segments/Integrators/SICStepper.py
index 9528925..e5eecd2 100644
--- a/xpdeint/Segments/Integrators/SICStepper.py
+++ b/xpdeint/Segments/Integrators/SICStepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.326645
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/SICStepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.480912
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/SICStepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/SIStepper.py b/xpdeint/Segments/Integrators/SIStepper.py
index ef1ae7d..693c8a4 100644
--- a/xpdeint/Segments/Integrators/SIStepper.py
+++ b/xpdeint/Segments/Integrators/SIStepper.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.451103
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/Integrators/SIStepper.tmpl'
+__CHEETAH_genTime__ = 1484975072.49063
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/Integrators/SIStepper.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Oct 11 15:53:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/Integrators/_Integrator.py b/xpdeint/Segments/Integrators/_Integrator.py
index c1251a4..de92b1f 100644
--- a/xpdeint/Segments/Integrators/_Integrator.py
+++ b/xpdeint/Segments/Integrators/_Integrator.py
@@ -53,6 +53,7 @@ class _Integrator (_Segment):
     assert stepperClass
     self.stepper = stepperClass(parent = self, **self.argumentsToTemplateConstructors)
     self._children.append(self.stepper)
+    self.only_when_called = False
     
     functionNamePrefix = '_' + self.id
     
@@ -172,7 +173,7 @@ class _Integrator (_Segment):
       self.samples = [int(sampleCountString) for sampleCountString in samplesList]
       
       for momentGroup, sampleCount in zip(momentGroups, self.samples):
-        if sampleCount and not (self.stepCount % sampleCount) == 0:
+        if sampleCount and not (self.stepCount % sampleCount) == 0 and not self.__class__.__name__ is "AdaptiveStep":
           raise ParserException(samplesElement, "Sample count does not evenly divide the number of steps")
         
         momentGroup.addSamplePoints(sampleCount * self.totalCycles)
diff --git a/xpdeint/Segments/SequenceSegment.py b/xpdeint/Segments/SequenceSegment.py
index 71d9b22..89c1bb1 100644
--- a/xpdeint/Segments/SequenceSegment.py
+++ b/xpdeint/Segments/SequenceSegment.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.420322
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/SequenceSegment.tmpl'
+__CHEETAH_genTime__ = 1484975072.521234
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/SequenceSegment.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/TopLevelSequenceElement.py b/xpdeint/Segments/TopLevelSequenceElement.py
index 6083b31..4fe97e3 100644
--- a/xpdeint/Segments/TopLevelSequenceElement.py
+++ b/xpdeint/Segments/TopLevelSequenceElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.401881
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Segments/TopLevelSequenceElement.tmpl'
+__CHEETAH_genTime__ = 1484975072.533359
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Segments/TopLevelSequenceElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Segments/_FilterSegment.py b/xpdeint/Segments/_FilterSegment.py
index eca0969..e509f88 100644
--- a/xpdeint/Segments/_FilterSegment.py
+++ b/xpdeint/Segments/_FilterSegment.py
@@ -29,6 +29,8 @@ class _FilterSegment (_Segment):
     _Segment.__init__(self, *args, **KWs)
     
     self.operatorContainers = []
+    self.onlyWhenCalled = False
+
   
   @property
   def children(self):
diff --git a/xpdeint/Simulation.py b/xpdeint/Simulation.py
index eca88be..9a7dd08 100644
--- a/xpdeint/Simulation.py
+++ b/xpdeint/Simulation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.573126
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Simulation.tmpl'
+__CHEETAH_genTime__ = 1484975072.616684
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Simulation.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 14 17:42:18 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.py b/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.py
index fa25d11..b919919 100644
--- a/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.py
+++ b/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.578453
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.tmpl'
+__CHEETAH_genTime__ = 1484975072.577072
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/AdaptiveMPIMultiPathDriver.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Nov 18 20:57:44 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/SimulationDrivers/DistributedMPIDriver.py b/xpdeint/SimulationDrivers/DistributedMPIDriver.py
index ba182b6..ea6ae62 100644
--- a/xpdeint/SimulationDrivers/DistributedMPIDriver.py
+++ b/xpdeint/SimulationDrivers/DistributedMPIDriver.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.683248
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/DistributedMPIDriver.tmpl'
+__CHEETAH_genTime__ = 1484975072.702765
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/DistributedMPIDriver.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 14 17:42:09 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -630,12 +630,12 @@ for (long _dataForRank = 0; _dataForRank < _size; _dataForRank++) {
             return
         # 
         writeLoopContents = dict['writeLoopContents']
-        ## START CAPTURE REGION: _51336368 newWriteLoopContents at line 242, col 3 in the source.
-        _orig_trans_51336368 = trans
-        _wasBuffering_51336368 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _74144571 newWriteLoopContents at line 242, col 3 in the source.
+        _orig_trans_74144571 = trans
+        _wasBuffering_74144571 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_51336368 = DummyTransaction()
-        write = _captureCollector_51336368.response().write
+        trans = _captureCollector_74144571 = DummyTransaction()
+        write = _captureCollector_74144571.response().write
         for fileDimIndex, memDimIndex, dimRep in dimRepOrdering: # generated from line 243, col 5
             write(u'''hsize_t file_start_''')
             _v = VFFSL(SL,"dimRep.name",True) # u'${dimRep.name}' on line 244, col 20
@@ -691,13 +691,13 @@ mem_count[''')
             if _v is not None: write(_filter(_v, rawExpr=u'${dimRep.name}')) # from line 256, col 33.
             write(u''';
 ''')
-        trans = _orig_trans_51336368
+        trans = _orig_trans_74144571
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_51336368 
-        newWriteLoopContents = _captureCollector_51336368.response().getvalue()
-        del _orig_trans_51336368
-        del _captureCollector_51336368
-        del _wasBuffering_51336368
+        self._CHEETAH__isBuffering = _wasBuffering_74144571 
+        newWriteLoopContents = _captureCollector_74144571.response().getvalue()
+        del _orig_trans_74144571
+        del _captureCollector_74144571
+        del _wasBuffering_74144571
         # 
         dict['writeLoopContents'] = newWriteLoopContents
         # 
diff --git a/xpdeint/SimulationDrivers/MPI.py b/xpdeint/SimulationDrivers/MPI.py
index 66c5873..a828c5c 100644
--- a/xpdeint/SimulationDrivers/MPI.py
+++ b/xpdeint/SimulationDrivers/MPI.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.678817
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/MPI.tmpl'
+__CHEETAH_genTime__ = 1484975072.637721
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/MPI.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Mar 29 16:44:30 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/SimulationDrivers/MPIMultiPathDriver.py b/xpdeint/SimulationDrivers/MPIMultiPathDriver.py
index 65fe36c..7e57170 100644
--- a/xpdeint/SimulationDrivers/MPIMultiPathDriver.py
+++ b/xpdeint/SimulationDrivers/MPIMultiPathDriver.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.725331
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/MPIMultiPathDriver.tmpl'
+__CHEETAH_genTime__ = 1484975072.680343
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/MPIMultiPathDriver.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Nov 18 19:21:08 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/SimulationDrivers/MultiPathDriver.py b/xpdeint/SimulationDrivers/MultiPathDriver.py
index 5be0ce6..25deb9a 100644
--- a/xpdeint/SimulationDrivers/MultiPathDriver.py
+++ b/xpdeint/SimulationDrivers/MultiPathDriver.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.743762
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/MultiPathDriver.tmpl'
+__CHEETAH_genTime__ = 1484975072.677572
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/MultiPathDriver.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Nov 18 19:21:08 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -256,12 +256,12 @@ class MultiPathDriver(_MultiPathDriver):
         #  to make sure they don't get finalised early. As that could lead to
         #  NULL pointer dereferences, and that is bad.
         # 
-        ## START CAPTURE REGION: _97867200 finalisationCode at line 82, col 3 in the source.
-        _orig_trans_97867200 = trans
-        _wasBuffering_97867200 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _27877228 finalisationCode at line 82, col 3 in the source.
+        _orig_trans_27877228 = trans
+        _wasBuffering_27877228 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_97867200 = DummyTransaction()
-        write = _captureCollector_97867200.response().write
+        trans = _captureCollector_27877228 = DummyTransaction()
+        write = _captureCollector_27877228.response().write
         for o in VFFSL(SL,"objectsNeedingInitialisation",True): # generated from line 83, col 5
             _v = VFFSL(SL,"o.finalise",True) # u'${o.finalise}' on line 84, col 1
             if _v is not None: write(_filter(_v, rawExpr=u'${o.finalise}')) # from line 84, col 1.
@@ -269,13 +269,13 @@ class MultiPathDriver(_MultiPathDriver):
 ''')
         _v = VFFSL(SL,"topLevelSequence.free",True) # u'${topLevelSequence.free}' on line 87, col 1
         if _v is not None: write(_filter(_v, rawExpr=u'${topLevelSequence.free}')) # from line 87, col 1.
-        trans = _orig_trans_97867200
+        trans = _orig_trans_27877228
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_97867200 
-        finalisationCode = _captureCollector_97867200.response().getvalue()
-        del _orig_trans_97867200
-        del _captureCollector_97867200
-        del _wasBuffering_97867200
+        self._CHEETAH__isBuffering = _wasBuffering_27877228 
+        finalisationCode = _captureCollector_27877228.response().getvalue()
+        del _orig_trans_27877228
+        del _captureCollector_27877228
+        del _wasBuffering_27877228
         write(u'''
 ''')
         _v = VFFSL(SL,"segment0_loop",True) # u'${segment0_loop}' on line 90, col 1
diff --git a/xpdeint/SimulationDrivers/SimulationDriver.py b/xpdeint/SimulationDrivers/SimulationDriver.py
index ac669ea..df5e5f4 100644
--- a/xpdeint/SimulationDrivers/SimulationDriver.py
+++ b/xpdeint/SimulationDrivers/SimulationDriver.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.777512
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationDrivers/SimulationDriver.tmpl'
+__CHEETAH_genTime__ = 1484975072.723744
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationDrivers/SimulationDriver.tmpl'
 __CHEETAH_srcLastModified__ = 'Mon Nov 18 19:21:08 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/SimulationElement.py b/xpdeint/SimulationElement.py
index ae5cc7f..ec9f48c 100644
--- a/xpdeint/SimulationElement.py
+++ b/xpdeint/SimulationElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.787955
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/SimulationElement.tmpl'
+__CHEETAH_genTime__ = 1484975072.729027
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/SimulationElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri Feb 24 16:41:39 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/Generators/DSFMTGenerator.py b/xpdeint/Stochastic/Generators/DSFMTGenerator.py
index f835959..9543fdc 100644
--- a/xpdeint/Stochastic/Generators/DSFMTGenerator.py
+++ b/xpdeint/Stochastic/Generators/DSFMTGenerator.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.867108
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/Generators/DSFMTGenerator.tmpl'
+__CHEETAH_genTime__ = 1484975072.764727
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/Generators/DSFMTGenerator.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug 28 15:52:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/Generators/Generator.py b/xpdeint/Stochastic/Generators/Generator.py
index fe2e4a7..09563b2 100644
--- a/xpdeint/Stochastic/Generators/Generator.py
+++ b/xpdeint/Stochastic/Generators/Generator.py
@@ -35,10 +35,10 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.872153
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/Generators/Generator.tmpl'
-__CHEETAH_srcLastModified__ = 'Mon Oct 14 10:16:21 2013'
+__CHEETAH_genTime__ = 1484975072.775341
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/Generators/Generator.tmpl'
+__CHEETAH_srcLastModified__ = 'Thu Jan  5 14:39:24 2017'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
 if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple:
@@ -160,20 +160,18 @@ class Generator(ScriptElement):
             _v = VFFSL(SL,"insertCodeForFeatures",False)('runtimeSeedGenerationBegin', VFFSL(SL,"featureOrdering",True), VFFSL(SL,"seedGenerationDict",True)) # u"${insertCodeForFeatures('runtimeSeedGenerationBegin', $featureOrdering, $seedGenerationDict)}" on line 44, col 1
             if _v is not None: write(_filter(_v, rawExpr=u"${insertCodeForFeatures('runtimeSeedGenerationBegin', $featureOrdering, $seedGenerationDict)}")) # from line 44, col 1.
             extraIndent = seedGenerationDict['extraIndent']
-            _v = VFFSL(SL,"runtimeGenerateSeeds",True) # u'${runtimeGenerateSeeds, extraIndent = extraIndent}' on line 46, col 1
-            if _v is not None: write(_filter(_v, extraIndent = extraIndent, rawExpr=u'${runtimeGenerateSeeds, extraIndent = extraIndent}')) # from line 46, col 1.
-            _v = VFFSL(SL,"insertCodeForFeaturesInReverseOrder",False)('runtimeSeedGenerationEnd', VFFSL(SL,"featureOrdering",True), VFFSL(SL,"seedGenerationDict",True)) # u"${insertCodeForFeaturesInReverseOrder('runtimeSeedGenerationEnd', $featureOrdering, $seedGenerationDict)}" on line 47, col 1
-            if _v is not None: write(_filter(_v, rawExpr=u"${insertCodeForFeaturesInReverseOrder('runtimeSeedGenerationEnd', $featureOrdering, $seedGenerationDict)}")) # from line 47, col 1.
-        else: # generated from line 48, col 3
-            for seedIdx, seed in enumerate(VFFSL(SL,"seedArray",True)): # generated from line 49, col 5
-                _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 50, col 1
-                if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 50, col 1.
+            _v = VFFSL(SL,"insertCodeForFeaturesInReverseOrder",False)('runtimeSeedGenerationEnd', VFFSL(SL,"featureOrdering",True), VFFSL(SL,"seedGenerationDict",True)) # u"${insertCodeForFeaturesInReverseOrder('runtimeSeedGenerationEnd', $featureOrdering, $seedGenerationDict)}" on line 46, col 1
+            if _v is not None: write(_filter(_v, rawExpr=u"${insertCodeForFeaturesInReverseOrder('runtimeSeedGenerationEnd', $featureOrdering, $seedGenerationDict)}")) # from line 46, col 1.
+        else: # generated from line 47, col 3
+            for seedIdx, seed in enumerate(VFFSL(SL,"seedArray",True)): # generated from line 48, col 5
+                _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 49, col 1
+                if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 49, col 1.
                 write(u'''_seeds[''')
-                _v = VFFSL(SL,"seedIdx",True) # u'$seedIdx' on line 50, col 24
-                if _v is not None: write(_filter(_v, rawExpr=u'$seedIdx')) # from line 50, col 24.
+                _v = VFFSL(SL,"seedIdx",True) # u'$seedIdx' on line 49, col 24
+                if _v is not None: write(_filter(_v, rawExpr=u'$seedIdx')) # from line 49, col 24.
                 write(u'''] = ''')
-                _v = VFFSL(SL,"seed",True) # u'$seed' on line 50, col 36
-                if _v is not None: write(_filter(_v, rawExpr=u'$seed')) # from line 50, col 36.
+                _v = VFFSL(SL,"seed",True) # u'$seed' on line 49, col 36
+                if _v is not None: write(_filter(_v, rawExpr=u'$seed')) # from line 49, col 36.
                 write(u''';
 ''')
         # 
@@ -189,7 +187,7 @@ class Generator(ScriptElement):
 
 
 
-        ## CHEETAH: generated from @def seedSystemRandomNumberGenerator at line 58, col 1.
+        ## CHEETAH: generated from @def seedSystemRandomNumberGenerator at line 57, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -204,32 +202,35 @@ class Generator(ScriptElement):
         ########################################
         ## START - generated method body
         
-        write(u'''#if HAVE_SRANDOMDEV
-srandomdev();
-#elif HAVE_DEV_URANDOM
-{
-  size_t __state_size = 256;
-  char __state[__state_size];
-  unsigned __seed;
+        write(u'''#if HAVE_DEV_URANDOM
+  uint32_t __seeds[10];
   FILE *__urandom_fp = fopen("/dev/urandom", "r");
+
   if (__urandom_fp == NULL) {
-    _LOG(_ERROR_LOG_LEVEL, "Unable to seed random number generator from /dev/urandom.  Is it accessible?\\n");
-    // Implicit quit
-  }
-  size_t __bytes_read = 0;
-  __bytes_read = fread(&__seed, sizeof(__seed), 1, __urandom_fp);
-  if (__bytes_read != 1) {
-    _LOG(_ERROR_LOG_LEVEL, "Unable to read from /dev/urandom while seeding the random number generator.\\n");
-    // Implicit quit
+      _LOG(_ERROR_LOG_LEVEL, "Unable to seed random number generator from /dev/urandom.  Is it accessible?\\n");
+      // Implicit quit
   }
-  __bytes_read = fread(__state, sizeof(__state), 1, __urandom_fp);
-  if (__bytes_read != 1) {
+
+  size_t __entries_read = 0;
+  __entries_read = fread(__seeds, sizeof(uint32_t), 10, __urandom_fp);
+
+  if (__entries_read != 10) {
     _LOG(_ERROR_LOG_LEVEL, "Unable to read from /dev/urandom while seeding the random number generator.\\n");
-    // Implicit quit
+      // Implicit quit
   }
+
   fclose(__urandom_fp);
-  initstate(__seed, __state, __state_size);
-}
+
+  for (unsigned long _i0=0; _i0 < ''')
+        _v = VFFSL(SL,"seedCount",True) # u'${seedCount}' on line 77, col 35
+        if _v is not None: write(_filter(_v, rawExpr=u'${seedCount}')) # from line 77, col 35.
+        write(u'''; _i0++) {
+    ''')
+        _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 78, col 5
+        if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 78, col 5.
+        write(u'''_seeds[_i0] = (uint32_t) __seeds[_i0];
+  }
+
 #else
 #error Do not have a run-time random number source! Please supply seeds manually.
 #endif
@@ -245,7 +246,7 @@ srandomdev();
 
 
 
-        ## CHEETAH: generated from @def initialiseLocalSeeds at line 90, col 1.
+        ## CHEETAH: generated from @def initialiseLocalSeeds at line 86, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -265,15 +266,15 @@ srandomdev();
         seedOffset = VFFSL(SL,"insertCodeForFeatures",False)('seedOffset', VFFSL(SL,"featureOrdering",True))
         # 
         write(u'''uint32_t ''')
-        _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 95, col 10
-        if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 95, col 10.
+        _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 91, col 10
+        if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 91, col 10.
         write(u'''_local_seeds[''')
-        _v = VFFSL(SL,"seedCount",True) # u'${seedCount}' on line 95, col 39
-        if _v is not None: write(_filter(_v, rawExpr=u'${seedCount}')) # from line 95, col 39.
+        _v = VFFSL(SL,"seedCount",True) # u'${seedCount}' on line 91, col 39
+        if _v is not None: write(_filter(_v, rawExpr=u'${seedCount}')) # from line 91, col 39.
         write(u'''] = {
   ''')
-        _v = ',\n  '.join([''.join([str(VFFSL(SL,"generatorName",True)),u'_seeds[',str(VFFSL(SL,"i",True)),u']+(0',str(VFFSL(SL,"seedOffset",True)),u')*',str(VFFSL(SL,"i",True)+1)]) for i in xrange(VFFSL(SL,"seedCount",True))]) # u"${',\\n  '.join([c'${generatorName}_seeds[$i]+(0${seedOffset})*${i+1}' for i in xrange($seedCount)])}" on line 96, col 3
-        if _v is not None: write(_filter(_v, rawExpr=u"${',\\n  '.join([c'${generatorName}_seeds[$i]+(0${seedOffset})*${i+1}' for i in xrange($seedCount)])}")) # from line 96, col 3.
+        _v = ',\n  '.join([''.join([str(VFFSL(SL,"generatorName",True)),u'_seeds[',str(VFFSL(SL,"i",True)),u']+(0',str(VFFSL(SL,"seedOffset",True)),u')*',str(VFFSL(SL,"i",True)+1)]) for i in xrange(VFFSL(SL,"seedCount",True))]) # u"${',\\n  '.join([c'${generatorName}_seeds[$i]+(0${seedOffset})*${i+1}' for i in xrange($seedCount)])}" on line 92, col 3
+        if _v is not None: write(_filter(_v, rawExpr=u"${',\\n  '.join([c'${generatorName}_seeds[$i]+(0${seedOffset})*${i+1}' for i in xrange($seedCount)])}")) # from line 92, col 3.
         write(u'''
 };
 ''')
@@ -285,41 +286,6 @@ srandomdev();
         return _dummyTrans and trans.response().getvalue() or ""
         
 
-    def runtimeGenerateSeeds(self, **KWS):
-
-
-
-        ## CHEETAH: generated from @def runtimeGenerateSeeds at line 101, col 1.
-        trans = KWS.get("trans")
-        if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
-            trans = self.transaction # is None unless self.awake() was called
-        if not trans:
-            trans = DummyTransaction()
-            _dummyTrans = True
-        else: _dummyTrans = False
-        write = trans.response().write
-        SL = self._CHEETAH__searchList
-        _filter = self._CHEETAH__currentFilter
-        
-        ########################################
-        ## START - generated method body
-        
-        write(u'''for (unsigned long _i0=0; _i0 < ''')
-        _v = VFFSL(SL,"seedCount",True) # u'${seedCount}' on line 102, col 33
-        if _v is not None: write(_filter(_v, rawExpr=u'${seedCount}')) # from line 102, col 33.
-        write(u'''; _i0++)
-  ''')
-        _v = VFFSL(SL,"generatorName",True) # u'${generatorName}' on line 103, col 3
-        if _v is not None: write(_filter(_v, rawExpr=u'${generatorName}')) # from line 103, col 3.
-        write(u'''_seeds[_i0] = (uint32_t)random();
-''')
-        
-        ########################################
-        ## END - generated method body
-        
-        return _dummyTrans and trans.response().getvalue() or ""
-        
-
     def xsilOutputInfo(self, dict, **KWS):
 
 
@@ -329,7 +295,7 @@ srandomdev();
         the same results.
         """
 
-        ## CHEETAH: generated from @def xsilOutputInfo($dict) at line 106, col 1.
+        ## CHEETAH: generated from @def xsilOutputInfo($dict) at line 97, col 1.
         trans = KWS.get("trans")
         if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)):
             trans = self.transaction # is None unless self.awake() was called
@@ -347,25 +313,25 @@ srandomdev();
         # 
         fp = dict['fp']
         # 
-        if len(VFFSL(SL,"seedArray",True)): # generated from line 115, col 3
+        if len(VFFSL(SL,"seedArray",True)): # generated from line 106, col 3
             return
         # 
         write(u'''fprintf(''')
-        _v = VFFSL(SL,"fp",True) # u'$fp' on line 119, col 9
-        if _v is not None: write(_filter(_v, rawExpr=u'$fp')) # from line 119, col 9.
+        _v = VFFSL(SL,"fp",True) # u'$fp' on line 110, col 9
+        if _v is not None: write(_filter(_v, rawExpr=u'$fp')) # from line 110, col 9.
         write(u''', "\\nNo seeds were provided for noise vector \'''')
-        _v = VFFSL(SL,"parent.parent.name",True) # u'${parent.parent.name}' on line 119, col 58
-        if _v is not None: write(_filter(_v, rawExpr=u'${parent.parent.name}')) # from line 119, col 58.
+        _v = VFFSL(SL,"parent.parent.name",True) # u'${parent.parent.name}' on line 110, col 58
+        if _v is not None: write(_filter(_v, rawExpr=u'${parent.parent.name}')) # from line 110, col 58.
         write(u'''\'. The seeds generated were:\\n");
 fprintf(''')
-        _v = VFFSL(SL,"fp",True) # u'$fp' on line 120, col 9
-        if _v is not None: write(_filter(_v, rawExpr=u'$fp')) # from line 120, col 9.
+        _v = VFFSL(SL,"fp",True) # u'$fp' on line 111, col 9
+        if _v is not None: write(_filter(_v, rawExpr=u'$fp')) # from line 111, col 9.
         write(u''', "    ''')
-        _v = ', '.join(['%u' for _ in xrange(VFFSL(SL,"seedCount",True))]) # u"${', '.join(['%u' for _ in xrange($seedCount)])}" on line 120, col 19
-        if _v is not None: write(_filter(_v, rawExpr=u"${', '.join(['%u' for _ in xrange($seedCount)])}")) # from line 120, col 19.
+        _v = ', '.join(['%u' for _ in xrange(VFFSL(SL,"seedCount",True))]) # u"${', '.join(['%u' for _ in xrange($seedCount)])}" on line 111, col 19
+        if _v is not None: write(_filter(_v, rawExpr=u"${', '.join(['%u' for _ in xrange($seedCount)])}")) # from line 111, col 19.
         write(u'''\\n", ''')
-        _v = ', '.join([''.join([str(VFFSL(SL,"generatorName",True)),u'_seeds[',str(VFFSL(SL,"i",True)),u']']) for i in xrange(VFFSL(SL,"seedCount",True))]) # u"${', '.join([c'${generatorName}_seeds[$i]' for i in xrange($seedCount)])}" on line 120, col 72
-        if _v is not None: write(_filter(_v, rawExpr=u"${', '.join([c'${generatorName}_seeds[$i]' for i in xrange($seedCount)])}")) # from line 120, col 72.
+        _v = ', '.join([''.join([str(VFFSL(SL,"generatorName",True)),u'_seeds[',str(VFFSL(SL,"i",True)),u']']) for i in xrange(VFFSL(SL,"seedCount",True))]) # u"${', '.join([c'${generatorName}_seeds[$i]' for i in xrange($seedCount)])}" on line 111, col 72
+        if _v is not None: write(_filter(_v, rawExpr=u"${', '.join([c'${generatorName}_seeds[$i]' for i in xrange($seedCount)])}")) # from line 111, col 72.
         write(u''');
 ''')
         
@@ -422,7 +388,6 @@ fprintf(''')
         #  We only need to seed the system random number generator once, even if there are multiple Generator objects.
         write(u'''
 
-
 ''')
         
         ########################################
diff --git a/xpdeint/Stochastic/Generators/Generator.tmpl b/xpdeint/Stochastic/Generators/Generator.tmpl
index 5fe2af5..1d07931 100644
--- a/xpdeint/Stochastic/Generators/Generator.tmpl
+++ b/xpdeint/Stochastic/Generators/Generator.tmpl
@@ -43,7 +43,6 @@ ${seedSystemRandomNumberGenerator}@slurp
     @set $seedGenerationDict = {'extraIndent': 0}
 ${insertCodeForFeatures('runtimeSeedGenerationBegin', $featureOrdering, $seedGenerationDict)}@slurp
     @silent extraIndent = seedGenerationDict['extraIndent']
-${runtimeGenerateSeeds, extraIndent = extraIndent}@slurp
 ${insertCodeForFeaturesInReverseOrder('runtimeSeedGenerationEnd', $featureOrdering, $seedGenerationDict)}@slurp
   @else
     @for seedIdx, seed in enumerate($seedArray)
@@ -56,32 +55,29 @@ ${generatorName}_seeds[$seedIdx] = $seed;
 @# We only need to seed the system random number generator once, even if there are multiple Generator objects.
 @@callOnceGuard
 @def seedSystemRandomNumberGenerator
-#if HAVE_SRANDOMDEV
-srandomdev();
-#elif HAVE_DEV_URANDOM
-{
-  size_t __state_size = 256;
-  char __state[__state_size];
-  unsigned __seed;
+#if HAVE_DEV_URANDOM
+  uint32_t __seeds[10];
   FILE *__urandom_fp = fopen("/dev/urandom", "r");
+
   if (__urandom_fp == NULL) {
-    _LOG(_ERROR_LOG_LEVEL, "Unable to seed random number generator from /dev/urandom.  Is it accessible?\n");
-    // Implicit quit
-  }
-  size_t __bytes_read = 0;
-  __bytes_read = fread(&__seed, sizeof(__seed), 1, __urandom_fp);
-  if (__bytes_read != 1) {
-    _LOG(_ERROR_LOG_LEVEL, "Unable to read from /dev/urandom while seeding the random number generator.\n");
-    // Implicit quit
+      _LOG(_ERROR_LOG_LEVEL, "Unable to seed random number generator from /dev/urandom.  Is it accessible?\n");
+      // Implicit quit
   }
-  __bytes_read = fread(__state, sizeof(__state), 1, __urandom_fp);
-  if (__bytes_read != 1) {
+
+  size_t __entries_read = 0;
+  __entries_read = fread(__seeds, sizeof(uint32_t), 10, __urandom_fp);
+
+  if (__entries_read != 10) {
     _LOG(_ERROR_LOG_LEVEL, "Unable to read from /dev/urandom while seeding the random number generator.\n");
-    // Implicit quit
+      // Implicit quit
   }
+
   fclose(__urandom_fp);
-  initstate(__seed, __state, __state_size);
-}
+
+  for (unsigned long _i0=0; _i0 < ${seedCount}; _i0++) {
+    ${generatorName}_seeds[_i0] = (uint32_t) __seeds[_i0];
+  }
+
 #else
 #error Do not have a run-time random number source! Please supply seeds manually.
 #endif
@@ -98,11 +94,6 @@ uint32_t ${generatorName}_local_seeds[${seedCount}] = {
   @#
 @end def
 
- at def runtimeGenerateSeeds
-for (unsigned long _i0=0; _i0 < ${seedCount}; _i0++)
-  ${generatorName}_seeds[_i0] = (uint32_t)random();
- at end def
-
 @def xsilOutputInfo($dict)
 @*doc:
 Write to the XSIL file lines naming the seeds that we generated if no seed was provided
diff --git a/xpdeint/Stochastic/Generators/MKLGenerator.py b/xpdeint/Stochastic/Generators/MKLGenerator.py
index 26bbad8..181e7ba 100644
--- a/xpdeint/Stochastic/Generators/MKLGenerator.py
+++ b/xpdeint/Stochastic/Generators/MKLGenerator.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.828101
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/Generators/MKLGenerator.tmpl'
+__CHEETAH_genTime__ = 1484975072.783143
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/Generators/MKLGenerator.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug 28 15:52:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/Generators/POSIXGenerator.py b/xpdeint/Stochastic/Generators/POSIXGenerator.py
index c252299..d47f6e1 100644
--- a/xpdeint/Stochastic/Generators/POSIXGenerator.py
+++ b/xpdeint/Stochastic/Generators/POSIXGenerator.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.882703
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/Generators/POSIXGenerator.tmpl'
+__CHEETAH_genTime__ = 1484975072.772761
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/Generators/POSIXGenerator.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Aug 29 13:13:17 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/Generators/SolirteGenerator.py b/xpdeint/Stochastic/Generators/SolirteGenerator.py
index b32d087..b9e7a47 100644
--- a/xpdeint/Stochastic/Generators/SolirteGenerator.py
+++ b/xpdeint/Stochastic/Generators/SolirteGenerator.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.90816
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/Generators/SolirteGenerator.tmpl'
+__CHEETAH_genTime__ = 1484975072.792762
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/Generators/SolirteGenerator.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Aug 28 15:52:21 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.py b/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.py
index e03e10a..d2e12e2 100644
--- a/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.911161
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.803441
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/GaussianBoxMuellerRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.py b/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.py
index 30add0e..5effe26 100644
--- a/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.925753
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.796707
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/GaussianMKLRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.py b/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.py
index 6b3c289..714f8f6 100644
--- a/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.935407
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.827983
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/GaussianRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -162,12 +162,12 @@ class GaussianRandomVariable(ScriptElement):
         # 
         nonUniformDimReps = noiseVector.nonUniformDimReps
         if nonUniformDimReps: # generated from line 67, col 3
-            ## START CAPTURE REGION: _64093251 loopString at line 68, col 5 in the source.
-            _orig_trans_64093251 = trans
-            _wasBuffering_64093251 = self._CHEETAH__isBuffering
+            ## START CAPTURE REGION: _79359235 loopString at line 68, col 5 in the source.
+            _orig_trans_79359235 = trans
+            _wasBuffering_79359235 = self._CHEETAH__isBuffering
             self._CHEETAH__isBuffering = True
-            trans = _captureCollector_64093251 = DummyTransaction()
-            write = _captureCollector_64093251.response().write
+            trans = _captureCollector_79359235 = DummyTransaction()
+            write = _captureCollector_79359235.response().write
             fixupString = ' * '.join(''.join([str(VFFSL(SL,"dimRep.stepSizeArrayName",True)),u'_invsqrt[',str(VFFSL(SL,"dimRep.index",True)),u' + ',str(VFFSL(SL,"dimRep.localOffset",True)),u']']) for dimRep in nonUniformDimReps)
             for component in noiseVector.components: # generated from line 70, col 7
                 _v = VFFSL(SL,"component",True) # u'${component}' on line 71, col 1
@@ -177,13 +177,13 @@ class GaussianRandomVariable(ScriptElement):
                 if _v is not None: write(_filter(_v, rawExpr=u'${fixupString}')) # from line 71, col 17.
                 write(u''';
 ''')
-            trans = _orig_trans_64093251
+            trans = _orig_trans_79359235
             write = trans.response().write
-            self._CHEETAH__isBuffering = _wasBuffering_64093251 
-            loopString = _captureCollector_64093251.response().getvalue()
-            del _orig_trans_64093251
-            del _captureCollector_64093251
-            del _wasBuffering_64093251
+            self._CHEETAH__isBuffering = _wasBuffering_79359235 
+            loopString = _captureCollector_79359235.response().getvalue()
+            del _orig_trans_79359235
+            del _captureCollector_79359235
+            del _wasBuffering_79359235
             _v = VFFSL(SL,"loopOverFieldInBasisWithVectorsAndInnerContent",False)(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString) # u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}' on line 74, col 1
             if _v is not None: write(_filter(_v, rawExpr=u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}')) # from line 74, col 1.
         # 
diff --git a/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.py b/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.py
index c5eba7f..4431ac5 100644
--- a/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.94328
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.832036
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/GaussianSolirteRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.py b/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.py
index 2e970db..408707e 100644
--- a/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.py
@@ -34,9 +34,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.104892
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.845517
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/PoissonianRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sun Feb 12 20:15:16 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -104,12 +104,12 @@ const real _old_volume = (''')
         write(u''' * _old_step);
 
 ''')
-        ## START CAPTURE REGION: _75877951 loopString at line 39, col 3 in the source.
-        _orig_trans_75877951 = trans
-        _wasBuffering_75877951 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _76188373 loopString at line 39, col 3 in the source.
+        _orig_trans_76188373 = trans
+        _wasBuffering_76188373 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_75877951 = DummyTransaction()
-        write = _captureCollector_75877951.response().write
+        trans = _captureCollector_76188373 = DummyTransaction()
+        write = _captureCollector_76188373.response().write
         nonUniformDimReps = noiseVector.nonUniformDimReps
         if nonUniformDimReps: # generated from line 41, col 5
             volumeFixup = ' * '.join('%s * (%s)' % (dimRep.stepSize, dimRep.volumePrefactor) for dimRep in nonUniformDimReps)
@@ -138,13 +138,13 @@ const real _old_volume = (''')
             if _v is not None: write(_filter(_v, rawExpr=u'${volumeFixup}')) # from line 50, col 172.
             write(u'''));
 ''')
-        trans = _orig_trans_75877951
+        trans = _orig_trans_76188373
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_75877951 
-        loopString = _captureCollector_75877951.response().getvalue()
-        del _orig_trans_75877951
-        del _captureCollector_75877951
-        del _wasBuffering_75877951
+        self._CHEETAH__isBuffering = _wasBuffering_76188373 
+        loopString = _captureCollector_76188373.response().getvalue()
+        del _orig_trans_76188373
+        del _captureCollector_76188373
+        del _wasBuffering_76188373
         _v = VFFSL(SL,"loopOverFieldInBasisWithVectorsAndInnerContent",False)(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString) # u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}' on line 53, col 1
         if _v is not None: write(_filter(_v, rawExpr=u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}')) # from line 53, col 1.
         write(u'''
@@ -193,12 +193,12 @@ const real _old_volume = (''')
         write(u''';
 const real _var = 1.0 / _dVdt;
 ''')
-        ## START CAPTURE REGION: _38136206 loopString at line 74, col 3 in the source.
-        _orig_trans_38136206 = trans
-        _wasBuffering_38136206 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _32952511 loopString at line 74, col 3 in the source.
+        _orig_trans_32952511 = trans
+        _wasBuffering_32952511 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_38136206 = DummyTransaction()
-        write = _captureCollector_38136206.response().write
+        trans = _captureCollector_32952511 = DummyTransaction()
+        write = _captureCollector_32952511.response().write
         nonUniformDimReps = noiseVector.nonUniformDimReps
         if nonUniformDimReps: # generated from line 76, col 5
             volumeFixup = ' * '.join('%s * (%s)' % (dimRep.stepSize, dimRep.volumePrefactor) for dimRep in nonUniformDimReps)
@@ -224,13 +224,13 @@ const real _var = 1.0 / _dVdt;
             if _v is not None: write(_filter(_v, rawExpr=u'${volumeFixup}')) # from line 85, col 84.
             write(u''');
 ''')
-        trans = _orig_trans_38136206
+        trans = _orig_trans_32952511
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_38136206 
-        loopString = _captureCollector_38136206.response().getvalue()
-        del _orig_trans_38136206
-        del _captureCollector_38136206
-        del _wasBuffering_38136206
+        self._CHEETAH__isBuffering = _wasBuffering_32952511 
+        loopString = _captureCollector_32952511.response().getvalue()
+        del _orig_trans_32952511
+        del _captureCollector_32952511
+        del _wasBuffering_32952511
         _v = VFFSL(SL,"loopOverFieldInBasisWithVectorsAndInnerContent",False)(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString) # u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}' on line 88, col 1
         if _v is not None: write(_filter(_v, rawExpr=u'${loopOverFieldInBasisWithVectorsAndInnerContent(noiseVector.field, noiseVector.initialBasis, [noiseVector], loopString)}')) # from line 88, col 1.
         # 
diff --git a/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.py b/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.py
index f6a4300..d8b6d09 100644
--- a/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.py
+++ b/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.977432
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.tmpl'
+__CHEETAH_genTime__ = 1484975072.835361
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Stochastic/RandomVariables/UniformRandomVariable.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/ComputedVector.py b/xpdeint/Vectors/ComputedVector.py
index 7946eaa..17e7f3e 100644
--- a/xpdeint/Vectors/ComputedVector.py
+++ b/xpdeint/Vectors/ComputedVector.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234540.964448
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:00 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/ComputedVector.tmpl'
+__CHEETAH_genTime__ = 1484975072.866232
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/ComputedVector.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/NoiseVector.py b/xpdeint/Vectors/NoiseVector.py
index 1752029..f933511 100644
--- a/xpdeint/Vectors/NoiseVector.py
+++ b/xpdeint/Vectors/NoiseVector.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.036245
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/NoiseVector.tmpl'
+__CHEETAH_genTime__ = 1484975072.857399
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/NoiseVector.tmpl'
 __CHEETAH_srcLastModified__ = 'Sat Feb  4 18:39:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/VectorElement.py b/xpdeint/Vectors/VectorElement.py
index d9dbd17..dd2e306 100644
--- a/xpdeint/Vectors/VectorElement.py
+++ b/xpdeint/Vectors/VectorElement.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.067024
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/VectorElement.tmpl'
+__CHEETAH_genTime__ = 1484975072.88735
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/VectorElement.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri May 25 16:30:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
@@ -495,12 +495,12 @@ _active_''')
             modFunction = 'abs'
         else: # generated from line 134, col 3
             modFunction = 'mod2'
-        ## START CAPTURE REGION: _56551091 loopContents at line 137, col 3 in the source.
-        _orig_trans_56551091 = trans
-        _wasBuffering_56551091 = self._CHEETAH__isBuffering
+        ## START CAPTURE REGION: _96124288 loopContents at line 137, col 3 in the source.
+        _orig_trans_96124288 = trans
+        _wasBuffering_96124288 = self._CHEETAH__isBuffering
         self._CHEETAH__isBuffering = True
-        trans = _captureCollector_56551091 = DummyTransaction()
-        write = _captureCollector_56551091.response().write
+        trans = _captureCollector_96124288 = DummyTransaction()
+        write = _captureCollector_96124288.response().write
         write(u'''real _current_size = ''')
         _v = VFFSL(SL,"modFunction",True) # u'${modFunction}' on line 138, col 22
         if _v is not None: write(_filter(_v, rawExpr=u'${modFunction}')) # from line 138, col 22.
@@ -514,13 +514,13 @@ if (_current_size > ''')
         if _v is not None: write(_filter(_v, rawExpr=u'${variableName}')) # from line 140, col 3.
         write(u''' = _current_size;
 ''')
-        trans = _orig_trans_56551091
+        trans = _orig_trans_96124288
         write = trans.response().write
-        self._CHEETAH__isBuffering = _wasBuffering_56551091 
-        loopContents = _captureCollector_56551091.response().getvalue()
-        del _orig_trans_56551091
-        del _captureCollector_56551091
-        del _wasBuffering_56551091
+        self._CHEETAH__isBuffering = _wasBuffering_96124288 
+        loopContents = _captureCollector_96124288.response().getvalue()
+        del _orig_trans_96124288
+        del _captureCollector_96124288
+        del _wasBuffering_96124288
         _v = VFFSL(SL,"loopOverVectorsWithInnerContentTemplate",False)([self], loopContents, basis = basis) # u'${loopOverVectorsWithInnerContentTemplate([self], loopContents, basis = basis)}' on line 142, col 1
         if _v is not None: write(_filter(_v, rawExpr=u'${loopOverVectorsWithInnerContentTemplate([self], loopContents, basis = basis)}')) # from line 142, col 1.
         if VFFSL(SL,"type",True) == 'complex': # generated from line 143, col 3
diff --git a/xpdeint/Vectors/VectorInitialisation.py b/xpdeint/Vectors/VectorInitialisation.py
index 54faf65..6336516 100644
--- a/xpdeint/Vectors/VectorInitialisation.py
+++ b/xpdeint/Vectors/VectorInitialisation.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.042391
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/VectorInitialisation.tmpl'
+__CHEETAH_genTime__ = 1484975072.892454
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/VectorInitialisation.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri May 25 16:30:07 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/VectorInitialisationFromCDATA.py b/xpdeint/Vectors/VectorInitialisationFromCDATA.py
index 5fddcd7..64985e1 100644
--- a/xpdeint/Vectors/VectorInitialisationFromCDATA.py
+++ b/xpdeint/Vectors/VectorInitialisationFromCDATA.py
@@ -33,9 +33,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.163727
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/VectorInitialisationFromCDATA.tmpl'
+__CHEETAH_genTime__ = 1484975072.898797
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:32 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/VectorInitialisationFromCDATA.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri May 25 16:17:13 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/VectorInitialisationFromHDF5.py b/xpdeint/Vectors/VectorInitialisationFromHDF5.py
index 66fd07f..d6d1557 100644
--- a/xpdeint/Vectors/VectorInitialisationFromHDF5.py
+++ b/xpdeint/Vectors/VectorInitialisationFromHDF5.py
@@ -35,9 +35,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.261749
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/Vectors/VectorInitialisationFromHDF5.tmpl'
+__CHEETAH_genTime__ = 1484975073.037241
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:33 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/Vectors/VectorInitialisationFromHDF5.tmpl'
 __CHEETAH_srcLastModified__ = 'Fri May 25 16:17:13 2012'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/Vectors/VectorInitialisationFromXSIL.tmpl b/xpdeint/Vectors/VectorInitialisationFromXSIL.tmpl
index 49790b6..f979040 100644
--- a/xpdeint/Vectors/VectorInitialisationFromXSIL.tmpl
+++ b/xpdeint/Vectors/VectorInitialisationFromXSIL.tmpl
@@ -136,7 +136,7 @@ static inline double XMDSSwapDouble(double __arg)
   @end if
 }
 
-char **_dimNames  = new char* [_${vector.field.name}_ndims];
+const char **_dimNames  = new const char* [_${vector.field.name}_ndims];
 double *_dimDelta = new double[_${vector.field.name}_ndims];
 double *_dimMin   = new double[_${vector.field.name}_ndims];
 unsigned long *_dimLattice = new unsigned long[_${vector.field.name}_ndims];
@@ -154,7 +154,7 @@ _dimLattice[$dimensionNumber] = ${dimRep.globalLattice};
   @if $vector.type == 'complex'
     @set $componentNameSizePrefix = '2 * '
   @end if
-char **_componentNames = new char*[${componentNameSizePrefix}_${vector.id}_ncomponents + 1];
+const char **_componentNames = new const char*[${componentNameSizePrefix}_${vector.id}_ncomponents + 1];
 int *_componentFieldIndices = new int[${componentNameSizePrefix}_${vector.id}_ncomponents];
 
   @set $componentNameIndex = 0
diff --git a/xpdeint/Version.py b/xpdeint/Version.py
index e1b1fbe..b3c8aa5 100644
--- a/xpdeint/Version.py
+++ b/xpdeint/Version.py
@@ -1,4 +1,4 @@
 #!/usr/bin/env python
 # encoding: utf-8
 """This is generated by the makefile via the shell program \'version.sh\'"""
-subversionRevisionString ="r2966"
+subversionRevisionString ="r2989"
diff --git a/xpdeint/XMDS2Parser.py b/xpdeint/XMDS2Parser.py
index 93b0fb3..ac5f62e 100755
--- a/xpdeint/XMDS2Parser.py
+++ b/xpdeint/XMDS2Parser.py
@@ -159,6 +159,8 @@ class XMDS2Parser(ScriptParser):
     
     self.parseTopLevelSequenceElement(simulationElement)
     
+    self.parseSimulationFilterElements(simulationElement, None)
+
     self.parseOutputElement(simulationElement)
     
   
@@ -1364,7 +1366,7 @@ Use feature <validation kind="run-time"/> to allow for arbitrary code.""" % loca
         # Add the operator container to the filter segment
         filterSegmentTemplate.operatorContainers.append(operatorContainer)
         # parse the filter operator
-        filterOperator = self.parseFilterOperator(childNode, operatorContainer)
+        filterOperator = self.parseFilterOperator(childNode, operatorContainer, forceOnlyWhenCalled = False)
       elif tagName == 'breakpoint':
         # Construct the breakpoint segment
         breakpointSegmentTemplate = BreakpointSegmentTemplate(xmlElement = childNode,
@@ -1560,7 +1562,15 @@ Use feature <validation kind="run-time"/> to allow for arbitrary code.""" % loca
       
       steps = int(stepsString)
       integratorTemplate.stepCount = steps
-    
+    else:
+      # There is no steps attribute, but we didn't barf at the check above for fixed step integrators.
+      # Therefore we have an adaptive stepper with no steps specified.
+      # This can cause problems as this means the initial step will be taken as the entire
+      # integration interval. 
+      # To fix this, give a plausible number of steps.
+      integratorTemplate.stepCount = 1000;
+
+
     samplesElement = integrateElement.getChildElementByTagName('samples', optional=True)
     if samplesElement:
         samplesString = samplesElement.innerText()
@@ -1615,11 +1625,30 @@ Use feature <validation kind="run-time"/> to allow for arbitrary code.""" % loca
       operatorContainer = None
     
     for filterElement in filterElements:
-      filterTemplate = self.parseFilterOperator(filterElement, operatorContainer)
+      filterTemplate = self.parseFilterOperator(filterElement, operatorContainer, forceOnlyWhenCalled = False)
     
     return operatorContainer
   
-  def parseFilterOperator(self, filterElement, parentTemplate):
+  def parseSimulationFilterElements(self, simulationElement, parent):
+    filterElements = simulationElement.getChildElementsByTagName('filter', optional = True)
+    results =[]
+    
+    for filterElement in filterElements:
+      # Construct the filter segment
+      filterSegmentTemplate = FilterSegmentTemplate(xmlElement = filterElement,
+                                                    **self.argumentsToTemplateConstructors)
+      # Create an operator container to house the filter operator
+      operatorContainer = OperatorContainerTemplate(parent = filterSegmentTemplate,
+                                                    **self.argumentsToTemplateConstructors)
+      # Add the operator container to the filter segment
+      filterSegmentTemplate.operatorContainers.append(operatorContainer)
+      # parse the filter operator
+      
+      filterOperator = self.parseFilterOperator(filterElement, operatorContainer, forceOnlyWhenCalled = True) 
+    
+    return results
+    
+  def parseFilterOperator(self, filterElement, parentTemplate, forceOnlyWhenCalled):
     filterName = filterElement.getAttribute('name')
     
     if filterName:
@@ -1631,10 +1660,37 @@ Use feature <validation kind="run-time"/> to allow for arbitrary code.""" % loca
         ## Make sure no-one else takes the name
         self.globalNameSpace['symbolNames'].add(filterName)
     
+    
     filterTemplate = FilterOperatorTemplate(parent = parentTemplate,
                                             xmlElement = filterElement, name = filterName,
                                             **self.argumentsToTemplateConstructors)
     
+    if filterElement.hasAttribute('only_when_called'):
+      if not filterName:
+          raise ParserException(filterElement, "Filters that are only called explicitly must be named.")
+      if filterElement.getAttribute('only_when_called').strip().lower() == 'yes':
+        filterTemplate.parent.parent.onlyWhenCalled = True
+        if not forceOnlyWhenCalled:
+            parserWarning(
+              filterElement,
+              "You have tried to stop this filter activating (using only_when_called = 'yes'), "
+              "but you placed that filter where it should be activated. "
+              "Have you made an error?"
+            )
+      elif filterElement.getAttribute('only_when_called').strip().lower() == 'no':
+        filterTemplate.parent.parent.onlyWhenCalled = forceOnlyWhenCalled
+        if forceOnlyWhenCalled:
+            parserWarning(
+              filterElement,
+              "You have tried to ask this filter to activate in sequence (using only_when_called = 'no'), "
+              "but you placed that filter where that does not make sense. "
+              "Have you made an error?"
+            )
+      else:
+        raise ParserException(filterElement, "Attribute 'only_when_called' should be either 'yes' or 'no'.")
+    else:
+        filterTemplate.parent.parent.onlyWhenCalled = forceOnlyWhenCalled
+    
     codeBlock = _UserLoopCodeBlock(field = None, xmlElement = filterElement,
                                    parent = filterTemplate, **self.argumentsToTemplateConstructors)
     codeBlock.dependenciesEntity = self.parseDependencies(filterElement, optional=True)
diff --git a/xpdeint/XSILFile.py b/xpdeint/XSILFile.py
index 75edc31..d445bc9 100644
--- a/xpdeint/XSILFile.py
+++ b/xpdeint/XSILFile.py
@@ -117,7 +117,7 @@ class XSILDataBinary(XSILData):
     
     for independentVariable in self.independentVariables:
       size = numpy.fromfile(fd, dtype=ulongDType, count=1)
-      independentGeometry.append(size)
+      independentGeometry.append(numpy.asscalar(size))
       assert size == independentVariable['length']
       a = numpy.fromfile(fd, dtype=floatDType, count=size)
       independentVariable['array'] = a
diff --git a/xpdeint/includes/xpdeint.h b/xpdeint/includes/xpdeint.h
index 33d7715..fe994f4 100644
--- a/xpdeint/includes/xpdeint.h
+++ b/xpdeint/includes/xpdeint.h
@@ -41,8 +41,8 @@ inline XMDSComplexType operator-(const int b, const XMDSComplexType& a) { return
 
 
 extern bool initialiseFieldFromXSILFile(const char *filename,
-   const char *mgName, unsigned long dimension, char **dimNames,
-   char **componentNames,
+   const char *mgName, unsigned long dimension, const char **dimNames,
+   const char **componentNames,
    // output variables
    char**binaryDataFilename, int *unsignedLongSize,
    bool *dataEncodingIsNative, bool *isPrecisionDouble,
diff --git a/xpdeint/support/wscript b/xpdeint/support/wscript
index f81fa63..6932e4a 100755
--- a/xpdeint/support/wscript
+++ b/xpdeint/support/wscript
@@ -229,7 +229,6 @@ def configure(conf):
             check_cxx(
                 cxxflags=['-fno-unsafe-math-optimizations', '-fno-finite-math-only'],
                 uselib_store="safe_math",
-                uselib='optimise',
                 msg = "Checking for cautious math flags"
             )
             
diff --git a/xpdeint/support/xpdeint.rnc b/xpdeint/support/xpdeint.rnc
index 031a47c..6abbbcb 100644
--- a/xpdeint/support/xpdeint.rnc
+++ b/xpdeint/support/xpdeint.rnc
@@ -10,6 +10,7 @@ Simulation = element simulation {
         | Geometry
         | Driver
         | Vector
+        | Filter
         | ComputedVector
         | NoiseVector
         | Sequence
@@ -243,9 +244,10 @@ CrossPropagationOperatorContents =
       )+
 
 Filter = element filter {
-    attribute name { text }?
-    & Dependencies?
-    & text
+    attribute name { text }?, 
+    attribute only_when_called { Bool }?
+    , Dependencies?
+    , text
 }
 
 Breakpoint = element breakpoint {
diff --git a/xpdeint/support/xpdeint.rng b/xpdeint/support/xpdeint.rng
index 51ecf83..3e8a450 100644
--- a/xpdeint/support/xpdeint.rng
+++ b/xpdeint/support/xpdeint.rng
@@ -24,6 +24,7 @@
           <ref name="Geometry"/>
           <ref name="Driver"/>
           <ref name="Vector"/>
+          <ref name="Filter"/>
           <ref name="ComputedVector"/>
           <ref name="NoiseVector"/>
           <ref name="Sequence"/>
@@ -492,15 +493,18 @@
   </define>
   <define name="Filter">
     <element name="filter">
-      <interleave>
-        <optional>
-          <attribute name="name"/>
-        </optional>
-        <optional>
-          <ref name="Dependencies"/>
-        </optional>
-        <text/>
-      </interleave>
+      <optional>
+        <attribute name="name"/>
+      </optional>
+      <optional>
+        <attribute name="only_when_called">
+          <ref name="Bool"/>
+        </attribute>
+      </optional>
+      <optional>
+        <ref name="Dependencies"/>
+      </optional>
+      <text/>
     </element>
   </define>
   <define name="Breakpoint">
diff --git a/xpdeint/xsil2graphics2/MathematicaImport.py b/xpdeint/xsil2graphics2/MathematicaImport.py
index edcf236..57f28a3 100644
--- a/xpdeint/xsil2graphics2/MathematicaImport.py
+++ b/xpdeint/xsil2graphics2/MathematicaImport.py
@@ -32,9 +32,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.280902
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/xsil2graphics2/MathematicaImport.tmpl'
+__CHEETAH_genTime__ = 1484975073.013554
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:33 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/xsil2graphics2/MathematicaImport.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Jun  5 14:30:43 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/xsil2graphics2/MatlabOctaveImport.py b/xpdeint/xsil2graphics2/MatlabOctaveImport.py
index 92e1f9a..df12b3a 100644
--- a/xpdeint/xsil2graphics2/MatlabOctaveImport.py
+++ b/xpdeint/xsil2graphics2/MatlabOctaveImport.py
@@ -32,9 +32,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.385449
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/xsil2graphics2/MatlabOctaveImport.tmpl'
+__CHEETAH_genTime__ = 1484975073.005032
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:33 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/xsil2graphics2/MatlabOctaveImport.tmpl'
 __CHEETAH_srcLastModified__ = 'Thu Nov 21 19:01:13 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/xsil2graphics2/PythonImport.py b/xpdeint/xsil2graphics2/PythonImport.py
index deaa553..ab08aff 100644
--- a/xpdeint/xsil2graphics2/PythonImport.py
+++ b/xpdeint/xsil2graphics2/PythonImport.py
@@ -32,9 +32,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.362603
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/xsil2graphics2/PythonImport.tmpl'
+__CHEETAH_genTime__ = 1484975073.056371
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:33 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/xsil2graphics2/PythonImport.tmpl'
 __CHEETAH_srcLastModified__ = 'Sun Jul 28 14:51:41 2013'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 
diff --git a/xpdeint/xsil2graphics2/RImport.py b/xpdeint/xsil2graphics2/RImport.py
index fcbe2de..2123097 100644
--- a/xpdeint/xsil2graphics2/RImport.py
+++ b/xpdeint/xsil2graphics2/RImport.py
@@ -32,9 +32,9 @@ VFN=valueForName
 currentTime=time.time
 __CHEETAH_version__ = '2.4.4'
 __CHEETAH_versionTuple__ = (2, 4, 4, 'development', 0)
-__CHEETAH_genTime__ = 1413234541.345634
-__CHEETAH_genTimestamp__ = 'Tue Oct 14 08:09:01 2014'
-__CHEETAH_src__ = '/Users/graham/Library/XMDS/src/xmds2/admin/staging/xmds-2.2.2/xpdeint/xsil2graphics2/RImport.tmpl'
+__CHEETAH_genTime__ = 1484975073.049023
+__CHEETAH_genTimestamp__ = 'Sat Jan 21 16:04:33 2017'
+__CHEETAH_src__ = '/home/mattias/xmds-2.2.3/admin/staging/xmds-2.2.3/xpdeint/xsil2graphics2/RImport.tmpl'
 __CHEETAH_srcLastModified__ = 'Wed Jan  8 13:35:53 2014'
 __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine'
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/xmds2.git



More information about the debian-science-commits mailing list