From a5d66d7f41d475f2f785adc8d3c3447f57d9de51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 7 Apr 2024 04:42:05 +0000 Subject: [PATCH] Deploy to GitHub pages --- .buildinfo | 4 + .nojekyll | 0 .../auto_examples_python.zip | Bin 0 -> 33217 bytes .../example_01_basic_usage.ipynb | 346 + .../example_05_misc_stats.py | 69 + .../example_05_misc_stats.ipynb | 108 + .../auto_examples_jupyter.zip | Bin 0 -> 47726 bytes .../example_03_posthoc.py | 150 + .../example_04_simulating_data.ipynb | 230 + .../example_04_simulating_data.py | 108 + .../example_02_categorical.ipynb | 262 + .../example_01_basic_usage.py | 178 + .../example_02_categorical.py | 132 + .../example_03_posthoc.ipynb | 209 + .../sphx_glr_example_01_basic_usage_001.png | Bin 0 -> 62031 bytes .../sphx_glr_example_01_basic_usage_002.png | Bin 0 -> 19262 bytes .../sphx_glr_example_01_basic_usage_003.png | Bin 0 -> 194512 bytes .../sphx_glr_example_01_basic_usage_004.png | Bin 0 -> 18711 bytes .../sphx_glr_example_01_basic_usage_thumb.png | Bin 0 -> 52288 bytes .../sphx_glr_example_02_categorical_thumb.png | Bin 0 -> 26794 bytes _images/sphx_glr_example_03_posthoc_thumb.png | Bin 0 -> 26794 bytes ...x_glr_example_04_simulating_data_thumb.png | Bin 0 -> 26794 bytes .../sphx_glr_example_05_misc_stats_001.png | Bin 0 -> 21778 bytes .../sphx_glr_example_05_misc_stats_thumb.png | Bin 0 -> 15299 bytes _modules/index.html | 136 + _modules/pymer4/io.html | 188 + _modules/pymer4/models/Lm.html | 821 ++ _modules/pymer4/models/Lm2.html | 605 ++ _modules/pymer4/models/Lmer.html | 1810 +++++ _modules/pymer4/simulate.html | 433 ++ _modules/pymer4/stats.html | 847 ++ _modules/pymer4/utils.html | 796 ++ _sources/api.rst.txt | 59 + .../example_01_basic_usage.rst.txt | 681 ++ .../example_02_categorical.rst.txt | 568 ++ .../auto_examples/example_03_posthoc.rst.txt | 465 ++ .../example_04_simulating_data.rst.txt | 410 + .../example_05_misc_stats.rst.txt | 197 + _sources/auto_examples/index.rst.txt | 142 + .../auto_examples/sg_execution_times.rst.txt | 49 + _sources/citation.rst.txt | 4 + _sources/contributing.rst.txt | 86 + _sources/features.rst.txt | 46 + _sources/index.rst.txt | 88 + _sources/installation.rst.txt | 170 + _sources/new.rst.txt | 169 + _sources/rfx_cheatsheet.rst.txt | 24 + _sources/sg_execution_times.rst.txt | 49 + _static/basic.css | 921 +++ _static/binder_badge_logo.svg | 1 + .../css/bootstrap-responsive.css | 1109 +++ .../css/bootstrap-responsive.min.css | 9 + _static/bootstrap-2.3.2/css/bootstrap.css | 6167 +++++++++++++++ _static/bootstrap-2.3.2/css/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 0 -> 12799 bytes _static/bootstrap-2.3.2/js/bootstrap.js | 2287 ++++++ _static/bootstrap-2.3.2/js/bootstrap.min.js | 6 + .../bootstrap-3.4.1/css/bootstrap-theme.css | 587 ++ .../css/bootstrap-theme.css.map | 1 + .../css/bootstrap-theme.min.css | 6 + .../css/bootstrap-theme.min.css.map | 1 + _static/bootstrap-3.4.1/css/bootstrap.css | 6834 +++++++++++++++++ _static/bootstrap-3.4.1/css/bootstrap.css.map | 1 + _static/bootstrap-3.4.1/css/bootstrap.min.css | 6 + .../bootstrap-3.4.1/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes _static/bootstrap-3.4.1/js/bootstrap.js | 2580 +++++++ _static/bootstrap-3.4.1/js/bootstrap.min.js | 6 + _static/bootstrap-3.4.1/js/npm.js | 13 + _static/bootstrap-sphinx.css | 223 + _static/bootstrap-sphinx.js | 175 + .../bootswatch-2.3.2/amelia/bootstrap.min.css | 9 + .../cerulean/bootstrap.min.css | 9 + .../bootswatch-2.3.2/cosmo/bootstrap.min.css | 9 + .../bootswatch-2.3.2/cyborg/bootstrap.min.css | 9 + .../bootswatch-2.3.2/flatly/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../journal/bootstrap.min.css | 9 + .../readable/bootstrap.min.css | 9 + .../simplex/bootstrap.min.css | 9 + .../bootswatch-2.3.2/slate/bootstrap.min.css | 9 + .../spacelab/bootstrap.min.css | 9 + .../bootswatch-2.3.2/spruce/bootstrap.min.css | 9 + .../superhero/bootstrap.min.css | 9 + .../bootswatch-2.3.2/united/bootstrap.min.css | 9 + .../cerulean/bootstrap.min.css | 11 + .../bootswatch-3.4.1/cosmo/bootstrap.min.css | 11 + .../bootswatch-3.4.1/cyborg/bootstrap.min.css | 11 + .../bootswatch-3.4.1/darkly/bootstrap.min.css | 11 + .../bootswatch-3.4.1/flatly/bootstrap.min.css | 11 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../journal/bootstrap.min.css | 11 + .../bootswatch-3.4.1/lumen/bootstrap.min.css | 11 + .../bootswatch-3.4.1/paper/bootstrap.min.css | 11 + .../readable/bootstrap.min.css | 11 + .../sandstone/bootstrap.min.css | 11 + .../simplex/bootstrap.min.css | 11 + .../bootswatch-3.4.1/slate/bootstrap.min.css | 11 + .../spacelab/bootstrap.min.css | 11 + .../superhero/bootstrap.min.css | 11 + .../bootswatch-3.4.1/united/bootstrap.min.css | 11 + .../bootswatch-3.4.1/yeti/bootstrap.min.css | 11 + _static/broken_example.png | Bin 0 -> 21404 bytes _static/doctools.js | 156 + _static/documentation_options.js | 14 + _static/file.png | Bin 0 -> 286 bytes _static/js/jquery-1.12.4.min.js | 5 + _static/js/jquery-fix.js | 2 + _static/jupyterlite_badge_logo.svg | 3 + _static/language_data.js | 199 + _static/minus.png | Bin 0 -> 90 bytes _static/no_image.png | Bin 0 -> 4315 bytes _static/plus.png | Bin 0 -> 90 bytes _static/pygments.css | 75 + _static/searchtools.js | 566 ++ _static/sg_gallery-binder.css | 11 + _static/sg_gallery-dataframe.css | 47 + _static/sg_gallery-rendered-html.css | 224 + _static/sg_gallery.css | 342 + _static/sphinx_highlight.js | 144 + api.html | 1321 ++++ auto_examples/example_01_basic_usage.html | 483 ++ auto_examples/example_02_categorical.html | 511 ++ auto_examples/example_03_posthoc.html | 419 + auto_examples/example_04_simulating_data.html | 357 + auto_examples/example_05_misc_stats.html | 242 + auto_examples/index.html | 173 + auto_examples/sg_execution_times.html | 179 + citation.html | 139 + contributing.html | 224 + features.html | 191 + genindex.html | 401 + index.html | 189 + installation.html | 342 + new.html | 445 ++ objects.inv | Bin 0 -> 1172 bytes py-modindex.html | 169 + rfx_cheatsheet.html | 157 + search.html | 156 + searchindex.js | 1 + sg_execution_times.html | 179 + 151 files changed, 40517 insertions(+) create mode 100644 .buildinfo create mode 100644 .nojekyll create mode 100644 _downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip create mode 100644 _downloads/2f5ef11b55acdc3f7cfe565f64c3e9dd/example_01_basic_usage.ipynb create mode 100644 _downloads/31672caa1e5dfbc69355a6409f988161/example_05_misc_stats.py create mode 100644 _downloads/68269100b7536b0394ed8e929a3575ae/example_05_misc_stats.ipynb create mode 100644 _downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip create mode 100644 _downloads/70d6b9ce5a4ead51666a28dfea75fae5/example_03_posthoc.py create mode 100644 _downloads/917ffe7ddd07e7eee1cdabedcfce3a55/example_04_simulating_data.ipynb create mode 100644 _downloads/947a7f50199c9e20ecc24b24c789900c/example_04_simulating_data.py create mode 100644 _downloads/97b050c97268dd6fe761b7ee74f57e1d/example_02_categorical.ipynb create mode 100644 _downloads/b91a3847324823a0f43edeaa7b0869ae/example_01_basic_usage.py create mode 100644 _downloads/db00e21c01b8b58ae466b1e9ff23265b/example_02_categorical.py create mode 100644 _downloads/e7ef29a00a8623944961d93353aaeb69/example_03_posthoc.ipynb create mode 100644 _images/sphx_glr_example_01_basic_usage_001.png create mode 100644 _images/sphx_glr_example_01_basic_usage_002.png create mode 100644 _images/sphx_glr_example_01_basic_usage_003.png create mode 100644 _images/sphx_glr_example_01_basic_usage_004.png create mode 100644 _images/sphx_glr_example_01_basic_usage_thumb.png create mode 100644 _images/sphx_glr_example_02_categorical_thumb.png create mode 100644 _images/sphx_glr_example_03_posthoc_thumb.png create mode 100644 _images/sphx_glr_example_04_simulating_data_thumb.png create mode 100644 _images/sphx_glr_example_05_misc_stats_001.png create mode 100644 _images/sphx_glr_example_05_misc_stats_thumb.png create mode 100644 _modules/index.html create mode 100644 _modules/pymer4/io.html create mode 100644 _modules/pymer4/models/Lm.html create mode 100644 _modules/pymer4/models/Lm2.html create mode 100644 _modules/pymer4/models/Lmer.html create mode 100644 _modules/pymer4/simulate.html create mode 100644 _modules/pymer4/stats.html create mode 100644 _modules/pymer4/utils.html create mode 100644 _sources/api.rst.txt create mode 100644 _sources/auto_examples/example_01_basic_usage.rst.txt create mode 100644 _sources/auto_examples/example_02_categorical.rst.txt create mode 100644 _sources/auto_examples/example_03_posthoc.rst.txt create mode 100644 _sources/auto_examples/example_04_simulating_data.rst.txt create mode 100644 _sources/auto_examples/example_05_misc_stats.rst.txt create mode 100644 _sources/auto_examples/index.rst.txt create mode 100644 _sources/auto_examples/sg_execution_times.rst.txt create mode 100644 _sources/citation.rst.txt create mode 100644 _sources/contributing.rst.txt create mode 100644 _sources/features.rst.txt create mode 100644 _sources/index.rst.txt create mode 100644 _sources/installation.rst.txt create mode 100644 _sources/new.rst.txt create mode 100644 _sources/rfx_cheatsheet.rst.txt create mode 100644 _sources/sg_execution_times.rst.txt create mode 100644 _static/basic.css create mode 100644 _static/binder_badge_logo.svg create mode 100644 _static/bootstrap-2.3.2/css/bootstrap-responsive.css create mode 100644 _static/bootstrap-2.3.2/css/bootstrap-responsive.min.css create mode 100644 _static/bootstrap-2.3.2/css/bootstrap.css create mode 100644 _static/bootstrap-2.3.2/css/bootstrap.min.css create mode 100644 _static/bootstrap-2.3.2/img/glyphicons-halflings-white.png create mode 100644 _static/bootstrap-2.3.2/img/glyphicons-halflings.png create mode 100644 _static/bootstrap-2.3.2/js/bootstrap.js create mode 100644 _static/bootstrap-2.3.2/js/bootstrap.min.js create mode 100644 _static/bootstrap-3.4.1/css/bootstrap-theme.css create mode 100644 _static/bootstrap-3.4.1/css/bootstrap-theme.css.map create mode 100644 _static/bootstrap-3.4.1/css/bootstrap-theme.min.css create mode 100644 _static/bootstrap-3.4.1/css/bootstrap-theme.min.css.map create mode 100644 _static/bootstrap-3.4.1/css/bootstrap.css create mode 100644 _static/bootstrap-3.4.1/css/bootstrap.css.map create mode 100644 _static/bootstrap-3.4.1/css/bootstrap.min.css create mode 100644 _static/bootstrap-3.4.1/css/bootstrap.min.css.map create mode 100644 _static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.eot create mode 100644 _static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.svg create mode 100644 _static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.ttf create mode 100644 _static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff create mode 100644 _static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff2 create mode 100644 _static/bootstrap-3.4.1/js/bootstrap.js create mode 100644 _static/bootstrap-3.4.1/js/bootstrap.min.js create mode 100644 _static/bootstrap-3.4.1/js/npm.js create mode 100644 _static/bootstrap-sphinx.css create mode 100644 _static/bootstrap-sphinx.js create mode 100644 _static/bootswatch-2.3.2/amelia/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/cerulean/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/cosmo/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/cyborg/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/flatly/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/img/glyphicons-halflings-white.png create mode 100644 _static/bootswatch-2.3.2/img/glyphicons-halflings.png create mode 100644 _static/bootswatch-2.3.2/journal/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/readable/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/simplex/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/slate/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/spacelab/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/spruce/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/superhero/bootstrap.min.css create mode 100644 _static/bootswatch-2.3.2/united/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/cerulean/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/cosmo/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/cyborg/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/darkly/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/flatly/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.eot create mode 100644 _static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.svg create mode 100644 _static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.ttf create mode 100644 _static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff create mode 100644 _static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff2 create mode 100644 _static/bootswatch-3.4.1/journal/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/lumen/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/paper/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/readable/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/sandstone/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/simplex/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/slate/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/spacelab/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/superhero/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/united/bootstrap.min.css create mode 100644 _static/bootswatch-3.4.1/yeti/bootstrap.min.css create mode 100644 _static/broken_example.png create mode 100644 _static/doctools.js create mode 100644 _static/documentation_options.js create mode 100644 _static/file.png create mode 100644 _static/js/jquery-1.12.4.min.js create mode 100644 _static/js/jquery-fix.js create mode 100644 _static/jupyterlite_badge_logo.svg create mode 100644 _static/language_data.js create mode 100644 _static/minus.png create mode 100644 _static/no_image.png create mode 100644 _static/plus.png create mode 100644 _static/pygments.css create mode 100644 _static/searchtools.js create mode 100644 _static/sg_gallery-binder.css create mode 100644 _static/sg_gallery-dataframe.css create mode 100644 _static/sg_gallery-rendered-html.css create mode 100644 _static/sg_gallery.css create mode 100644 _static/sphinx_highlight.js create mode 100644 api.html create mode 100644 auto_examples/example_01_basic_usage.html create mode 100644 auto_examples/example_02_categorical.html create mode 100644 auto_examples/example_03_posthoc.html create mode 100644 auto_examples/example_04_simulating_data.html create mode 100644 auto_examples/example_05_misc_stats.html create mode 100644 auto_examples/index.html create mode 100644 auto_examples/sg_execution_times.html create mode 100644 citation.html create mode 100644 contributing.html create mode 100644 features.html create mode 100644 genindex.html create mode 100644 index.html create mode 100644 installation.html create mode 100644 new.html create mode 100644 objects.inv create mode 100644 py-modindex.html create mode 100644 rfx_cheatsheet.html create mode 100644 search.html create mode 100644 searchindex.js create mode 100644 sg_execution_times.html diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..c23ca8f --- /dev/null +++ b/.buildinfo @@ -0,0 +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: 7b035083ce19390472c8abc4f4e52395 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip new file mode 100644 index 0000000000000000000000000000000000000000..21c71806a907c7b73ca8c1d1c846efbf7bc800b8 GIT binary patch literal 33217 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. + +# Import stats function +from pymer4.stats import tost_equivalence + +# Generate some data +lower, upper = -0.1, 0.1 +x, y = np.random.normal(0.145, 0.025, 35), np.random.normal(0.16, 0.05, 17) +result = tost_equivalence(x, y, lower, upper, plot=True) +# Print the results dictionary nicely +for k, v in result.items(): + print(f"{k}: {v}\n") diff --git a/_downloads/68269100b7536b0394ed8e929a3575ae/example_05_misc_stats.ipynb b/_downloads/68269100b7536b0394ed8e929a3575ae/example_05_misc_stats.ipynb new file mode 100644 index 0000000..96d6a0c --- /dev/null +++ b/_downloads/68269100b7536b0394ed8e929a3575ae/example_05_misc_stats.ipynb @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Set the environment such that multiple R processes do not crash the kernel\nimport os\nos.environ['KMP_DUPLICATE_LIB_OK']='True'%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 5. Additional Statistics Functions\n:code:`pymer4` also comes with some flexible routines for various statistical operations such as permutation testing, bootstrapping of arbitrary functions and equivalence testing. Here are a few examples:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Permutation Tests\n:code:`pymer4` can compute a wide variety of one and two-sample permutation tests including mean differences, t-statistics, effect size comparisons, and correlations\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Import numpy and set random number generator\nimport numpy as np\n\nnp.random.seed(10)\n# Import stats functions\nfrom pymer4.stats import perm_test\n\n# Generate two samples of data: X (M~2, SD~10, N=100) and Y (M~2.5, SD~1, N=100)\nx = np.random.normal(loc=2, size=100)\ny = np.random.normal(loc=2.5, size=100)\n\n# Between groups t-test. The first value is the t-stat and the\n# second is the permuted p-value\nresult = perm_test(x, y, stat=\"tstat\", n_perm=500, n_jobs=1)\nprint(result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Spearman rank correlation. The first values is spearman's rho\n# and the second is the permuted p-value\nresult = perm_test(x, y, stat=\"spearmanr\", n_perm=500, n_jobs=1)\nprint(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Bootstrap Comparisons\n:code:`pymer4` can compute a bootstrap comparison using any arbitrary function that takes as input either one or two 1d numpy arrays, and returns a single value.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Import stats function\nfrom pymer4.stats import boot_func\n\n\n# Define a simple function for a median difference test\ndef med_diff(x, y):\n return np.median(x) - np.median(y)\n\n\n# Between groups median test with resampling\n# The first value is the median difference and the\n# second is the lower and upper 95% confidence interval\nresult = boot_func(x, y, func=med_diff)\nprint(result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TOST Equivalence Tests\n:code:`pymer4` also has experimental support for [two-one-sided equivalence tests](https://bit.ly/33wsB5i/).\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Import stats function\nfrom pymer4.stats import tost_equivalence\n\n# Generate some data\nlower, upper = -0.1, 0.1\nx, y = np.random.normal(0.145, 0.025, 35), np.random.normal(0.16, 0.05, 17)\nresult = tost_equivalence(x, y, lower, upper, plot=True)\n# Print the results dictionary nicely\nfor k, v in result.items():\n print(f\"{k}: {v}\\n\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip new file mode 100644 index 0000000000000000000000000000000000000000..fcf568cde4c3850825f1ffdc81f46aa08a72ecb7 GIT binary patch literal 47726 zcmeI5&2k*smESoY&n#x;g(B<-+Yu=+6a+ay0U!veMK#*uM^mDkt!991_Dm3r>O@rn z$Yxb$sj`Y7)b1Y3v+xVpPvBWNywu98*?KvChS~TXyz=jV&b^sgAM7TE5)8DuC6Yi@ z=FOY;p6~NN=RW@EPyhK3uIRtrAN}XQ`rE(%o8h1T@X8haN%$;#oeoEXth;%uTjj&) zAf4pJQMaE?(oQ})Ee^i?izHd;WrIPrayxm>FG-@0^q+m)ot%y`zFO&({cL3|ewDq> zdecc>7TsPsEhb!0Ob3Jd>tQxY^$b3bqiMWyFi1yL*5~8HbWmksw6E&>%IRb@o!C@f z)E`#mbllS%e0nyutI3mWl1z@XBr9I!|T31o@Up6G)yO>K{*-Z2T5KG@*-Oauk*tG4KEd6e|9m4>G);8JSmz5 zZLe6f9?M>Rzqp#*>LgF<-AwMY()-12?a=MdN2kMVeCzY1R}OjQlYDZVRQ#A^X?40j zDc7e}mK;uto;I&a4$E=U&_$v>^9AgsMRJfOL&h9reIF-0;nDE(BrW>B#_NOZRW^9r z8?*7}2~VsCy7_r0d3v19OesA15W4EKvbIq(@74(u&OX=lrfjlilaBd!G#Q*GMLNv- zx8p$3eE(b~Z zDjO#!B0PP4l0u98Fb>O7a(VeO8RRdsE7?pW3sq7_-`kP*v9UkVr9I}UM*OMnqJ?8_aRDY4YN(a--zWz8%*=?;;HR11c z+)w)1s~l+{D&R?@an{d!lX7gA-z&%COtM1X9%Pe~EGy(*>MW=~g(GOx1h zamO_C*>^b_m(x+T(Hl&wNj9#MRpZe%{glPv^tx_(mX7nZ=w%vx%yi3P!b`C?-*DGC zao^Re$uF`Z8=D+$7IT~(K|U4hWqYyZ13~n%(IiaLZ`T~RHaAT`BtxTLKGDR`Bh#Uitua|v zWs2X(Kqjq5Q+Vt&5V$S$8EE*TspE&P zLbW|npTG-I(d-wtl&+g<`JDv4+Y-bQfLD_{qK-p0Q^N%T5JX>~LbypBHO`!1^Mibl zPflx1&c&nC1YRme8nGC4e3VX=W&PEyO{B~|yf#VKk^?raHG$RrLIwsj4tcB@lXMZI z)$Vg>aczd0w_mKG1MM3pr7b=%!s(7u__x|!<&GVm#s5cRsC@Nse?`W_4Da3E-!HyA z_=>;xSK1feXL|OX@!>ICzIy#DE;$2{yo;If%S;NDKW07jjq2dB*$vV_E%n<7t{PT?tz&-(ro2O2Da>+gG>$q`pU&64h3#m zwCMR*UWK_2C&w7#L8j^!lLU!mH5MB7B^q^r>kzztL?A9n6v36usTs@7t(cvbWgktR z+Dlks`>Z9kiRH$R89rM+SkTtrA{IK)JB!|`nPq-2N~4c2)5n(8?9nnfOeV~iSeTQt zbE(-t`?qL=n5iMd;nGs`1F(N1r~fuDg?wCa>^dVQlz)RE{hZR~EtlZQpAY9a*}l zdAY^)Sf{g$yoSIyN(K5%pdW4cIR%!cQbbmyE{0wONEj=$i_I-9Nkm4IVQGS zoh`gNcMu1ed{)i6pB<(I8FjEq)Okdy9w>24V`S)YO zNx0$claxV_sRN=-3!)Wk!u-21G5obKC;v(FX*+%OqutYEiu#tv?b_ew+5J)frrvcX0#n9Hqoyk$}HfXE0eM4jMTKS~2ko;}L=h77$hd;pa3t z$S3Ag=aRvA&X@z@Pv#^Ml=jADh1I0cVl9m=G)DCBXBZC7t9Kqhv~a<3d7=S&Xp(Y> zu!NEG>iStd(~IR15|7l|yG%k!v1~*}2%AicLKdQX?)!zUktKd$6*C*{lY>+2Ya8MG zLJRIWnq-tNtRv5HXQiHePcOA?=f+#J?wxcr8l0{U(&0fr<^4vt^;f6y1kJqNIqYAd^$PC&);scy@Rwknx;qg?a01uzKeJH=i9F5 zLrQoh-q_8H!?OKMDWzeqOk7us*ZPXYdmNICzh+WDi?0YIDQm^`+aZ13WS-Ua!xMUq5)^^8+%cJbJ?LO1)=et<(Hfqthd$^{egx zxPe^}UZAy-&HPukJMVS2ej3(`m$4UFDGpGFM0t3?EkO$E54yvg;07OW{>4|1YYfG0 zFcd%g$DjYh?>4Vo(Vu_Q#!zf^57H{{b*B}3_dR~%^5Q2*_}$e`CZB32lV3~;H=QY% z`YtB*447dSs9{(gH-?qonq)*MvEj%Rj!Gd|PL6X-qZ7+jl7}3~hSi0`lGq5glpNE^ zlpsTn>x-ND6#F)*TB9D3qn)pm2W3E?mxSctP0|g7t?a8 zI0hee2Yd)r;JCzw)~8C?KRs6bpdOB4mkvk>cVR?Ax=TLW)@Oufk9d_{ItAEo+-_M(N~uHjArU>Y)8mHt7O@Fr*gQ zPhG3gAC)Oi8jhN+yjHz6CZ4)N0i%9L5Qc8AdbJArN;h}D0P?cBFy<;0xWD2fIE0OR za9ip?Y5y>I(&uHM5$=2v@ieUfr_ms*{vdax&vM|08#yp&+5_M*8syb6;k#)i@)jf4 zC=SCp0kY~1Qk-2}-&qL);sC$-BufgC+wyP8%`$3U>- zJzQd&lrl~Z$R><$85J;7sQKfvZ+vvOaoaUT$LmS*%-w>Vfx*aCxbpRRxkEod(zNdI zjLoUAS-jbvQA-@G^_@kXo)c-CRKB_|R*xr>(d~_mlarH9>+=qg&<(In8xlgVJI9mZ zVB@-?j1~Tm5UZzc-X)?1aV9Sxu}s&{+>pav!cOwD9RR3=v_@7HU#N+ zI;r1mM*u{IGa|yToXZ1Z|D!e<%l{AwAaMh~LBBB|XSX^HpO-ukBg!(D!Ku{V9C@|r z$k`66$@^23^;%6>2+Ib-r_U!n$6*k8w&;F3aTrn{!GM=UhzRA{_dKBjTbEt8Jr-mp zNUl2%@6B#2ADm@VFB)Gx5+Ic9X1)K(s^zyNi4OBI)|`QqJcQ(gTwnV9Hev6xy!^Wu zt9PJApj5%O6w!JXECL3jIBaBS&@%l#v>1_kvQg{#n}|oMB0)n`IenGp1ECqUBtiK5 zOY4DPg!dwwH1~?^Ex&_S>E~b~gf^;~z(vcp9y>rhx?*!!(%~99^~w77b#{0Mt^pK3}QaS9yh89GtG1DH;I{zOPk=U>zg! zFSTwBHo3OqRsNgWMh`D1T~QSnky30bGze=G!sRfRqq~z-85#t}M8Lv`_~uTm>LcB^ z`g(VNMeHVhdCJfCpVgYPVKSCEmkEEgD}ds8Nf+$rz4E{k`zZd;9zBU#5an6p?^SPL z6Rnb(=>g75%Szb>`^za~Y@@B$8Ck=oLtf-~!yPA?@QXN$X*F4|emzA7k*y~Tm5qsK z6%&BIhgk|F8!WrTR(P@{g0Tyw zgzR4Bxch+$+pFE=zkRi5B@H*P`mR8F$Gt82YiGz^UNpu1B$u%-O2wa0!2P>JUmpu&$t|1yl>M$80G~z*}KR zy9l1OxLb(3_N;5i+vSM1+S#jOuMMYnroDa_I|WJd@q83$#shByi~JQ&$}x~;APd+Y zV;K*KptLtJt>b7TB2R=kf)z2KuBu(VbmSkH(|VARk;eDNdaHWWNmLGVF~CVRDvQ2+ z`rs_f;WvD{c?lB)IWhwy26q!;^4aL41>d^m4eOzoU9PlUOAr9QCvV|QdWL9;J1H$_ zRYOkwTk{kjpow+0iF@$XfGR8~r6K!v%IT(3P57D%$)*eAaz1G&CJ<_)FV`aNJ~G<1 zS5!P02veU5O^e@AIHMXrEbkew(ra`2ePT#uftc_Z5K2v$%;0j0Js@9SZliq_Emfx| z(bqCxh_v)5nBfx4wO83?C)i&ALv4V2OF)0KicemAb(vM2-q*C#l2=`DSA|x+ntUka z#u${10fr>$l4+5n)=+1$#>+xHVmjU62@Q0R;6A<7D%b!bs(dEn1_Lw-p*KEMF%YD8 zLh+hW)9hkXER==d@6MTY&PB5?<`>v!4R$8tz#UO>K51Kg@#LSAepex4{q z9z)0G)}CRi7mG`cnr+?9R<}U3?Lsd%qZ~JzXjV4B2yVP}dEIBx2Jf;vcY`RcS*XQ> zR&z>ddT&kU>S-v#l|kxl0$xwXDS^48sX;Gfh)T1Ek!CYO<{yU=c(Mb^TJd+~5oi^+ z2xB=$u*33sIVP>rq){lcoi{D42wr4Fu6we6T=p#g?N-{IUw!iI4p#LOAv!~XJGp5S zSQc+b^TbRh8L)|$^Php<-evLeM98fx1Oc)j@TFYj3FX6iFF4RG*QDO0o3)^`xTv|E7Dm7CnTbs0zwdt!`9#%>?GPnp`m_NIBMt&zMLxer;R$Hyccu zF|Q2+xBfy%+B!Jazc4obBXy3b>7-%imVMtM9^+*&AOS5=i(;=*i2-}(t2Zj+8TPs4 zq&IIypq+L3&KQ>84ZA~O9&=Y83%5uk5u$PX#T_ySUP%}&&ETQR z)pY>M03-@OniUN`^JOQw560vOrHARI+kL#`20rbLxG)uWo1g#t@&L$=qZumT3}4vq28n?v`(>}{ctJ*aJBWpbzlyJ!(}HDVu>)#q)laji86) zW&@5WFPRP*>WWT=Icg0JT0EG^pNg;I$5Cel zXH{DrZVrt<^3qHkS~gvBjS`HR`h{oVFFE)t$IUd0wg!2`m2!*biNbJNqesJN4u!x* zbJwcvj!e*s=c=>H(4-369Q9mH&&g{8CfRxkN5l3@V#r*b9~ZOv%F z^YU4c?4OO(QSvFTVaDDG(jraBtnqHbV!g^qa0DE}HeB`vTyJaQxHwp)5lNw}yp#O0 zJfS}su1BsGM#rT72=uFg!VvdH3IU_>us&veCfwm}Q1l?xxvi%UHFqgMA z4g4uhL^w0a7gH0#BZA|GQ~3c@{Sx}%;Z62(H84u-tyce9+jZ9i^r6VskH&}>yzkI^ z?9dtsxUZ$)+N7iffCa)sr!i7H^>~f(xHK^dK>qt$2P=p8BdB$FpIV3i@?Ssu-M^&H zL4Rgy9d348$;0n!9WHOJ1J&^NT4~_Nb-Cr4z%%a>5qXLP4Ot@&<%8s-p=c2BT(!Ou9#0)=d`2{tLC(o3U9?xSzW?T}TSg ziArl{7zU|zifJb%850(~li<|KT9{4AS0lliOu6h?jH;eTBYr7O$BeYK;7ZD&AA6OU zR>)gU_?w(HYxXW1g${m1!#i|{Y?6=7Se=34=&Sl&YSm;$<8y%f)oEi!+plkSW3Efd zYQ=(Gs%6qD(!1}m1`-vZxK9ZNV!|IzNl@}^gOyLgQ>>!^1MtEYcqvU0HI@#pQ1J4B zSmP5cjFCQLw;~_NY(U4??#w+w(QkN>`3*DB*a&qQ4Ks`rT)-k({FGtWL&sTrwmQ;c z5me+#?YX=}B;))y4ia`x#M=D`d{p;lwT3@owE-274r6ARG_Zwxl-AbO`}GgX=1p&VF3#*v8H+RX{e6|V zoLlhvYI2_*TBqwux%4-l;%ZNn32<{0%-rQp-H@UV^&4!e?K#3rjJf1RDRYY}!4;O@ zw*9^aB8!-_`%6Sy0szs%tIBCd{UBP1JuZUZf^4Z7yz$nW9%uK!nr!1Ls;9CVORCvP z0DsL%{Wrk3%pc92)DH}D&n zkjpOAM!5yCanCFP1kxoBp~<>b7j06}wlje2+$45WM>3g@JSnqmmx4vaHP@3HaGwdz z3$$mCg)kT90sSCbSCr>AGD4+i*>!vSx3-vDCWw?X3uN*Ch*HNWjF>*lf(qTLMQq*H z*t}+|)P{UJ_AKA19VtFHy91Ylg%VW^Ffr=6nb8|2MB^s9Y8NW>@w}xYuixwd)Hc4o zZ%O^Q>0#BXgCoNuuqYf9sK!ux1PH@p4}k%fvbGb)2(QLQQZxg!8YOLJC}TDC5FrWP zOKQDsLUGcCb^UXlo~%w5Eh_Ue9SPS8Ct~kY-{4k8^oD_+M`suud23)Zlqoaju!f$3 z_6ugodRt|W8kJqke7QkyoCEIC;w@yqtov4b9{A5$=cq$wM8%?Ogm2TnxV%T-wCREV zp_~!pWj(oPO}HAJW4mat?|Eu=D!w8O=B@8RNP~ct#>09=%ZB=Vh+$gLlb=?Js^4;V z+VRm(Lyu~CWeuoMd=U(On3UFHfb@Maov}P)7o2ztL+fk=0by}S124~z3i+=HnGuNv z)3PC`fSU>VuJS-9FW`}ijI3x|PJh~01)!#;MB}=b+3});jqQvGiz@^BPJSgKw8*{D z9wagwE-|;JW}t=0M|^WjHpDHrg_~alcZ_puwQjySZQBB}$h><5Syp)%`9lFe-N;4g z8FLxfkMyG*QlRt_3#ZkFdsXf}Tx6pn(xpd$c(i(YBG^P)SonK|LpBTQ9j={Y?&TgwfO2k{3U+WH>tn=uqU_Dy0~d zM}}NNrbPH&V-CymZ8ZZ))E}hj&7sv7ja$NUsUi}%e%o9t$lHyzwz3aUe8yD&=WPe$ zZ!d!J#lMtssJiWdu0C=`&JS%Tf2j7E#lKE#2JuoQZ)n#7U$p(njU|e}Eg`(VH+Yvp zepsqK@(__v_^Iv?R?*L>vy*(FvLRCnTk*HE1`-tjXqr9!|32_(-rEgpy!&M+G~#rq z{T1F>=&k(~mcW1D?dk6Q)tMmS?-oJ5Y93;6h@*C8hh(tr7f(n%!W0cj(EKVo(o0mV z)e#}!`TsXJ2`R@|(^=o(r!8G12J}ASry@-8qFovDs5e|s->B8FtN^l?*eDhiv5Pyv zFO1|;fR}1)pt_Gnh%2dz?)7mO-T?@+sVYHWTJLH~l(+Kd*N+D=p>ZF+#C5nC3{g(q4wktGFRaB7pcu&8$hC}CI~WDnhdmwy5E#}TWF2hJV02$XE^RSq zVAsH<>SEoH@wxKsyfr%GfkcPM05WFQOmyyvw~>wH7>R1mtAKD7F2Y@C+os7|dlc^6 z7-@#sn)xK6@;%zx?2*~9!@`0+C@u-uH^4yF7VPDE07C(%h7VBVxJ4Cilq3R3wuF<( z>36L zjMxsF^W|1u#0Jg0&B8i+{MaO*cS4sm4({PKn1k3dVw@^rvY}db`((^LDb%H1w-6rvLiY`6|&*IbUpDdPweEd`G;? zNS%8ajdwzC{&0>)(?x{$m&1W#z?^kDcdy3{tQ)G^zTs3xjUvrMnn$d1Mi>sOG#V@g z`jL1&NXkIH;-z{rOP@D2rZO9&z^b%i)4~c={P`92vh2p#WjGKuvT)zVi=S1 zh7_*aQhn32Obn!RtolR2J;8m^LI{UYeZO4E^KAZa5<$;Av1i8SV0Hb6?ubTY4QLf7 z>Yi2fKZBYBA{uyg6qed zDr{`Pu_*_9zSLoDOi=EUuk_p$atC`#*!#MgfF(`MS$QV=Tw2;0jZv1f@Hop24%V~_ zMUz!#Den>fzdY+Ov{R2AFUjT!s%d^WafXnajxY<`h;Il1un!7lwF`5f%8rVvqur1W zqs918Z=)Uqv8N9jh}CGHjKQ4bG&d*L9G{K^Wl-lzNil8Rn2jb=WYp^17WwGnI9E7m4)DsL}PGv0zt+Fovs9;_E! z8h>`VwWQ`mYG>rOTcWxNgTxk@mtK3C7C<`AE{5cbsH1f%OKpa%x}|^JWe6F`&})(& z8@^o%J9OP<>2mFE{}A_)&u|t+G^<~t0MUEsM6@F=wf^OUEtFu?s^{Kp@>ggWXh=Nj zC~f#D?(xFr*P(A?vIuUigN<6eH$^Zl!k80kw&N1G@Hc{1L0{0@Xx%ytMgI|Qw`PcD z;c85a^gxLEIe1$wM=Z+z*yX1dKqlhbQ4E4g!hebA1)Wi34(S`Ck17X1rab=|JLM;v zKUqt@W`n-ApI?}!RORfF=VJV}RQq#nuXgqYQ^lTVZTq>mxxBOvSPS1^DtkVdW{01s z1yl^FwU{78*IJ*vWuUEfz@5v-_Kt;P@EVc z1jTXR_BTMX!*YM+gZGbbeW1Yl`y2f5{^$c!hcK9R<&#x(SPp>5lYz1>NCeM?-dp~( z_cul#yuZN%KadUn#LjWE_=|;Abt?Isw-jb7bXz*`%#?bkD(gb5Tg=8g9fCpN4bvfI zCMa1rU>w6kkuO?YT`z*NSZEtGk7Y~nA_&^c2*pZsUF4o=y=?G-I%Gu%WvVtF&H1|E zCe`-{Zn2USrZ>$e_@TyEg4s*U52>{>K5U&?6(_`VW>9&a+L6(u+2`sCk6q)bg!wr! zFb2eHSFSpQ+X`-&KW*__spOz`Re4U%)dEDdk%k>fVnF+YO*QvHU=`j5b ziJp_nDu8~xv$^xr?#_EZKHUE4t^Rx2!F#t3-@A3Nb&#fqJ3l@=Joxd!t)I|%f-bX; zD1GDOT4hDq7bO9-jlGS7L3yw-L_KBW4eLQ(ZQL`Lg3JS*p1OOTVIL>|fxE{nOO>-{ zp7#hvKc&Q^6#pTX!h9EJv-DD$0Q=+GEC7;~f6E<-PB;oslfbkKmV$Ic*1s9 z{t{*V-xm{H-eQ7nnvJU!13?YT>zYj%+cn6k30d58t1URIUiU^4Zp+4bTc+1cShF&l zz=8CB?L{}x{g(OK-~!)dO-q%9?^?!@%g-2#0d+hekW1O9%XWnD-mDSv(CcZj>b(nN z1e~bj0jd+zRV93~r`4TnNz*?XNiQ_1i}MPV4W#YcK*yOEq8c^e(ygC{>~fF@W+eGp zj#A#3M5OiK^uk_aD6LJsVXL7*Wk>e58o+Z(R?eHCx@O`^%U_FwJb0v?6pI#P9b$B( z_OOfOfi>cca1~Ycg>dT)%~ekI(y{-Y)LB@CxJ2H+)=UagWCjN5mw*#ch6}B2IW|Wp zqd!H(CJ!GzR4))rCyt8@O-H@@kFMQDdiYg1AIU@6r4*$vjE4QG3>7E6mBS*ZXKLt< zVxgWo5;aQm@kx$;Z}H+XwXBnHlH^PKn=^5GG`H`@vwYqy|G6k1mWBNHi@O0y;^HJ) z+6~5_?rjm5UVd-wZ_WrITY?Acp8s1y!W|BAeU-{+@#u^k1q>!a!;qOXrIYeZVm-B; zTi4D#dE)X;VM^?B(fW)P+u)H5dZ+JgSmUVBjs*9WC)&9)Je3*fDk{&t>z*uoNJH_A zNT;)DPEnZdXvGj^Mz4Eui@brp8v2;=P0>s^@f34fWHs|9&KNFfqHW1-O8JIa1)5)2 zHuF!S&_Fi!vh`+f=TpxXehzur7W9g^EN_B2j;GM9lZ(-2u;tD>7ywzqF>Gz&)uK&r zM(Mu{0@2%f)D+{g#6ylX4uhSDtRG^ODk_4IJc1EK)1qK&;klp(q>chI3(Lk#<%*E{ zwO0*dD3Iw{x$h@i=23AXzR6I!@TWYrqsl%tQy! z%$Xxxf;jO2lN&NIe4x970b*Jq6hZ`X7>LZ*zB50n86avx;Zl%Ohsf!83afb+X&k5$ ziELJo)PY8A-Y2$Qi;CW~SL-M;m~?*Gma04!Nee~3iftiM;=oS_GZ1hJc%h!a_RYiV zMURR)M!k9@b?M8d$$Uoy@f;6%*3$Oe+NGJEZmkU4BF>X*EFPh@B&MAuihH8X{)PgOxsGjQdz-X#@SlWybnO)Q%cE1zrS39$Dl|rSq=+C3V-U4P3DC<_7 za4TGj3UqFsE5vNmVpz7W9@#z1;=Q9U^f6Tdx!Pw(GZe!F>0Y~QEiY}s)s&JL(?il< zF9`mOzBOqO8jj@{LJr<@4>V z{jJ?*Y|bD>psvdBbhNiM^W0xi7GJ<&j7@H>j?+>0oD;Kx&G})>SqB##xMNE_F7-U$ zWLn?4A#Y>pVbn6O-He5TSNARNI%6~6+UMxuH%$GlFzstTXd5ycKAN+&`PB5!oS~ro z_{`x1r1w<)qWwpun^4iuA)Xhqi@F{&w1%*RNQA7w#oDl?w!pa}dOvjGkZkQ2_X7NK zwz^DPCnMP^mw4TAfM+7`_=>Y`MT&WG!>=%tUBd9;vs)dG4aOqM4pZUHpH5!_@%`nK z`w<**$%}>@t~yhmWdU;NIp~#c6qE#&TN;crY@Fh2N$wO{-v*P{2g3mQQ?p&PPq+RU zmM~HkrR}fWLtmk(JiN@piy}>D)fUmhbk3sLFPd5TcuC|ozG-Wb&+>{a{7c~`n<^gS zpET8+q==p`n{(d%*j|aF5Dz9ItfHpKLbPC>VWDuOgSZ54V5@4=g8dRpVYqN)pz+l5 zi(~|u1Nq?o9wbE3g;n#JSJHqansm}-Kgv?e_Xp#sh+Gq3oBc55H|lyhDPWhw{&7r3YLLM)UN!zq znC(pI*^4D9eP?t$*~~djvc&jv>&?~}O>2Z9j5zpZMvKXx)@n)-MQoKeUICGMn=Y7r zr@1azcx@l}oWrRtw5r%u(obYqb4aVD0SpmO;kv|x`6j!`1Ra@JX7uig;d^}79}&Lm=is}3_HY01|N8h}T)Cn@|GJIu+UXASs@D}%oR;;Y z)8atz0<#UP+O}MdIJj6E=4$dJ=*+BmmBX^u|ISXQu@G2opzbNpZl|tu)}2Me2|1w*uAFHcdz{j zbfyjzqSH6lg2KaR0HnW*)h{Ko1H`Lo`Ts!i^LQy@knhUft-hI#l?@hVg==w6i;G9~nEK7o0z7%j#2|{fjGkhp zQD3I4CO~Q}SvIjV*af_nRcq~TJ(o7WQo@qQ?&I>ELnVdIi@;sy$m6*1{O0jYi`lMt%iEndcrTp#5u;gO3*r4)*!>{lVmeCbxAv){s6!{bQMa5+BS__)+Y znPgyB-gUv_$ixkP?~DE}+6e)AH>!Y8Q*SM!zD0=EYNI9NLjFnZ4;GaO`kPFbdOV;` zBu|BE%?KM1Beo`T1Sw$Gt-jJEN_&jQbdz(bInFpbp0-rSN4t*|S4S#oRYY zIW2itI$2Uqq5kBGpfqeHbt8m*~hHkm9uCjz=voy~)2(`ue1zyuVv+M>)7c$Y;fT;NC zr#nA_?utV+IVu=pB3lYgw8UP$SV8P*-FD+!zk_^xM^=0K$&;tahvZV3txbKo!D6f$N+uV_CA-j0^h8wexG)1ts%7yRa26MHP@jqYJ2;ny1SEaEIpy* zn~=*FO`@NbZ6->Ax7KIQMliElmcf2uRJImKY*+m{RLj~S*(KGvOuO^tEp+>4XY(fi zZ12$CV8Kw}njhOGT(R{NNUv7S^D_&i+MWi{Ph1wq_lPYXkD+yQg?tozq^5~tLE?5m z`dBW(%eCYcd=c=Y;amy%fL-y9hbA6>)Qomp zQH_86`9J)QBXIOb$Kb^O{_eN;8NVKFt7~}Y?z94XvpCYS19h5_HuqX1EjeDNJ*Q=r zbj?V={ZFlt=IZL&qb!TpG^3>dy*0{W^ycwLfA;6P_|N#?um9xAmH+cU_1pggBh|lm literal 0 HcmV?d00001 diff --git a/_downloads/70d6b9ce5a4ead51666a28dfea75fae5/example_03_posthoc.py b/_downloads/70d6b9ce5a4ead51666a28dfea75fae5/example_03_posthoc.py new file mode 100644 index 0000000..1d69a91 --- /dev/null +++ b/_downloads/70d6b9ce5a4ead51666a28dfea75fae5/example_03_posthoc.py @@ -0,0 +1,150 @@ +""" +3. ANOVA tables and post-hoc comparisons +======================================== +""" + +################################################################################ +# .. note:: +# ANOVAs and post-hoc tests are only available for :code:`Lmer` models estimated using the :code:`factors` argument of :code:`model.fit()` and rely on implementations in R +# +# In the previous tutorial where we looked at categorical predictors, behind the scenes :code:`pymer4` was using the :code:`factor` functionality in R. This means the output of :code:`model.fit()` looks a lot like :code:`summary()` in R applied to a model with categorical predictors. But what if we want to compute an F-test across *all levels* of our categorical predictor? +# +# :code:`pymer4` makes this easy to do, and makes it easy to ensure Type III sums of squares infereces are valid. It also makes it easy to follow up omnibus tests with post-hoc pairwise comparisons. + +################################################################################ +# ANOVA tables and orthogonal contrasts +# ------------------------------------- +# Because ANOVA is just regression, :code:`pymer4` can estimate ANOVA tables with F-results using the :code:`.anova()` method on a fitted model. This will compute a Type-III SS table given the coding scheme provided when the model was initially fit. Based on the distribution of data across factor levels and the specific coding-scheme used, this may produce invalid Type-III SS computations. For this reason the :code:`.anova()` method has a :code:`force-orthogonal=True` argument that will reparameterize and refit the model using orthogonal polynomial contrasts prior to computing an ANOVA table. +# +# Here we first estimate a mode with dummy-coded categories and suppress the summary output of :code:`.fit()`. Then we use :code:`.anova()` to examine the F-test results. + +# import basic libraries and sample data +import os +import pandas as pd +from pymer4.utils import get_resource_path +from pymer4.models import Lmer + +# IV3 is a categorical predictors with 3 levels in the sample data +df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) + +# # We're going to fit a multi-level regression using the +# categorical predictor (IV3) which has 3 levels +model = Lmer("DV ~ IV3 + (1|Group)", data=df) + +# Using dummy-coding; suppress summary output +model.fit(factors={"IV3": ["1.0", "0.5", "1.5"]}, summarize=False) + +# Get ANOVA table +print(model.anova()) + +################################################################################ +# Type III SS inferences will only be valid if data are fully balanced across levels or if contrasts between levels are orthogonally coded and sum to 0. Below we tell :code:`pymer4` to respecify our contrasts to ensure this before estimating the ANOVA. :code:`pymer4` also saves the last set of contrasts used priory to forcing orthogonality. +# +# Because the sample data is balanced across factor levels and there are not interaction terms, in this case orthogonal contrast coding doesn't change the results. + +# Get ANOVA table, but this time force orthogonality +# for valid SS III inferences +# In this case the data are balanced so nothing changes +print(model.anova(force_orthogonal=True)) + +################################################################################ + +# Checkout current contrast scheme (for first contrast) +# Notice how it's simply a linear contrast across levels +print(model.factors) + +################################################################################ + +# Checkout previous contrast scheme +# which was a treatment contrast with 1.0 +# as the reference level +print(model.factors_prev_) + +################################################################################ +# Marginal estimates and post-hoc comparisons +# ------------------------------------------- +# :code:`pymer4` leverages the :code:`emmeans` package in order to compute marginal estimates ("cell means" in ANOVA lingo) and pair-wise comparisons of models that contain categorical terms and/or interactions. This can be performed by using the :code:`.post_hoc()` method on fitted models. Let's see an example: +# +# First we'll quickly create a second categorical IV to demo with and estimate a 3x3 ANOVA to get main effects and the interaction. + +# Fix the random number generator +# for reproducibility +import numpy as np + +np.random.seed(10) + +# Create a new categorical variable with 3 levels +df = df.assign(IV4=np.random.choice(["1", "2", "3"], size=df.shape[0])) + +# Estimate model with orthogonal polynomial contrasts +model = Lmer("DV ~ IV4*IV3 + (1|Group)", data=df) +model.fit( + factors={"IV4": ["1", "2", "3"], "IV3": ["1.0", "0.5", "1.5"]}, + ordered=True, + summarize=False, +) +# Get ANOVA table +# We can ignore the note in the output because +# we manually specified polynomial contrasts +print(model.anova()) + +################################################################################ +# Example 1 +# ~~~~~~~~~ +# Compare each level of IV3 to each other level of IV3, *within* each level of IV4. Use default Tukey HSD p-values. + +# Compute post-hoc tests +marginal_estimates, comparisons = model.post_hoc( + marginal_vars="IV3", grouping_vars="IV4" +) + +# "Cell" means of the ANOVA +print(marginal_estimates) + +################################################################################ + +# Pairwise comparisons +print(comparisons) + +################################################################################ +# Example 2 +# ~~~~~~~~~ +# Compare each unique IV3,IV4 "cell mean" to every other IV3,IV4 "cell mean" and used FDR correction for multiple comparisons: + + +# Compute post-hoc tests +marginal_estimates, comparisons = model.post_hoc( + marginal_vars=["IV3", "IV4"], p_adjust="fdr" +) + +# Pairwise comparisons +print(comparisons) + +################################################################################ +# Example 3 +# ~~~~~~~~~ +# For this example we'll estimate a more complicated ANOVA with 1 continuous IV and 2 categorical IVs with 3 levels each. This is the same model as before but with IV2 thrown into the mix. Now, pairwise comparisons reflect changes in the *slope* of the continuous IV (IV2) between levels of the categorical IVs (IV3 and IV4). +# +# First let's get the ANOVA table +model = Lmer("DV ~ IV2*IV3*IV4 + (1|Group)", data=df) +# Only need to polynomial contrasts for IV3 and IV4 +# because IV2 is continuous +model.fit( + factors={"IV4": ["1", "2", "3"], "IV3": ["1.0", "0.5", "1.5"]}, + ordered=True, + summarize=False, +) + +# Get ANOVA table +print(model.anova()) + +################################################################################ +# Now we can compute the pairwise difference in slopes + +# Compute post-hoc tests with bonferroni correction +marginal_estimates, comparisons = model.post_hoc( + marginal_vars="IV2", grouping_vars=["IV3", "IV4"], p_adjust="bonf" +) + +# Pairwise comparisons +print(comparisons) diff --git a/_downloads/917ffe7ddd07e7eee1cdabedcfce3a55/example_04_simulating_data.ipynb b/_downloads/917ffe7ddd07e7eee1cdabedcfce3a55/example_04_simulating_data.ipynb new file mode 100644 index 0000000..57a6afc --- /dev/null +++ b/_downloads/917ffe7ddd07e7eee1cdabedcfce3a55/example_04_simulating_data.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Set the environment such that multiple R processes do not crash the kernel\nimport os\nos.environ['KMP_DUPLICATE_LIB_OK']='True'%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 4. Simulating Data\n:code:`pymer4` comes with some easy-to-use functions for simulating data that can be modeled with :code:`Lm` and multi-level data that can be modeled with :code:`Lmer` or :code:`Lm2`. These functions can be found in the :code:`pymer4.simulate` module and are aptly named: :code:`simulate_lm()` and :code:`simulate_lmm()` respectively.\n\n:code:`pymer4` gives you a lot of control over what you want your data to look like by setting properties such as:\n\n- Number of data points and number of coefficients\n- Specific coefficient values\n- Means and standard deviations of predictors\n- Correlations between predictors\n- Amount of error (noise) in the data\n- Number of groups/clusters (multi-level data only)\n- Variance of random effects (multi-level data only)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating standard regression data\nGenerating data for a standard regression returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lm()`, along with an array of coefficients used to produce the data.\n\nLet's generate 500 observations, with coefficient values of: 1.2, -40.1, and 3. We also have an intercept with a value of 100. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 1. We'll also add noise from a normal distribution with mean = 0, and sd = 5. Any correlations between predictors are purely random.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Import the simulation function\nfrom pymer4.simulate import simulate_lm\n\n# Also fix the random number generator for reproducibility\nimport numpy as np\n\nnp.random.seed(10)\n\ndata, b = simulate_lm(\n 500, 3, coef_vals=[100, 1.2, -40.1, 3], mus=[10, 30, 1], noise_params=(0, 5)\n)\nprint(f\"True coefficients:\\n{b}\\n\")\nprint(f\"Data:\\n{data.head()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are some checks you might do to make sure the data were correctly generated:\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check the means of predictors\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(data.iloc[:, 1:].mean(axis=0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check correlations between predictors\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(data.iloc[:, 1:].corr())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check coefficient recovery\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from pymer4.models import Lm\n\nmodel = Lm(\"DV ~ IV1+IV2+IV3\", data=data)\nmodel.fit(summarize=False)\nprint(model.coefs.loc[:, \"Estimate\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You have the option of being as general or specific as you like when generating data. Here's a simpler example that generates 100 observations with 5 predictors from a standard normal distribution, i.e. mean = 0, sd = 1 with random correlations between predictors. :code:`pymer4` will randomly decide what to set the coefficient values to.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data, b = simulate_lm(100, 5)\nprint(f\"True coefficients:\\n{b}\\n\")\nprint(f\"Data:\\n{data.head()}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating multi-level regression data\nGenerating data for a multi-level regression is just as simple and returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lmer()`, another dataframe with group/cluster level coefficients (i.e. BLUPs), and a vector of population-level coefficients.\n\nHere's an example generating 5000 observations, organized as 100 groups with 50 observations each. We'll have three predictors with the coefficients: 1.8, -2, and 10. We also have an intercept with a coefficient of 4. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 2. We'll also introduce correlations between our predictors of with a mean r of .15. We'll leave the default of standard normal noise i.e., mean = 0, and sd = 1.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from pymer4.simulate import simulate_lmm\n\nnum_obs = 50\nnum_coef = 3\nnum_grps = 100\nmus = [10.0, 30.0, 2.0]\ncoef_vals = [4.0, 1.8, -2, 10]\ncorrs = 0.15\n\ndata, blups, b = simulate_lmm(\n num_obs, num_coef, num_grps, coef_vals=coef_vals, mus=mus, corrs=corrs\n)\n\nprint(f\"True coefficients:\\n{b}\\n\")\nprint(f\"BLUPs:\\n{blups.head()}\\n\")\nprint(f\"Data:\\n{data.head()}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again here are some checks you might do to make sure the data were correctly generated (by default lmm data will generally be a bit noisier due to within and across group/cluster variance; see the API for how to customize this):\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Group the data before running checks\ngroup_data = data.groupby(\"Group\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check mean of predictors within each group\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].mean(axis=0)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check correlations between predictors within each group\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].corr()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check coefficient recovery\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from pymer4.models import Lmer\n\nmodel = Lmer(\"DV ~ IV1+IV2+IV3 + (1|Group)\", data=data)\nmodel.fit(summarize=False)\nprint(model.coefs.loc[:, \"Estimate\"])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/947a7f50199c9e20ecc24b24c789900c/example_04_simulating_data.py b/_downloads/947a7f50199c9e20ecc24b24c789900c/example_04_simulating_data.py new file mode 100644 index 0000000..0b201f5 --- /dev/null +++ b/_downloads/947a7f50199c9e20ecc24b24c789900c/example_04_simulating_data.py @@ -0,0 +1,108 @@ +""" +4. Simulating Data +================== +:code:`pymer4` comes with some easy-to-use functions for simulating data that can be modeled with :code:`Lm` and multi-level data that can be modeled with :code:`Lmer` or :code:`Lm2`. These functions can be found in the :code:`pymer4.simulate` module and are aptly named: :code:`simulate_lm()` and :code:`simulate_lmm()` respectively. + +:code:`pymer4` gives you a lot of control over what you want your data to look like by setting properties such as: + +- Number of data points and number of coefficients +- Specific coefficient values +- Means and standard deviations of predictors +- Correlations between predictors +- Amount of error (noise) in the data +- Number of groups/clusters (multi-level data only) +- Variance of random effects (multi-level data only) +""" + +############################################################################### +# Generating standard regression data +# ----------------------------------- +# Generating data for a standard regression returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lm()`, along with an array of coefficients used to produce the data. +# +# Let's generate 500 observations, with coefficient values of: 1.2, -40.1, and 3. We also have an intercept with a value of 100. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 1. We'll also add noise from a normal distribution with mean = 0, and sd = 5. Any correlations between predictors are purely random. + +# Import the simulation function +from pymer4.simulate import simulate_lm + +# Also fix the random number generator for reproducibility +import numpy as np + +np.random.seed(10) + +data, b = simulate_lm( + 500, 3, coef_vals=[100, 1.2, -40.1, 3], mus=[10, 30, 1], noise_params=(0, 5) +) +print(f"True coefficients:\n{b}\n") +print(f"Data:\n{data.head()}") + +############################################################################### +# Here are some checks you might do to make sure the data were correctly generated: + +############################################################################### +# Check the means of predictors +print(data.iloc[:, 1:].mean(axis=0)) + +############################################################################### +# Check correlations between predictors +print(data.iloc[:, 1:].corr()) + +############################################################################### +# Check coefficient recovery +from pymer4.models import Lm + +model = Lm("DV ~ IV1+IV2+IV3", data=data) +model.fit(summarize=False) +print(model.coefs.loc[:, "Estimate"]) + +############################################################################### +# You have the option of being as general or specific as you like when generating data. Here's a simpler example that generates 100 observations with 5 predictors from a standard normal distribution, i.e. mean = 0, sd = 1 with random correlations between predictors. :code:`pymer4` will randomly decide what to set the coefficient values to. + +data, b = simulate_lm(100, 5) +print(f"True coefficients:\n{b}\n") +print(f"Data:\n{data.head()}") + +############################################################################### +# Generating multi-level regression data +# -------------------------------------- +# Generating data for a multi-level regression is just as simple and returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lmer()`, another dataframe with group/cluster level coefficients (i.e. BLUPs), and a vector of population-level coefficients. +# +# Here's an example generating 5000 observations, organized as 100 groups with 50 observations each. We'll have three predictors with the coefficients: 1.8, -2, and 10. We also have an intercept with a coefficient of 4. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 2. We'll also introduce correlations between our predictors of with a mean r of .15. We'll leave the default of standard normal noise i.e., mean = 0, and sd = 1. + +from pymer4.simulate import simulate_lmm + +num_obs = 50 +num_coef = 3 +num_grps = 100 +mus = [10.0, 30.0, 2.0] +coef_vals = [4.0, 1.8, -2, 10] +corrs = 0.15 + +data, blups, b = simulate_lmm( + num_obs, num_coef, num_grps, coef_vals=coef_vals, mus=mus, corrs=corrs +) + +print(f"True coefficients:\n{b}\n") +print(f"BLUPs:\n{blups.head()}\n") +print(f"Data:\n{data.head()}\n") + +############################################################################### +# Again here are some checks you might do to make sure the data were correctly generated (by default lmm data will generally be a bit noisier due to within and across group/cluster variance; see the API for how to customize this): + +# Group the data before running checks +group_data = data.groupby("Group") + +############################################################################### +# Check mean of predictors within each group +print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].mean(axis=0))) + +############################################################################### +# Check correlations between predictors within each group +print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].corr())) + +############################################################################### +# Check coefficient recovery +from pymer4.models import Lmer + +model = Lmer("DV ~ IV1+IV2+IV3 + (1|Group)", data=data) +model.fit(summarize=False) +print(model.coefs.loc[:, "Estimate"]) diff --git a/_downloads/97b050c97268dd6fe761b7ee74f57e1d/example_02_categorical.ipynb b/_downloads/97b050c97268dd6fe761b7ee74f57e1d/example_02_categorical.ipynb new file mode 100644 index 0000000..bb55849 --- /dev/null +++ b/_downloads/97b050c97268dd6fe761b7ee74f57e1d/example_02_categorical.ipynb @@ -0,0 +1,262 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Set the environment such that multiple R processes do not crash the kernel\nimport os\nos.environ['KMP_DUPLICATE_LIB_OK']='True'%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 2. Categorical Predictors\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The syntax for handling categorical predictors is **different** between standard regression models/two-stage-models (i.e. :code:`Lm` and :code:`Lm2`) and multi-level models (:code:`Lmer`) in :code:`pymer4`. This is because formula parsing is passed to R for :code:`Lmer` models, but handled by Python for other models.\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lm and Lm2 Models\n:code:`Lm` and :code:`Lm2` models use [patsy](https://patsy.readthedocs.io/en/latest/) to parse model formulae. Patsy is very powerful and has built-in support for handling categorical coding schemes by wrapping a predictor in then :code:`C()` *within* the module formula. Patsy can also perform some pre-processing such as scaling and standardization using special functions like :code:`center()`. Here are some examples.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# import basic libraries and sample data\nimport os\nimport pandas as pd\nfrom pymer4.utils import get_resource_path\nfrom pymer4.models import Lm\n\n# IV3 is a categorical predictors with 3 levels in the sample data\ndf = pd.read_csv(os.path.join(get_resource_path(), \"sample_data.csv\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dummy-coded/Treatment contrasts\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Estimate a model using Treatment contrasts (dummy-coding)\n# with '1.0' as the reference level\n# This is the default of the C() function\nmodel = Lm(\"DV ~ C(IV3, levels=[1.0, 0.5, 1.5])\", data=df)\nprint(model.fit())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Orthogonal Polynomial Contrasts\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Patsy can do this using the Poly argument to the\n# C() function\nmodel = Lm(\"DV ~ C(IV3, Poly)\", data=df)\nprint(model.fit())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sum-to-zero contrasts\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Similar to before but with the Sum argument\nmodel = Lm(\"DV ~ C(IV3, Sum)\", data=df)\nprint(model.fit())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scaling/Centering\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Moderation with IV2, but centering IV2 first\nmodel = Lm(\"DV ~ center(IV2) * C(IV3, Sum)\", data=df)\nprint(model.fit())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please refer to the [patsy documentation](https://patsy.readthedocs.io/en/latest/categorical-coding.html) for more details when working categorical predictors in :code:`Lm` or :code:`Lm2` models.\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lmer Models\n:code:`Lmer()` models currently have support for handling categorical predictors in one of three ways based on how R's :code:`factor()` works (see the note at the end of this tutorial):\n\n- Dummy-coded factor levels (treatment contrasts) in which each model term is the difference between a factor level and a selected reference level\n- Orthogonal polynomial contrasts in which each model term is a polynomial contrast across factor levels (e.g. linear, quadratic, cubic, etc)\n- Custom contrasts for each level of a factor, which should be provided in the manner expected by R.\n\nTo make re-parameterizing models easier, factor codings are passed as a dictionary to the :code:`factors` argument of a model's :code:`.fit()`. This obviates the need for adjusting data-frame properties as in R. Note that this is **different** from :code:`Lm` and :code:`Lm2` models above which expect factor codings in their formulae (because patsy does).\n\nEach of these ways also enables you to easily compute post-hoc comparisons between factor levels, as well as interactions between continuous predictors and each factor level. See tutorial 3 for more on post-hoc tests.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from pymer4.models import Lmer\n\n# We're going to fit a multi-level logistic regression using the\n# dichotomous DV_l variable and the same categorical predictor (IV3)\n# as before\nmodel = Lmer(\"DV_l ~ IV3 + (IV3|Group)\", data=df, family=\"binomial\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dummy-coding factors\nFirst we'll use dummy-coding/treatment contrasts with 1.0 as the reference level. This will compute two coefficients: 0.5 > 1.0 and 1.5 > 1.0.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(model.fit(factors={\"IV3\": [\"1.0\", \"0.5\", \"1.5\"]}))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Polynomial contrast coding\nSecond we'll use orthogonal polynomial contrasts. This is accomplished using the :code:`ordered=True` argument and specifying the order of the *linear* contrast in increasing order. R will automatically compute higher order polynomial contrats that are orthogonal to this linear contrast. In this example, since there are 3 factor levels this will result in two polynomial terms: a linear contrast we specify below corresponding to 0.5 < 1.0 < 1.5 and an orthogonal quadratic contrast automatically determined by R, corresponding to 0.5 > 1 < 1.5\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "print(model.fit(factors={\"IV3\": [\"0.5\", \"1.0\", \"1.5\"]}, ordered=True))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Custom contrasts\n:code:`Lmer` models can also take custom factor contrasts based on how they are expected by R (see the note at the end of this tutorial for how contrasts work in R). Remember that there can be at most k-1 model terms representing any k level factor without over-parameterizing a model. If you specify a custom contrast, R will generate set of orthogonal contrasts for the rest of your model terms.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Compare level '1.0' to the mean of levels '0.5' and '1.5'\n# and let R determine the second contrast orthogonal to it\n\nprint(model.fit(factors={\"IV3\": {\"1.0\": 1, \"0.5\": -0.5, \"1.5\": -0.5}}))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### User-created contrasts (without R)\nAnother option available to you is fitting a model with *only* your desired contrast(s) rather than a full set of k-1 contrasts. Contrary to how statistics is usually taught, you don't ever *have to* include a full set of k-1 contrasts for a k level factor! The upside to doing this is that you won't need to rely on R to compute anything for you (aside from the model fit), and you will have a model with exactly the number of terms as contrasts you desire, giving you complete control. The downside is that post-hoc tests will no longer be available (see tutorial 3 for more information on post-hoc tests), but it's unlikely you're doing post-hoc tests if you are computing a subset of specific contrasts anyway. This is also a useful approach if you don't want to use patsy's formula syntax with :code:`Lm` and :code:`Lm2` as noted above.\n\nThis can be accomplished by creating new columns in your dataframe to test specific hypotheses and is trivial to do with pandas [map](https://pandas.pydata.org/pandas-docs/version/0.25/reference/api/pandas.Series.map.html/) and [assign](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html/) methods. For example, here we manually compute a linear contrast by creating a new column in our dataframe and treating it as a continuous variable.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a new column in the dataframe with a custom (linear) contrast\ndf = df.assign(IV3_custom_lin=df[\"IV3\"].map({0.5: -1, 1.0: 0, 1.5: 1}))\nprint(df.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use this variable as a continuous predictor without the need for the :code:`factors` argument. Notice how the z-stat and p-value of the estimate are the same as the linear polynomial contrast estimated above. The coefficients differ in scale only because R uses [~-0.707, ~0, ~0.707] for its polynomial contrasts rather than [-1, 0, 1] like we did.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Estimate model\nmodel = Lmer(\n \"DV_l ~ IV3_custom_lin + (IV3_custom_lin|Group)\", data=df, family=\"binomial\"\n)\nprint(model.fit())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A note on how contrasts in R work\n

Note

This is just for folks curious about how contrasts in R work

\n\nSpecifying multiple custom contrasts in R has always been a point of confusion amongst users. This because the :code:`contrasts()` command in R doesn't actually expect contrast weights (i.e. a design matrix) as one would intuit. Rather, it is made for generating contrast coding schemes which are the inverse of the contrast weight matrix. For a longer explanation with examples see [this reference](https://rstudio-pubs-static.s3.amazonaws.com/65059_586f394d8eb84f84b1baaf56ffb6b47f.html) and [this reference](https://github.com/ejolly/R/blob/master/Guides/Contrasts_in_R.md). For these situations pymer4 offers a few utility functions to convert between these matrix types if desired in :code:`pymer4.utils`: :code:`R2con()` and :code:`con2R()`.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/b91a3847324823a0f43edeaa7b0869ae/example_01_basic_usage.py b/_downloads/b91a3847324823a0f43edeaa7b0869ae/example_01_basic_usage.py new file mode 100644 index 0000000..88d908f --- /dev/null +++ b/_downloads/b91a3847324823a0f43edeaa7b0869ae/example_01_basic_usage.py @@ -0,0 +1,178 @@ +""" +1. Basic Usage Guide +==================== +""" + +############################################################################### +# :code:`pymer4` comes with sample data for testing purposes which we'll utilize for most of the tutorials. +# This sample data has: +# +# - Two kinds of dependent variables: *DV* (continuous), *DV_l* (dichotomous) +# - Three kinds of independent variables: *IV1* (continuous), *IV2* (continuous), *IV3* (categorical) +# - One grouping variable for multi-level modeling: *Group*. +# +# Let's check it out below: + +# import some basic libraries +import os +import pandas as pd + +# import utility function for sample data path +from pymer4.utils import get_resource_path + +# Load and checkout sample data +df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) +print(df.head()) + +############################################################################### +# Standard regression models +# ------------------------------------ +# Fitting a standard regression model is accomplished using the :code:`Lm` model class in :code:`pymer4`. All we need to do is initialize a model with a formula, some data, and call its :code:`.fit()` method. +# +# By default the output of :code:`.fit()` has been formated to be a blend of :code:`summary()` in R and :code:`.summary()` from `statsmodels `_. This includes metadata about the model, data, and overall fit as well as estimates and inference results of model terms. + +# Import the linear regression model class +from pymer4.models import Lm + +# Initialize model using 2 predictors and sample data +model = Lm("DV ~ IV1 + IV2", data=df) + +# Fit it +print(model.fit()) + +############################################################################### +# All information about the model as well as data, residuals, estimated coefficients, etc are saved as attributes and can be accessed like this: + +# Print model AIC +print(model.AIC) + +############################################################################### + +# Look at residuals (just the first 10) +print(model.residuals[:10]) + +############################################################################### +# A copy of the dataframe used to estimate the model with added columns for residuals and fits are are available at :code:`model.data`. Residuals and fits can also be directly accessed using :code:`model.residuals` and :code:`model.fits` respectively + +# Look at model data +print(model.data.head()) + +############################################################################### +# This makes it easy to assess overall model fit visually, for example using seaborn + +# import dataviz +import seaborn as sns + +# plot model predicted values against true values +sns.regplot(x="fits", y="DV", data=model.data, fit_reg=True) + +############################################################################### +# Robust and WLS estimation +# ------------------------- +# :code:`Lm` models can also perform inference using robust-standard errors or perform weight-least-squares (experimental feature) for models with categorical predictors (equivalent to Welch's t-test). + +# Refit previous model using robust standard errors +print(model.fit(robust="hc1")) + +############################################################################### + +# Since WLS is only supported with 2 groups for now, filter the data first +df_two_groups = df.query("IV3 in [0.5, 1.0]").reset_index(drop=True) + +# Fit new a model using a categorical predictor with unequal variances (WLS) +model = Lm("DV ~ IV3", data=df_two_groups) +print(model.fit(weights="IV3")) + +############################################################################### +# Multi-level models +# ---------------------------- +# Fitting a multi-level model works similarly and actually just calls :code:`lmer` or :code:`glmer` in R behind the scenes. The corresponding output is also formatted to be very similar to output of :code:`summary()` in R. + +# Import the lmm model class +from pymer4.models import Lmer + +# Initialize model instance using 1 predictor with random intercepts and slopes +model = Lmer("DV ~ IV2 + (IV2|Group)", data=df) + +# Fit it +print(model.fit()) + +############################################################################### +# Similar to :code:`Lm` models, :code:`Lmer` models save details in model attributes and have additional methods that can be called using the same syntax as described above. + +# Get population level coefficients +print(model.coefs) + +############################################################################### + +# Get group level coefficients (just the first 5) +# Each row here is a unique intercept and slope +# which vary because we parameterized our rfx that way above +print(model.fixef.head(5)) + +############################################################################### + +# Get group level deviates from population level coefficients (i.e. rfx) +print(model.ranef.head(5)) + +############################################################################### +# :code:`Lmer` models also have some basic plotting abilities that :code:`Lm` models do not + +# Visualize coefficients with group/cluster fits overlaid ("forest plot") +model.plot_summary() + +############################################################################### +# Plot coefficients for each group/cluster as separate regressions +model.plot("IV2", plot_ci=True, ylabel="predicted DV") + +############################################################################### +# Because :code:`Lmer` models rely on R, they have also some extra arguments to the :code:`.fit()` method for controlling things like optimizer behavior, as well as additional methods such for post-hoc tests and ANOVAs. See tutorial 2 for information about this functionality. + +############################################################################### +# Two-stage summary statistics models +# ----------------------------------- +# Fitting :code:`Lm2` models are also very similar + +# Import the lm2 model class +from pymer4.models import Lm2 + +# This time we use the 'group' argument when initializing the model +model = Lm2("DV ~ IV2", group="Group", data=df) + +# Fit it +print(model.fit()) + +############################################################################### +# Like :code:`Lmer` models, :code:`Lm2` models also store group/cluster level estimates and have some basic plotting functionality + +# Get group level coefficients, just the first 5 +print(model.fixef.head(5)) + +############################################################################### + +# Visualize coefficients with group/cluster fits overlaid ("forest plot") +model.plot_summary() + +############################################################################### +# Model Persistence +# ----------------- +# All pymer4 models can be saved and loaded from disk. Doing so will persist *all* model attributes and data i.e. anything accessible with the '.' syntax. Models are saved and loaded using `Joblib `_ Therefore all filenames must end with :code:`.joblib`. For :code:`Lmer` models, an additional file ending in :code:`.rds` will be saved in the same directory as the HDF5 file. This is the R model object readable in R using :code:`readRDS`. +# +# Prior to version 0.8.1 models were saved to HDF5 files using `deepdish `_ but this library is no longer maintained. If you have old models saved as :code:`.h5` or :code:`.hdf5` files you should use the same version of pymer4 that you used to estimate those models. +# +# To persist models you can use the dedicated :code:`save_model` and :code:`load_model` functions from the :code:`pymer4.io` module + +# Import functions +from pymer4.io import save_model, load_model + +# Save the Lm2 model above +save_model(model, "mymodel.joblib") +# Load it back up +model = load_model("mymodel.joblib") +# Check that it looks the same +print(model) + +############################################################################### +# Wrap Up +# ------- +# This was a quick overview of the 3 major model classes in :code:`pymer4`. However, it's highly recommended to check out the API to see *all* the features and options that each model class has including things like permutation-based inference (:code:`Lm` and :code:`Lm2` models) and fine-grain control of optimizer and tolerance settings (:code:`Lmer` models). diff --git a/_downloads/db00e21c01b8b58ae466b1e9ff23265b/example_02_categorical.py b/_downloads/db00e21c01b8b58ae466b1e9ff23265b/example_02_categorical.py new file mode 100644 index 0000000..790af7b --- /dev/null +++ b/_downloads/db00e21c01b8b58ae466b1e9ff23265b/example_02_categorical.py @@ -0,0 +1,132 @@ +""" +2. Categorical Predictors +========================= +""" + +############################################################################### +# The syntax for handling categorical predictors is **different** between standard regression models/two-stage-models (i.e. :code:`Lm` and :code:`Lm2`) and multi-level models (:code:`Lmer`) in :code:`pymer4`. This is because formula parsing is passed to R for :code:`Lmer` models, but handled by Python for other models. + +############################################################################### +# Lm and Lm2 Models +# ----------------- +# :code:`Lm` and :code:`Lm2` models use `patsy `_ to parse model formulae. Patsy is very powerful and has built-in support for handling categorical coding schemes by wrapping a predictor in then :code:`C()` *within* the module formula. Patsy can also perform some pre-processing such as scaling and standardization using special functions like :code:`center()`. Here are some examples. + +# import basic libraries and sample data +import os +import pandas as pd +from pymer4.utils import get_resource_path +from pymer4.models import Lm + +# IV3 is a categorical predictors with 3 levels in the sample data +df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) + +############################################################################### +# Dummy-coded/Treatment contrasts +# +++++++++++++++++++++++++++++++ + +# Estimate a model using Treatment contrasts (dummy-coding) +# with '1.0' as the reference level +# This is the default of the C() function +model = Lm("DV ~ C(IV3, levels=[1.0, 0.5, 1.5])", data=df) +print(model.fit()) + +############################################################################### +# Orthogonal Polynomial Contrasts +# +++++++++++++++++++++++++++++++ + +# Patsy can do this using the Poly argument to the +# C() function +model = Lm("DV ~ C(IV3, Poly)", data=df) +print(model.fit()) + +############################################################################### +# Sum-to-zero contrasts +# +++++++++++++++++++++ + +# Similar to before but with the Sum argument +model = Lm("DV ~ C(IV3, Sum)", data=df) +print(model.fit()) + +############################################################################### +# Scaling/Centering +# +++++++++++++++++ + +# Moderation with IV2, but centering IV2 first +model = Lm("DV ~ center(IV2) * C(IV3, Sum)", data=df) +print(model.fit()) + +############################################################################### +# Please refer to the `patsy documentation `_ for more details when working categorical predictors in :code:`Lm` or :code:`Lm2` models. + +############################################################################### +# Lmer Models +# ----------- +# :code:`Lmer()` models currently have support for handling categorical predictors in one of three ways based on how R's :code:`factor()` works (see the note at the end of this tutorial): +# +# - Dummy-coded factor levels (treatment contrasts) in which each model term is the difference between a factor level and a selected reference level +# - Orthogonal polynomial contrasts in which each model term is a polynomial contrast across factor levels (e.g. linear, quadratic, cubic, etc) +# - Custom contrasts for each level of a factor, which should be provided in the manner expected by R. +# +# To make re-parameterizing models easier, factor codings are passed as a dictionary to the :code:`factors` argument of a model's :code:`.fit()`. This obviates the need for adjusting data-frame properties as in R. Note that this is **different** from :code:`Lm` and :code:`Lm2` models above which expect factor codings in their formulae (because patsy does). +# +# Each of these ways also enables you to easily compute post-hoc comparisons between factor levels, as well as interactions between continuous predictors and each factor level. See tutorial 3 for more on post-hoc tests. + +from pymer4.models import Lmer + +# We're going to fit a multi-level logistic regression using the +# dichotomous DV_l variable and the same categorical predictor (IV3) +# as before +model = Lmer("DV_l ~ IV3 + (IV3|Group)", data=df, family="binomial") + +############################################################################### +# Dummy-coding factors +# ++++++++++++++++++++ +# First we'll use dummy-coding/treatment contrasts with 1.0 as the reference level. This will compute two coefficients: 0.5 > 1.0 and 1.5 > 1.0. + +print(model.fit(factors={"IV3": ["1.0", "0.5", "1.5"]})) + + +############################################################################### +# Polynomial contrast coding +# ++++++++++++++++++++++++++ +# Second we'll use orthogonal polynomial contrasts. This is accomplished using the :code:`ordered=True` argument and specifying the order of the *linear* contrast in increasing order. R will automatically compute higher order polynomial contrats that are orthogonal to this linear contrast. In this example, since there are 3 factor levels this will result in two polynomial terms: a linear contrast we specify below corresponding to 0.5 < 1.0 < 1.5 and an orthogonal quadratic contrast automatically determined by R, corresponding to 0.5 > 1 < 1.5 + +print(model.fit(factors={"IV3": ["0.5", "1.0", "1.5"]}, ordered=True)) + +############################################################################### +# Custom contrasts +# ++++++++++++++++ +# :code:`Lmer` models can also take custom factor contrasts based on how they are expected by R (see the note at the end of this tutorial for how contrasts work in R). Remember that there can be at most k-1 model terms representing any k level factor without over-parameterizing a model. If you specify a custom contrast, R will generate set of orthogonal contrasts for the rest of your model terms. + +# Compare level '1.0' to the mean of levels '0.5' and '1.5' +# and let R determine the second contrast orthogonal to it + +print(model.fit(factors={"IV3": {"1.0": 1, "0.5": -0.5, "1.5": -0.5}})) + +############################################################################### +# User-created contrasts (without R) +# ++++++++++++++++++++++++++++++++++ +# Another option available to you is fitting a model with *only* your desired contrast(s) rather than a full set of k-1 contrasts. Contrary to how statistics is usually taught, you don't ever *have to* include a full set of k-1 contrasts for a k level factor! The upside to doing this is that you won't need to rely on R to compute anything for you (aside from the model fit), and you will have a model with exactly the number of terms as contrasts you desire, giving you complete control. The downside is that post-hoc tests will no longer be available (see tutorial 3 for more information on post-hoc tests), but it's unlikely you're doing post-hoc tests if you are computing a subset of specific contrasts anyway. This is also a useful approach if you don't want to use patsy's formula syntax with :code:`Lm` and :code:`Lm2` as noted above. +# +# This can be accomplished by creating new columns in your dataframe to test specific hypotheses and is trivial to do with pandas `map `_ and `assign `_ methods. For example, here we manually compute a linear contrast by creating a new column in our dataframe and treating it as a continuous variable. + +# Create a new column in the dataframe with a custom (linear) contrast +df = df.assign(IV3_custom_lin=df["IV3"].map({0.5: -1, 1.0: 0, 1.5: 1})) +print(df.head()) + +############################################################################### +# Now we can use this variable as a continuous predictor without the need for the :code:`factors` argument. Notice how the z-stat and p-value of the estimate are the same as the linear polynomial contrast estimated above. The coefficients differ in scale only because R uses [~-0.707, ~0, ~0.707] for its polynomial contrasts rather than [-1, 0, 1] like we did. + +# Estimate model +model = Lmer( + "DV_l ~ IV3_custom_lin + (IV3_custom_lin|Group)", data=df, family="binomial" +) +print(model.fit()) + +############################################################################### +# A note on how contrasts in R work +# --------------------------------- +# .. note:: +# This is just for folks curious about how contrasts in R work +# +# Specifying multiple custom contrasts in R has always been a point of confusion amongst users. This because the :code:`contrasts()` command in R doesn't actually expect contrast weights (i.e. a design matrix) as one would intuit. Rather, it is made for generating contrast coding schemes which are the inverse of the contrast weight matrix. For a longer explanation with examples see `this reference `_ and `this reference `_. For these situations pymer4 offers a few utility functions to convert between these matrix types if desired in :code:`pymer4.utils`: :code:`R2con()` and :code:`con2R()`. diff --git a/_downloads/e7ef29a00a8623944961d93353aaeb69/example_03_posthoc.ipynb b/_downloads/e7ef29a00a8623944961d93353aaeb69/example_03_posthoc.ipynb new file mode 100644 index 0000000..17bf007 --- /dev/null +++ b/_downloads/e7ef29a00a8623944961d93353aaeb69/example_03_posthoc.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Set the environment such that multiple R processes do not crash the kernel\nimport os\nos.environ['KMP_DUPLICATE_LIB_OK']='True'%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# 3. ANOVA tables and post-hoc comparisons\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Note

ANOVAs and post-hoc tests are only available for :code:`Lmer` models estimated using the :code:`factors` argument of :code:`model.fit()` and rely on implementations in R

\n\nIn the previous tutorial where we looked at categorical predictors, behind the scenes :code:`pymer4` was using the :code:`factor` functionality in R. This means the output of :code:`model.fit()` looks a lot like :code:`summary()` in R applied to a model with categorical predictors. But what if we want to compute an F-test across *all levels* of our categorical predictor?\n\n:code:`pymer4` makes this easy to do, and makes it easy to ensure Type III sums of squares infereces are valid. It also makes it easy to follow up omnibus tests with post-hoc pairwise comparisons.\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ANOVA tables and orthogonal contrasts\nBecause ANOVA is just regression, :code:`pymer4` can estimate ANOVA tables with F-results using the :code:`.anova()` method on a fitted model. This will compute a Type-III SS table given the coding scheme provided when the model was initially fit. Based on the distribution of data across factor levels and the specific coding-scheme used, this may produce invalid Type-III SS computations. For this reason the :code:`.anova()` method has a :code:`force-orthogonal=True` argument that will reparameterize and refit the model using orthogonal polynomial contrasts prior to computing an ANOVA table.\n\nHere we first estimate a mode with dummy-coded categories and suppress the summary output of :code:`.fit()`. Then we use :code:`.anova()` to examine the F-test results.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# import basic libraries and sample data\nimport os\nimport pandas as pd\nfrom pymer4.utils import get_resource_path\nfrom pymer4.models import Lmer\n\n# IV3 is a categorical predictors with 3 levels in the sample data\ndf = pd.read_csv(os.path.join(get_resource_path(), \"sample_data.csv\"))\n\n# # We're going to fit a multi-level regression using the\n# categorical predictor (IV3) which has 3 levels\nmodel = Lmer(\"DV ~ IV3 + (1|Group)\", data=df)\n\n# Using dummy-coding; suppress summary output\nmodel.fit(factors={\"IV3\": [\"1.0\", \"0.5\", \"1.5\"]}, summarize=False)\n\n# Get ANOVA table\nprint(model.anova())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Type III SS inferences will only be valid if data are fully balanced across levels or if contrasts between levels are orthogonally coded and sum to 0. Below we tell :code:`pymer4` to respecify our contrasts to ensure this before estimating the ANOVA. :code:`pymer4` also saves the last set of contrasts used priory to forcing orthogonality.\n\nBecause the sample data is balanced across factor levels and there are not interaction terms, in this case orthogonal contrast coding doesn't change the results.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Get ANOVA table, but this time force orthogonality\n# for valid SS III inferences\n# In this case the data are balanced so nothing changes\nprint(model.anova(force_orthogonal=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Checkout current contrast scheme (for first contrast)\n# Notice how it's simply a linear contrast across levels\nprint(model.factors)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Checkout previous contrast scheme\n# which was a treatment contrast with 1.0\n# as the reference level\nprint(model.factors_prev_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Marginal estimates and post-hoc comparisons\n:code:`pymer4` leverages the :code:`emmeans` package in order to compute marginal estimates (\"cell means\" in ANOVA lingo) and pair-wise comparisons of models that contain categorical terms and/or interactions. This can be performed by using the :code:`.post_hoc()` method on fitted models. Let's see an example:\n\nFirst we'll quickly create a second categorical IV to demo with and estimate a 3x3 ANOVA to get main effects and the interaction.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Fix the random number generator\n# for reproducibility\nimport numpy as np\n\nnp.random.seed(10)\n\n# Create a new categorical variable with 3 levels\ndf = df.assign(IV4=np.random.choice([\"1\", \"2\", \"3\"], size=df.shape[0]))\n\n# Estimate model with orthogonal polynomial contrasts\nmodel = Lmer(\"DV ~ IV4*IV3 + (1|Group)\", data=df)\nmodel.fit(\n factors={\"IV4\": [\"1\", \"2\", \"3\"], \"IV3\": [\"1.0\", \"0.5\", \"1.5\"]},\n ordered=True,\n summarize=False,\n)\n# Get ANOVA table\n# We can ignore the note in the output because\n# we manually specified polynomial contrasts\nprint(model.anova())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 1\nCompare each level of IV3 to each other level of IV3, *within* each level of IV4. Use default Tukey HSD p-values.\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Compute post-hoc tests\nmarginal_estimates, comparisons = model.post_hoc(\n marginal_vars=\"IV3\", grouping_vars=\"IV4\"\n)\n\n# \"Cell\" means of the ANOVA\nprint(marginal_estimates)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Pairwise comparisons\nprint(comparisons)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 2\nCompare each unique IV3,IV4 \"cell mean\" to every other IV3,IV4 \"cell mean\" and used FDR correction for multiple comparisons:\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Compute post-hoc tests\nmarginal_estimates, comparisons = model.post_hoc(\n marginal_vars=[\"IV3\", \"IV4\"], p_adjust=\"fdr\"\n)\n\n# Pairwise comparisons\nprint(comparisons)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example 3\nFor this example we'll estimate a more complicated ANOVA with 1 continuous IV and 2 categorical IVs with 3 levels each. This is the same model as before but with IV2 thrown into the mix. Now, pairwise comparisons reflect changes in the *slope* of the continuous IV (IV2) between levels of the categorical IVs (IV3 and IV4).\n\nFirst let's get the ANOVA table\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model = Lmer(\"DV ~ IV2*IV3*IV4 + (1|Group)\", data=df)\n# Only need to polynomial contrasts for IV3 and IV4\n# because IV2 is continuous\nmodel.fit(\n factors={\"IV4\": [\"1\", \"2\", \"3\"], \"IV3\": [\"1.0\", \"0.5\", \"1.5\"]},\n ordered=True,\n summarize=False,\n)\n\n# Get ANOVA table\nprint(model.anova())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can compute the pairwise difference in slopes\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Compute post-hoc tests with bonferroni correction\nmarginal_estimates, comparisons = model.post_hoc(\n marginal_vars=\"IV2\", grouping_vars=[\"IV3\", \"IV4\"], p_adjust=\"bonf\"\n)\n\n# Pairwise comparisons\nprint(comparisons)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.19" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_images/sphx_glr_example_01_basic_usage_001.png b/_images/sphx_glr_example_01_basic_usage_001.png new file mode 100644 index 0000000000000000000000000000000000000000..1aba8307f3341e8c7c868de55b914420d20e9e67 GIT binary patch literal 62031 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 jZH4fO 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

rWH{DG}4>hl0!&_L^`Q7^{#GCCh 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 literal 0 HcmV?d00001 diff --git a/_images/sphx_glr_example_01_basic_usage_002.png b/_images/sphx_glr_example_01_basic_usage_002.png new file mode 100644 index 0000000000000000000000000000000000000000..46f860e611109cf6f0d51bb33609ef3c1a2a1d0d GIT binary patch literal 19262 zcmeHvXIPY1+wCAxG!~L*Gzv(JC>8{i-i^lK2#B$ubWmjIqx25O_C^JCklt*7NR^>T zM~x_5Kp5#NO{7VeGR#?f)a3o%FW+0P@BBK~$(1-^oOz!8?0uJYuY2A6c3{8y(l6J1 zNuf}dQuqFJkV5$)jY64sY~cdDW8W>j1}_SZdyY9CqMJLqnA)GDXqh^mvY|WLSRVi0 z`J}yrCEZR+Tuxj{?0XAG$5Rf95)!t5d_bITPm`$Hx%(|Hvgp)aT?Yz<-<15vb5||i zl0w;+Nd4)@!>*A7tsaprPF@motp06zjZ4cnEXw2Ab)|UTk)6M9GWzn;rd#u}dVaB1 zIdb`;`$HWol_ra3;drBiso!SW`)BUb&eXF?)ZuTs75w5>;omnV9la9&xSkrgi5HHCE8f3sa{&+u9En7^U)Ig_JMvB{$9| z|5Mzy5Su`uY?9_#NnX!yES`s#8_&NuMt)ooPFai>-(Aa1c<_3_VxAaz`%5if^6i~B z7ybV)|G&9mLY3l_P}LJBPE5VxQwtSw>(g%!Pf1DHc=QXL`%LQLR90W5II$GU#P8qi zBCmhgMDLmT+iW~Nm05-^hKx=*?+&@z8q;UI6pG}ieE9j5I*Iio9m1Rkr&r@k=09jG zB!>0xnqRDYff3#LYjVFdQS<+5lgYPX(seZ4*?9KNsz4D5kH+#p?i`9mCFvxd9Di4@ zTj1_wm8r)p$Blh?k1H;q2p;dUS9tvR@oFI=pn4i|1W!pP2 zP-%Km$aycXNcC&>A@LBG8IKLr0;B418SC2ic8OVDJ%0&BO6ZsK#4H%M1fNYGP>>o} z;=k6d^O{XlM#6osx!I|UVmr5#Ik;|Iy>@Nez)|LxbP2xnI$QSixNfG^k+q)hAKJW3TgR{Z!9*unFKE1vr9Cs$U5tyDl$2~dca)lL zSr>Q3&+lYqxXk8|@;W{BucIGJRla@u_D4g0$w1|{RYG-a)%iQExAQIzzthN z77(>L+ikR)e9g?vthU+z%9YN)t@jU|XjHEBURM26Yilc?lM3@<6u}`^aPM zKK*@jV`ErXd5E02S}=c*)YFu530b?AP}}CL*n$GD+U9_O0MW2H3iUfC2m8*nYt5xT zHA*;K_Ue_%@_V-|#By#O`EZNZH^FStI_Xlpxi7Z%4oj>4j7`GfeMgTT&CShqo-tHC zT(u;y@_OG}*Ri~d%F(K1(Tnw5~65s&{%l$H+&3dt7hx9zvSuD(fU+x8R`flB>&EKDbf4a zE#pFMHX6`qwC?Jd7_A7|*wj?|BeA5Z(VqCk#J;QZ_tvom?T)CZs06>=v6*?oa)VOQ z+m}u{H?dCnudtozy~#cG+{FN9YtBhP<+ZC}cmc41N(|k}^SXdDzCF;;qrA4RH zvuvA#+uGU$onM+>RNnbbN%4#AO2IlEmzPoEE>RYnZx`NjnNFAL!sgj`htZ}vzpgy) zESCI?JjHyTl@<1?hgU{~*-PeqH%g%dBJ{6_{QOfMeyX6Dmp$x1UcpPze9_R)4FV?g zPx(SGLABA+&Nui#DvRkgGa*vilH+h_OHjB0@!5Vgl4N%B1eKo@b)xJ zK1$^)H$Lg+Kiun7^5HEfEi5+i^73jWExDn9&jrg3oRw2mjrN%e@u4#E-=CMzRDb#~ z%Jl`0(8X{TPx!;pWfocXIgv*abxx-5&ODfK{bYIY)RF}iihM58i|g(fhz~ixzpC6+ zX9=6{9U7X9E8s^Eu*>NR7Ac+TiSaow6W;F&>vLN6HdNM#FWfq7K|{35&aap7^J}j$ z+7M8j$pD*g)2}r( zHD`0zUb2z(se1KlVcI4Udef6PzW(N+msmW)S0~zS_>&4als(T|TfGjjcK=d2QN3C) zGRu4wC2%;-P;A*-iwkGHgk1Ca_jcJ&-LSUVGxN={>>WdDSkAI#afi2Pxf^m_fY|oXCd{zc%@0Z(GLYCpJ4*Dr|tgP8iQ8lXi)87NOT)d@TGN(KgDdNl9mGijpZEtT4?RxN=%cqz9oKP4) z{%!FUX5YovXU?2Kq}f2l4JIFmb?=-UdMvv~M?8dSRew*#d#7HOP1w%k{2L>tGNjU? zQ^K_K=Bg?q(=d2IM-g!ci~m7?Xz4;}bIEAtoF-#|G3A^+>*!3h_G z@6?MNH=WHdeN^HnAZLz%O=X<$SJ)U86}5bjdFu6}NcVRMbqA{p<)8bmPG`oh^4$(IUl*?VHgj-;`l_sBk1GwKIk@6~lyawD9=yt}hP%{nEEvM`}X~r8R=Z zN}DpR5wh%O2C|1n*{S&>Ws#>#R@dpYJ8lZvH$^^V+I%v^FnGvo$YUyi^C6&n#SzH> z7VTab^UTDA>4R@qOwqObz7rIzsP>r~&F>Hz!V*1N-dn{-Wf#1?b$R6ZZhkF?AgOjU zsm&hl?mMKVGn)I3!Jh-8$L>Vhmu*%Ue{qQE*jpP{o!?|hmsw?c;kzeYIXJSP`I8K< zmv_yM8*`jeisq)xLl{VhFBUv>=&mTGvm5ALCxmB?MYH>9a>@R;HrdzJM+sjLRr1i= zx@n|6S|!4g7Sh|>Tk29c8rA>u{)vFEdd-@$OqNjuXIO1cond@|k7eMXWi%SjGJ~g14RP2-JsQT- z2Y*&qcWBV1bxF*~07t9E+Wu8{&Aku?JmfFqZ_K#Kv4F>$Zuk?5=X- zIr}WT*6`)~<=6Sl_4q`GX)e3{sE50u<({B@Cu_q_BXOTsaWGESDYwmT z&8n74-I&MmXd8|8#4R=SBNkQV!Ae)JUftL+?&alGH|H`l=u(u|ob_~Z{n`NLrqeeN zWlT5=)0~HgICDb^eM!u{*{NXWGEMH#Vm?E@EUPq)1uq!$ba& z@l+p`_75d;3=uY)oxtiN0Vr~PfbtHOv5yx5=xEU#i&N&-6BQ!Neygr9@@##e$YhIy zb_%v(wnJ_1L{oF~A)xYGs|q#+D39!gmsfZGrtNtgv7l8xq9w|uEo@cc`}1zBytbgC zxxS(*;`VWJ1)J&abrJTJGA!wL>|#FEt1dA1oRPAvqY|7EiK(+{AI=ijQ{c>wjus4g zNf6v5!!ih5EdIdcQP{gG#lED&TY`wg_e45W9iB^|MJ8C~Dn>C6I zSh{+QR?5lceG%9A;e#viY<>TZm+Ar8$~i?vJ`Fx@yp#hg<|P>>8Rj|1?7ujNXcYhT z+u0gn_Af>#189zp(m0pizCI0g^{40Pc17dK^sXwUp^6Jj1$NM?B1KC1u!)|%8pdVh z8D|HF=Ij{iycdhu%|(^J&R@(B;Y_D;!htKguwP|V(WvVp%jaF<_k6`WmE1m^Y;gL? zw^YV*ZRPD`a~-M_dOF`FrrHU;A!v|Qc6GZ)PGTPcSTs8Yh?2AQ>P^1C=rg9HHET^{`o=A8u2`GV&NW=Y^-2(1h`_C)?W}w5Di; zRH@GNw>Ys317_p{)oJ54?S) z`LCDKH}$6{d)<7!O;Skjq}vWkv5m=s262LUk)qWG2i6KK=vThmrr&;DFF6<}gR0H+ z#&*bw5B2M3)^!MlvaB-m2c1&Oi5m<#w<3>Ey0?4TzGq)Ho;|+nZdM}diJonAxAJqg z$+9z6@n+#Ab17_@=bp7h#a6{{;SDnv$bN9#1 zH06%fmEy0jZra5hEA?#lAf7|v{@*F=TLUvX zNWr07dhHB}hhm1g(%PPHmh-=*Ka`N^h?uj=Y?5F6+97&0a?#Rhg|UrFyn2b@N$t&5 z8)EhhOzI>Ywy)U!)U2b#k1sy}aG;xb;T5CwyhAw#Rrii0PJA~grk~aCYrb=T&u?NA ztg5b35BHSt*NZ3z1fR@&nO_IcAd^G>fwt5<77Z1=O|*!5O2 zTaTtx;2xq;rhIiLO-#No58hTzN=v{`QfcDHtv0Sfv+1;!GYblAZEd9r+gnZyl&AOb z-gns8l@K2t9;*=|t0EHqTlEo&Z{yv=?RD{Wy8Y9Asnz=J(+#sAZ#H%A2w`W!j7X&N zllpcrQ5bJ44CRlG+!khUf-lz{Y7uj|ON#~ImRa*o!njb`(9rPEoYIXT<+10xNeZ7B zXr63hojQsY5LTnrrM*C#mL9bT38H`%7$|1&Kr%ks{oT5xg;+$zH;|bylWhn$++RnoHr39V@mZW2clGDaIAMy<&>JU zlJ&Dwo~y)|CqDHMQb2-pc)V1ulO%Dn{M=dRo{B_rO$B6|WqYPBRvea-m;0GQk^gR9 zlCB9Cj+*Y1|8VneS=WeNb!BIb>W|h9NmL&n&XvV_`t^l{{*fMoImC}fOSQds#C-T& zH2ri($tN71skaU1Nm3k%g4{HsQ3?FEMIcgO{myHdk5=8GFwamfuYUNDe@~V~WlCkP zbs^hJNH@dcmlR;k{L!ePigA{4Ox{qT63N2dl@TF<+Nuhu^G(a8ZQ279^d@YsQ1)~! zKIj{^+xN+pSFbMqARr{9a<@-GdfAxM9VSz1m9gh(@xl*pdd2TwjXU1R+&*u`HHp1E z<|}ztO8t5^hPSS!<{D?BeNMk)N8JgqBpywz z@|tW7vCnDgXDkbgs!Vb5@?X1`X&o29y4L*;))S`{kq#mWsb8dI;d2A-MfQ!WR7RZt zH7u#LyXvg4maOQ}WE}^jeNifjQ+L1=>3IimBGeTw|1#{BverF-9dUF^(3LA!?&u|( z1Jz9h8BcwC;tPxLj}(Ab?v*r92#x6{jc!xE{OORO`IQ7kfd(7YEu(&P&-K)ijCd7W zy?J6w5BOMa!9En^`wQyj6{CjTjlOKwY|NQk= z(kwHnE7Chp#x=IHzLx4+7Rlnf@z(P`kEFxGG+(bBjkSqReGRcprbFsvL=w-voxWkm zwW~cemQDICC@t1}Mb7R=-}%ZZ1>2Ulq?zt^_wbnf&TOEGa^(ABO;fl2hjrhtruZhj z5j$7h(bT--1_HCnM0(?RglICQI1xLl5_frox~9Vj-$&_U;` zin_dq&rqa(>!S0~X=gjV+`PbX7NBf(H3-PApqZH5sCmwQeNngy3{h=!bHqS%cD#YO z+_Ho7=T(RV7ileB%Ha9PNSX=>3Av3Y8n-_1yz!ZsqiGKqEO=2@7ntMFBWst9S_;+R z$z48Mam&&|<)KEoH6px}Q{YVBb28q94a1Ss5qQqFRac$dnKzN@-oN99m!<2ruS_;J zhV-bcII^`co`=HJN8NuxTJo}{vw40LUqaQDNevIB?{kL=XGUI~0K}IS&dF-)i z-2GXOpRp*Hb_c3M$WxFJP4LaIZ{FKTJ3Mr`f5fi*_F zf{NrrzdqHkH4+brIJ{aaZ1u4Uck^XhLhNKpc)7W#k&$b#3UvhMu-I3ZBBGY>+&D?5q ze+Mt+)hqdj%j+I45wkEwOjqc=6X@J*r=@uDk)~~%r6+|VsI1WxW;IVN^n4Pv=Rjz} zk5`9zD3UT**B0Gf3%4cdC3jCW)2j!v+oO@_U#iN>KWKJri%O!>?p3__{@Dju-J7pX zeq5ZWlQ@MsB~rp?s(kr8G3#1|73Nl7nc)sQhmY-A$hHdmF)Dfw_GCrC{Z*#R9^@)dYHZzFutn3`NGL*1!+{ zQ7g1^W5_Nd-WqK(0ud_ds-uw zkv2R$>1`E5bLNd;SQl?1hUL14YiB zJ!@$lsQX9XNEYm`w%5BuQ!nCGgRn{FA^0l_-%tNhC$i7NnWuQnl1{G%3aI;6O98J( zdKDssT?3R1+zN~FWz!a{%t+f8%ScQuR6J_z<+LSe-~ZBJ`kB@L(qO>zaf!UK$;tS` zTV!&6z{9`vF(*EDcuUT^dx`e-M~=oGOpyLx*o(ftJ}JsePU703zwH}$FKFv0_o0|* zYnGDN8_&hoom;8%*WA8T+Kux^wgh>;KPy~8&^!|S|K^MUL3-n3+WzW{Hj~!jCv(9W z;Q$x}{ov_KzlH4<&q?tv);kt^uoSFb`tc{1e!fb&)lz={Q7^lprhlGqZykW>A#Ih+ zkKM{!q=7D%w~*ZaW`vwp1j*OlN)g89AQpQSRg3&)dt-@UW4--FMjaX@*$AvUUk zpM1}LcKmj1btUmF{-qlQjL7@Y*9qqp>D(>paz|AUMn^88nNgqQ^lv?c@xXtHrjec!k{^D>@;;;RB!MPC2VM!0`;#;HV9 z-y)@?uCA)8`qVMk_C^2MD3ykS*RLGkl3b2Fir0TBpVtY{{tex4+DxNJ=~m;Zvj2V#{L1flb`amG`03xbg*S>yN)d*55Q^aS|Kf%JARyp+A<~0^ zORE!=(f+}&eXsh(b^M456&)5U^^O4{1o+H$e2Q^m>xfPMyK0vp1e=0J;#HL5XebKs z`p5ZY_@j8zj3L<@RF5VjzyG9!#^*bqASnY`wm$JF4GIL1?v>(1hqLT&|4~TN`INym z1KbOuk%2^d`}H5@-R3kK^@7#WT6*o5NMrWV97eX#A z*OUeytk2X-ZtTL>ig`YxrGF1_d`c3&y}$f*Quw4Q0?Z(5I{z`KO8rA4_tW`&-X(pz zoDJD6_8NbRH2yOr_W79VZo}a~pHdlfb92}C#s2AvSjx_upB?Zca66n>?>QRLuE~gW zX>$WWpnr;<6~t>$Hnt9V%eA8saVS|Q!f+WbAo$gPq?k(n1O-FaA`%J6*=aJwj-`G7 zXUh64u=?x~A3+m}l=iua>_8DhK-Hoe?7W0qn{XD9T$@;*WRSCiI#NMXJw#AY@s)qm zp+6n%pGyK7h5Uue02%uS{`(vZdcVURDJwof%1ph=O1bt(5w{Yl=xY-b6Myb0wp{3XYzrSVT%ehSmLZ9RH8SU&J3$gN!t*%YU$sZ5)$zvbbtzHyCg)Z z`&Gsda}7v}@eir&vnBks17>^*ekSfOtTG8{OJy9|udu<^c84{VV7~UV!$H=Be?B{$ zkjBFDE_>i=DMiKb!NEZyBZ!ahxiPsIAM*Htzz6uG1PUN31LQi9quiLtChb^V=EeX+ zw|pogmMmQgit^QsiKXN_z!7QMgeiM{gz=(poP4g!K8G5Fjd=d9B%f8uV5|d$j|Qm1??%4ukqlU^#? z^^ornwhU`ovSf)SwE!2C4EwbAH;$G4{bmZD{{8EzxyhoKQX_F7mf&sr<_n0JvhHW! z`I>1TH_?38F<@i+7r&@?^{8>C?3yn^g;b1mW}?R}sC5#%qCEzw3_{ggS~q(%=Yc?5 zn7SpX>|E@xcw$odFu|IYR3tro_@h)RE+6Vla1EOOQ-og@A$rLJ8Pd=;hJTL+D8XS)1oG(9!ztHXmAg+E@3sfjAA|ujs=QiG$)H zh>-Y~2^khD0Q?I(MYnl9!XBYha}4a98*%xHd64h0TBr_4i7w}8xA)i7*Or1xJh&xj4NXWaq@3hJ2*Ns+ zT!=lm*_xG7neR4=k~JDqAW(9;2Z6SVGYBUEVPTm0#K#!=nzp--Pd*{6LmrNZSddOSB&PSvJrt#yDO$tgWq0+WJVOC0QtQ@LCZe zCxOkzcZsY3TE}3pPGb`jgDc%}polU1t9enRo9Hm1n|YQZbpv4?y#RlaQf3UhU#04* zUb-0-9y2$p#*u=N=%u8ebaG46MbVGk0sbohdM2}E)vb}WJ4zu@tkY>aH4JI z=-HryLT-x7pO~pp7cQutfu@NHS3+wLj(`fX;n+cWpSfA=xtXi0yhez4l>bFM1!eid zv>WpWBB?U6vRTHHTe)^w1+mL0Y0Q8xNnrIs^8m#_DQtO!G!WOXUynDgNKYTi)p(sms3(aW3d+#N`zO>HFksn1xJj^#bpv#Ca!jyy6urpR$Y$VLM`wG~ zicY&}e{`i_^kBN<)!3FOM1@KC!9{xCzI}%9DTjlso!~q#(|pX&oZ@2oRp3zB}=06QY@2{%{HD%e&P@ zv|T61>o<3dq?QRDvZloA@00>`&ICgmVc%?O$C@^REh*Psh!utERPB2Ch^S}K{S_~TaHjU>^+SeU zlX>l0s8S(12_{fJ)%D3%`2}VoLdaK0N03uSUAcN741mUv$JF4F(~g)gVfwYUD$W$*lT9pdT)Mw=dTI z#s(z6V%4urD(6YKm1?A;<7wbAkhvUgU#Q~4ne>Ta6;5PQ85$A=(w~(TW{_V_rE

    7xW7=AG!_UenDmGc9tA>%Db%Y#U^=|up)5jMKeAwfBnJD}yuF7ce-MD>w zeX4tXqWwT7YyYt=6a1X_{Hp~7%1Mc;(&mCPfkfKLT#k^Eb0<0^(eLR`{e=$csPV-i z4MDFHXoQ~BXfZE8x>4*K-s*_GgM~ALXPZbNr@WS@LF{yIYzUFH5ha{Jvnnu656gRi zW&iuv>YDB`L*A2lIfJ=syVMz@`^Wb{n^&3Z*j3ntql=sq*eIb*dNq6KVn6b7Ed zPp0bB*mcAPJz6JmDomunMVw#>W7V#JGi-?41EE;CKkVS+^{Vil2V;0awHIlxRH>Uygz5PeAKlPb?$`y|(=W3=E6cpUgKh>7+ zmO~Vc(2R(ojrKEwE8IRpR~GkTo@0LXNDN~SQp(Da&_g@AxX>VHB1!dg%NrC)Icfbv zW-J~dYr79mOOh?LOtJ7*+``Yx4~4++HC#?opY(-vi@d!Wl60kR-kiyG>VtIhI)uU^ z0aY396U>+>k;Z&C2dDxSO@)PoiaZ;EURA$1LOKY|0NKo+atzwG za5G3^7$WfQya8HI7N8=k2g?*P3HHS?N$c5unp*R={HEUf?4*zI;5t46L{brhoR>#* z`&`<2GgLUFt`Ny2_sZh}dejxP7%yjrnT?H2YIbX5^*w;(nTY`qdDUpX5*Pvyn0lIn zD}tVYxJsqVUiWXLM$On-KPkO|*J3k~Zj&-t#i$6K8RR{eM>`%PZ_Xm;R{x?d6eQ9J zRWL)Hc6@w%T*mzPKz|IWN9!JbvnzDN+U8~}Gz2!QBg>w9fA3%dNyh*WQ;pT$!Ak{X zrR|C^1p<8DI!!}zDR%sd(3h+}baXYcY#JG;5`U&6PbyrtLhZKP-OTUG6>0GR;0(mY z<%8Ly(@!U=VI;o2Tw)P|9yB1j?j@!G(3JvW>{lAd05CO2qJdmW0rILHl9JEgp2@5O zBh_KgwbSN~@w~QGSaKX=kI66HpZ2>10C!B%RJBRDR)MT=V;~f;Az{|+{~IQUP$F+LFuS! zOLjcMeQa7DY;Vpcz+VfifBV(~>s)UK z)<#|?jV^!y7&mp&rQK^%SCv~Zkxoi+VdQ*N#;K=sz$_E-0ALi#W5VJ=Zh-V zcTj5A%viCczS>BIC&S2PV*^N!ZX-cHY4J=7Vv?ZOSdGHFySK?c!GB2Ehzi3pQa25_ z(?C3)U`@FlJ8F-qhTb{dS{0_Jv^yCAuGi-jE>z)8r1EGC0%Yacq5vx293RObI$_id z)nxZ!H7G%dBnPn#vscG(j%#QFnrjC_>Khvy)W9; zRlO4cYxHf5J?xWTqELKAvQc*-RD~!TV7piGu+4UP+xS(+4&ZBOshqfQ1n3f?O(G=4 zP{p01A~m?%PYm@LYlyJb@KwumW~k7^46Ig33T5 zCD9sZLp*EkF%)IGsMH2g`~NI?Bw5Erf5!u)EAkmvSJy{FKtR3;hyuE12=G8s8rWo5 z6_S4-q7{<92sQfsIZ^4VeGkA22s*v^MK{mcmN)}JqF6PlGr(Qc)(n@21Rx;d?JgLa zUBhnJ&yDkzZ1=q1yAwb*&G$S@?;9k(9gL)v-A;gu@DXoP4?Eu+@ zK=G03ke)hVRXC03L8Su{~)gTEVy8$Z#PeFZ+Ua#DmLjGmT z*48!={4az^p=*adMp%bcEzfdsa*92?B{q4WCgeBxAudDA1MeUxVic?rc<&Fa6alE?zvS{w zva!=uDHX*@S>T~aQHF{gt0mHE2GJIyPNf1xpo*&l^8p(o1a~zA@LwFooi&wsRzCkk zhHVV+(tU}k0|XJoB0|!@X$hI2?Oq#5vc&IJjHp{~#3FxyR!L|)DY4j`Kr%6J1LOQF&|6We|EJu@YXEkH$d< z9W`=0i4O2}z;1#=r(W~>yo@}4lcJM!>{`6afF%j6(0qq#i06oaT?{)V(6PX~7Xth$ z%lN2ZGTlLv01>j2Aq;B+dVX;i`)-im!Q*5BId3j)9jS6Dl)``& zC#*-gN5QS;ve9)YW6~O9f2>2~+7=(mE(C2o+D!!3q+cRn_h217*6rb9qpP@(jNOTrVhJJeT2r9DMqBL5w_y-b ze*~qB1ecBWZFW6Viut1UazaZ)IyYG^&k~Rlp?+$;N{&ZESKCt|Rb5ek)VTGfbJ^y2 zE+>F!j(Ox28lVGKfsQq>FWo?0%f3LbxwVJ;coW%0DpWFJK=QC#`%GI1t6Y$k0hK2s38a8_U?42n!-60SdD)M!XLVN2+0GJyc9-}}*rFqjm^Bm_J7=3+n>ZFC#+ zRo-rALPvsAQ!F1g z3yE`R*tuj$FnaspAb=1uT_S8VNd;J#L)p0IyYKdX)4{iK*rRCDW2y(^O|#8KY<)7y zR^r^Tz?p^cO6HzuQBFF<5$d$nRKVo~4bRJaKxi3UM|nI!TMHZ*(qg)OSDEM7ZDI1` z34`yX2J?9M()PQUT>DW4;$H zql~0%oXFHb``iF&N04*oimA!OpAl!8C6^~{kqgYw0_NK{5mB(a z!6_ohxD80!<83o-ljcw+a3^s#>MX5vnCc4Y8JZg$8tIboQ2;iu_FUZ7-X4Saaed#0 zjsy}irz+ZZB5J{x77S|CgJXl@2N8O4O$ zc0vn)NE@5&E1I)L>SZM{ZYHD@PQMc=&FP6&GMyn4QY=U}s4&(OqyjCcb0+8jTJj*8 zN!7xg_rk=o_ctB$CqlOGW?V;({6m(2rWWGye@i<5LhgfJqwj8_8mR>AYU@Wo!dwuY z#NxGF4N1b`rh)ePs|?;hm^1_qR2{h%p!srwJAa0Ombio_<8Q9>P?F=wFJPdoXv8P4 zf*&$}l!f+(;PXP1&VZa!-=5^5RBR!?w4whAk_qy>9T` zt5hail;0QgatFyul9J6P!+s(8fKZU0!0c6|Hw+*shmj-D z#WYq7VZq&+o7;lPgpC`>)G!isxfCDiyHabh3nEid?Nd=?u7!j!rbW#yqC=@5X90>% zinKJO=fJHk^M~ZbM1n{{War(8YJ<9f)Jhn&C+f@?)PJ7_Pc#@L{FB0pG}0s`(^zcG zWpOtiZ`i*}i0{s+_Ob&T6WEtpqzV}^=`Fw^3tL<}{QM|=m$s%@v~U(_yY6ZmPjTs5 zN_X9jyrF#u*c6tG5^lNoBw;VBy#^gHe(KEt{N6xqn{LSN#+;*jN=|op{$#;W)Fri5 z+)|0y4TgGJ47|qcmuCrKaoovO7$f0@b6)+r*#7nTRow(TC@M}2b<{I9XpkDdq#Bbx zjs%uAG{~AZqf}m_#vuWf8$BS$aRdEHidm3Uko|81?-V!}O)5QvJ&bBW+Kn;eXW&~h zjb(T#f{;Z+Q~wr|3~2kMHBXR9OJI-ErE)D-iG{g!2(*Wi`9R$q`;#bECfzuBZRmw+ zB6Zuq;r=@~_)T3sDergIu|tG8wickdKU}P2r-oZ$-yxJ`*%jXhvgF$Nb^1^AG7% z6Tm{qV=nX&Rq3TpA;3m_yH!W?K_wxm^XJA>t4X9MwF{Yl3l!l_ERWwi+C@4Bq=|J| zJa-dkk~7yX=+bifkPcbhCS<`sWPy-YAp-v?3;b&x$LDI`Uk7Gf?2q5A^Utf7|0}<& cX@S5$;2BTo)>S*iWYHMXo=5FTfV&!1Z$->LR$wX%9>gwnsz{+a( ze><=^I9sqzh>0J(p5(owjFt-w44Tou&o?Ea#a1wHU|>E=d{p(!JXy2w)SYX%xP+#0 z>TwcU&9+gGcIdyDCu;5gGl&q_tEJ3Xop6dU`i?Qo#>&E2}4)=wtT zQHNp<|9(3_Dm$)*{(V1v#Rl&=zgvG_-NH%3!dH|&HuO*L$bX=J3Y+P^p7e+L_w76K z{-MyfWPi6y!J_}!YDM`b?7!W&>*HV~{&(Cvr)3!!ivJz;gU^l%2IIfOGI=n+{r5S! zBGG%X|2{`Aj{5&j`~NM%zj5*ZvPc+%o*<%sZmpVGU5#8hl~PU&xZU{=79MOULEpc> zxdMaP(|$KSb-e-u`YAmlgPwum!9q0Te{k>wprWE;o zlk>#&KSV(N>%YGfo>axCI#r5X8Y)QWEF(^sffa+UYj~Y@ZcO9WP)8H!qz`UaKfRTc zW!N%|9G_Hoah2BDcIi^sn&ZsmTJhuZ-OlT8S9m(5g1N_YrZ{Eb=2rU;oMBzc&5bct z(lJIPziO7hcE8QWDQw2Y?cdkZPHYYB>S3$~P?faQ=!mJgCRgZ=6xekB$fM&@zr9#M zWW2ch;iRboQ$kmNaTSRzbt5*x=2{|pVu+cOd@L=LDQ0Rb~=ee-~TgrWx35_ zQzN<4TCC(&!|Ts64c78>1>i-om`r5yo0^&q`<{x&;`~Q7mkx4hg9rX);lH-3`cv%+ z5YN?2l-JZ@0#``)<{r=U-N^{p5|d3G&zk&!lyliJFcEzE?yW@It}b z>6Q6%0Nm^|TyK#}dj_tsqby#^GOrlOR%Q0f*Vz9|XeAaMWn4GUTmj)U`KCukM$SM3 zp}Bvl52}vR*WJ~Tw2l|^k*PDI`!`pD|1LhUN&BTq`fUw#A!mO)U6rfv!?!;3?I%|M ztoTFlfgRe#5ddvUk2kj2UM_uPl+!Nqq|9`#Q`=lVXM%q}Gibn=|C#k3ApeJoFCD~V zEU!g06bzMojK{Qp5Bi*Hj#;_?a?2y~A20xTCHDDg0Zp!uIJEA^0XtXbj)s1e$2kH> zQ=S)jj5Su7Sr3^a$?EpxYrizTK-BWtLihDu8$;j!kn{G&r+Q(rg+84Aq98b?**@IJf8!B=?qB4sM+=nCsU#uz*I|; zb4g1}*J%L9)XdC@A?wBsTC(uC82cw{JdGls*cISXe%uxr*;{BKCG7}Ktf{z-A zpLaAoD|tf0NLh1i*fTU=(pCuC4Bz7jYHK}OQpnYY34tAd-(_Au5b$LI?C1V+5 z)OW29gzOubYk2(RY~dXp4c=%bO5sfz^6!c{6V}T-SYqES+LdwIdyXh<4HEmBTb|0{N;ckF>O6*Vg|5~Zqn z8_C((S+O;MZ_}bLAIcelj3?Y)t;^*RRbNy~tL!wn9-3|I6=} zIh2}Hk}K7>R6%HUpB@VHWx9O1Xd>RT2;ZZVQbzv{UYrR#lINbC2~2Y89idATkYf@}swk_xAv2S6X0bQ&W^ zMr2VFA?Pc^9vT)>_Xokaa%9<>XABHf>BSbiKHdbuPyxB=mLMt&dhV zt;-r10JOBUgsy*y>w4`b!Eo{Ns;H{=Ggi0vhT|}b{OWjoe7y7&y1u!IOHY4zq5WS% zdP1CfpmY^>{~=>%U_8c7PT6^6#4Em|_(^GX%qH}d7;HupO`paG+|7Api0N3D_w*Ay z+C1SY`?O2NNWYfhC>aRj*`d$U_2hhYbrrIgyiHff*a62s*9~l+u1Q!R#q|@bPBPX*DYz*TViDJI_%BsIGDX&0Ezr5 zqoLpX`<$kVEX*F5D@f9cFtri47DQwmaO3 z8{<_E9KP?{Z*6AF&NnJjnfHsM_{bv3IXrT(0z8Z!K>pJR<;O=z^-Au>w{{eT?CZO_ zYHI2gnmuD_oS}ufhv|b=8rc@$1hgG`2eUEi(^RI*&@cII?F#dm^x**<4mRc&VvGTBQ1MRycw*z~h0PA=sdkbR|u zt6d}dqnlRl6?fj``e3UzE8?RRZ8V6Uk#>J%^6FPa)^A?wfRj@twa;l)`ReWN6v^bw z%u%DPU73M_fkt=s)#Y0^8_$7f^RnT|Ts!oilbdAkvJ@s>j@f-dSx6Iy`~`YnA{|E0 zMYbKbcBElr@8U8tkoz_GL-vpwo0@3VC7oSdfD#nf*ViaI@Kz2E7H6w1=iaA+XU##Z zeur|vfV;c9*QmZ$?h5>$v*^l{>4VXWQT^xUgLx2LY->IKUA!?iGfK5@)Ou9F-oT(! zeW)G~Jjfy(da8wNb#KCXA7}avJv~#l^@gkx#|>D^ZZcT&3N7Mj(-CzpO!MQJnA)8I z3n#oA_Pr}yrfA3&Fi(rl?wKc9d;qA1Hef{a9PgZ2I(Jd5^r^2WU^V56o&3%4BONm{ zH7{=px6M3N`iukx#=8Hb-C4(-K1`8PPV|7W(Re!dzu60>zP{e^V)LUvqz}+}++fE; z#FKFffMWiq=_vk9^$o$VnMEu@=}Lj#{PkiChzO7fFl-$vIaRc#X=D^*&NIWLR;st- zZFHxX$xEG{$?LNI=2CWd7m!BlRJ0*O@5%=C|1=xr1CMcrn&op5FHaKPJ%_(c&>-zK z#PN6XUTVo&Qb>k&MNXv&t*d8;+_iJf+HHjR#XM7XCCA{r7lX-}ly-A-+umqsXgFDG z!>eA9b8=$;mn%gfJ!tsc*4X({QQL^3kT;6O2{u(N2rw~2eG0s5{V82fW*i(G7v3Gd zyNm`#(*>V1{ce|_6$}6Sd61O6P?KvR9R)`N=~s~vAAXl!o2pV-bNumIqqCZJdIBG9s+Zi{FN-()UvDS-!%(YAQgMVvBOJB#rS8FKWI`8c4^kr8R4{Mc&sITN z7FkJwcn}D+n|s3ZKpim-rlLgK0FTXmr{9%@46@bZ#l=zIW=^h z;Cl>X3*}O-HiOV)(f*T_WXpTS$6H9oBt8A9HvVt2U8Mh!c-Sme+S!02vGPV0lE)_V z4RUOuxGzr{k01nLwauFFV5zV&d6X-GBKu^bqKbwFDfmJNqKby5d$+bI0?Xq!~OVm zf#fmrj2=5P`@M>bixHy9ox364XvXl~=|Z_QK@S!h6`|IP8`rwCn691I@29CknV2~z zFKf>M0iAVWpLa&E1$rBg39m?%xr>hU&?@=ApF@b~`UveOy71&Q>%1i&M*7d;Lqgf| z1Ugtr`?`d+N=M>TJ`FbPu=!M8%y-~BJhQg7Icsf*ywCEyFl-i9P1GO$ZK72Y)RlBx z);p$F_=Cw!sN(@g@hRlYy{+Zs=O`ULJut@xpIGw_;TZ5jx%Cb0JXHi~uQ68}F(@ZB zAueh|vT~%KOvK!|+*Dyba(8o5Da&5X9ar~4FEJr~h+pj3rI>7}E13wsc*25*1wE0a9GoQw^w!0!4^rsb z7!>{AhvH4#8>ITew<|ruU-tYJmLgw!#PwW7)qog;Ob#~eaqi0e^qkI{7swaA`-dk{ z7oTQSy(vJ?ghO(BUym|^xw)D#^STN4lVf?6cQ5x}#=6CXQompa4@BVA8TP=+(_m>c z4OXRS)a{l^10^Y&k^Qh)?R(-eBMdY(2&OLGY#*g*)fH8309ukthW5T&v#jhl0-7(v zj^0?}%FH7{h=8ZCuF4p|pMp!jbnh?M2mR{4rcQcx^9k2jr!_t%eR%zL68C3dcqh}k zB|*-CHEHcK!LUdQ`*R@>oT=qL(c&aDl#X_l5;{)<8=9Di&C+(lAuG2t)HtUK9y||_ z^jTxaRx38N7t~7d#$0gvF-l+B4wru;Ve}7v_E^_8l4#iUZ^3)&c1ok&$z0d1nk_$) z$7UCBmTIG_KZNzjMDeeQ$+hw`Y9$r?RKU_A-OEm&a4jcobX5N1QB<;`GQMe9>Sr~t zsFQq`AY#)EEYeeU|6>0Dyu2W74xWMk_k8IXnnCGE{GP%T{qU7j8p02?_odQHH&@mu zdP8TZ%0KG~LOp8atKZxU^KPwop_|kg<*Esbh3vmkHTe1bDbP3s-XIX(03kw{{Uibc z88|bzkl4in?)}*A`&-%arOQ1cZ3UD|+)3}im3>P z8)x48I>9gUmoPoV;IHbBdWqV2hK6|&t_uc^{qvtTv01;k(o{Ubo5qmvv{(6)csR6W z+=}@a+sZ%SGw==gV_bg!8-On?|4J5fxaR<2|GX%KvZ0W><=RD#yo>&ZFZW0dov!*; zq~bCWh=l2&$hg)Ywk8xPXQwPVapS$^QgwITEb~Gg2zoIZCC&m_|KcJsB?as1-t%z_ zkq@#*2*X6LESp@vIih6mI(d;LJ^xb9<|}~SSJ?S&=$23R1UoKt9B%aN2dBvUpk1Fg z%W$Vp=eJO^@k?$Xd+1WnevyAPSV&HD{3zy#@kulOulF103P?PoWq7YaeW$Z1RlL*T zjAH$W3t3}6cxJXeWHPt0V5g;ss$oWbz3%d|JTU5^X#)$9xsJvRlcG>2>1g85y4B6i zsiQ1yC`~I0bMsOE((t?M8`xN$pE28#B(DNX4NtP}>%24VUf(_b!J_=*=em~<$TzXJ zH*s8B+n&LU9`?pEysp_*-sw5#5BzXbrZ*K{_h880iNp4iYpk&7%dGS@s=x35tuoEl zgMTZ4KX9J6dE?XfSu^Tpyx(~hU5GqSiDL4*Nqa!zyJFgj2!5$}YrXHr;peq*Q>`3X!iR0dVei=e{#Q~Zi3?1LLXSPGs8r%3D)qZH8$%Bm7S@_wx)+AA$(|O z*c3dCz~{OrjN;apS+sNdKyUzTz6J_W)nVmU6|+Zeo1cgAn9bc)Lz;mJ{f=eZvm)uQ z@u#B@XrNobGn>K2Q1)LJ566xIx3OpbpkE5lob6)ftaYK!jo>2%c)Ay|T>U8bYaFbw zb17YU3I4(+xMx&1E}@LA8Ugf5N#-;%5)pJi*^J^{7n|9p_96Lzh-cu-onWt+Q{XY>Ktus7lX;9%Q(aEn8%V@O8+7p9O z9oc3#AG+tAGXGjf3Q_HSsQH_w&grMOiyz~VjI%&V@C$jLgd#YU*CCiEeyL&h+rf<> z;&X-MnSsn0%3WCO1muANww-nidC{gHx3@f`t>^TuZ3$MYE_-8J6$24V;1RH`*B*Pl zrLRLMGxOMD1j3gS5}=98Lp8bIIX_*l`!qA!rYdjdLl3i}<`r|Q8)FH`$|0a2C+GBm zKuJS5%U5+^jF#3vUdgPgVE-)VN>dup)%-A1kMM*)e%VbU8EWY!>IXPl!Twvl@Yvm0 zlA1iS4jb@rW^~6n$1!m%;O>S?`KZC2WkieCH2w)}0|cwCxQ<2N(}l}wM<=|lxYFyw z>$SOG9+g+qe66zOAu3m|q*$}wyL9kNi+*VBVZ_JIE{)?Z#0ZjkO0QKNA?%Dev_zsm zQYly_?JM}9_`I2~-hD3`Qor3FYlL6H-x=c5xFK%A))LQ2?}7<+7~}$9-SN5tZUbsW>I4KoyB}yrz6G7w!Ce0chFt2!$sBlr?qC?B?{2aZWe*W75#K zN>I^X`RxRRL$@KiW3`Z%_u{q2ZYZ+EJ4+ThyWQX6fXBQ0`!1Kk zc+QsNqwNn@V0K zoAXG#_O=80pB4)~%`!p3YY62rgI);f>s&qyGUDtODv8|?!fM_tY{Dk)_@x370pav; z<;S1otp(_Khs^XH}G@meO?HQn_t#O|E`=y_`8rFJz-Qhnow4vX!HX z&}ak>846D~2A#TthkVf#kJ}1#-pF@hOmt!qTLH-x7ChUpocvoJQ{IML!)mEEhgHWs zpcENA2k$fH><;bgO9d5)I|wn45znw6A^h^D$UH!gufA3`wo7Iq1H4wi|7VXV$USQk z&Wg*}dM~l*2aG9Bl=bP`DcUN~utyVg}&jq|FZ2Ly^^(U5p4by7MM`htCkQh{Ug>-#B z^!~1TymOvypTtko32HZ;sM#vZW;k2+#d{RIqaEZpAy{SKIUZY_{k(hUuumJ244!XM zVfz&HsDlEhqVuj06!STzy2~?(%w(2FsEDmLwc?wv=HC_;ibC=EoPaM;2Byg#6C!~| zk_rDcmgh^#bvgYL+o^el4&fGWP))m$*L zoktipQb)fZ`1IrtJ@>lU4C;?GwOW&t)*G>~8$ESc znTYa#ywF(9m^LrFb&G7*0uLqVwG)VJMr7spbi;>yw61_o1qDk72M3!V+MI%XO05>_ ztN!=+Lm%p1UQ#ek8nJ0-s>i8I+NJmibFOvrmLkhuV6*2#oyv%?h6ww8N@)XQFpxI` zbHvT>Ydn_be@30#-?QAn-2iJbN+}`p1+2hI8azD6FFp!&;a zkz;pTDbwX=`L?p7u2%~MV0P}Pr?)Ly_PJ>LbNf5=qsdhim{mFcn?4}0@&o;*dni@H&k>yrA94xGZt#>O2 zh}qkdUU*lJv&j5Dr`FR5-dOwTr!LB;bs%Q2<1Ot_Lh=q3Vbs+t5C41(ynZKw!^7sb z^iuCjP`{?EHep?Lj#$nuey5mkLK|is=hkA9rw-|mv2{4B8%&6il(I2s)8s0tW*ad! zKFt@cZ*y*0qs3#W!!z;3K}@pl%6I{Pjfsdkm%)#-A;$L_cQk`1CLNyp zh-@A8fg?3N8pTh6UtE5uv5G`$5$TdBpJ;xa=rd+C+k>a%Gm(5xGbf>;fu|&LPi1EZ zvQ~#bB=r?s&tpv2mK9@6CPwfwfzNf{oG__!)QyCG&f$ zd%=m{V!G(Vb)ODdpFgiHwNf!2GjqBe0OpuYjVjpQZwWtH_Bb^SR1Ho5OORLT=?tF|{&QbP#2@R{0dlxo?moZeW$t2aX(pc9gRX%9fT)hf~o5DuId z1B$@0hA+U<#xkLELv!H+E_*KhT;z2I9vD|Cu` z;Jb97QJ1O2?rmnq(YunYMRf`CLFCOj6!ODdb>8J>LA>$#nKNo#z%`4iPcNoc#+P@0 zoYA&PHyg?;8y@&Hd_Wi-P1nV3$1^k9cs8&-KH6iP@t2k!8^ z5>~rhsn=LMt_os9w9my)BQ~8hn@y!K=;4M+MQS`QM&C#?Axe{_gqc$*g7*s9%&ai1 zmOz`d6lR{HTz|;%rSC8oe@#gZLtr)uzb@H(ICU-%8kKRcc((gwwk(;rK)Q!@OxlYp zTuWgz82^)4X#zWWl`T52Rv)Idta*@7#+8Y{S0KmYxR6i346g5$koIGM zl*_0xjP1uLkXl;7ts3${ zOQ*hG#}e2%az@ToaTtAkLyg7pMIID&_DJa6;-EJW`t0I+^2gj<0+^;x@{i+?>Z^WB zS>N>veZ7aPwig# z%tjo)cqCm15zp(j3TtRNC#@b;z|O-0jW ztAvR~F#lV~QD23Q3z`47s%?~AllO(3t_mjo{V0R1!$W&DRD<5I7^KV2nd3tOQgxSp2Co`i3U!YI#W;|pvW8W@pcVOOFiFeT^jJ5eMhwJ9h99-%GOPIyZvrI$Xqsa z59G||W`(i-WSYdN$E)d65GCETfE8)koO#1U=M#kpo#+CFCH&{Mw?!jKrw;V=6bwCH zJH=lQDEy|4NCj(>&tsZ{-qc0(?rE!cT)vHtb-19zG9UURJIR+($QwyHfOXEYzOpi^ zq9iP-G84;k_`J5LbM(cPL`N1WqN)p6;bau8x+cTK^G&#b{YdlMNmcH%kUXSeH#JdT zcW>bhy!jfETqpePEcp;YyWz>(`Up3KPw|agc-{tgEo@#|q|He7Us4LUAZ%)3v^nqYXJ8I-=t+5~Q_jExDFAR)~US}=)?}8CjVo*qQbl{S+KVTbP zpLj7fzYwM`2lV9jO`1%jN^!j z0A8!yFw+@r>`z@e+5;crsa)+W+y^msBd6#}51+|o|Bf)O0>?!INB5JR=Tn(r--uRs zy$GD1p8k_jg9xq(=KOr(jfgZqm%oK{ZFP# zkGQuLXi9%{5ET9UGs(4(A2uaN^XC=o-i9w*ozb)qvs*O@1>A})^zwNj@y{mCoDCpd z`5p+P=F6cLFkC6UsMdZ>fX7bucJT{^5wXJ17x6c`hx*B@*IFE-3d91wB)N{91Zx;l z8jnsP_5J+maf%Mt2o*&F)8o)k|bup{Lc--F2~`;GH=HXyZxU9X6i zr#ZTeCZS2;h?JRBPSXGxd1y}GF*BA5Y+v+yEooT0u&$gxZUed(nX0(K z*Z|?-r5zkw`j9RS_+9peP}+s{4Ow|zaJhj$whmhh#_CDx`08l2*#kc%CcVt_^Rv+N z^~~(T0&UFkIe~o3bgJ(y|5(?9K)Uw1$zAqiO{lTF$R2GuW4td--w!37&tf`at-A}F z3JsT1f%{PG_QJkwsMye(vsGtWHDS<^rq_h7{c(oE2~oAv-S0!&)+a1O*&>-VfuK|( zSSE(i%@MN!Pd##}1wyG{y+H0Nf(Ckai zeC&9`k4&sV$77S0gK{Aimk*j@}m%*nl$7+rCjkwlnqCmXaUgZeURmV z9|7Ee1AJa$UL{8lzC1i9Jq?STXogl7e>dZUNOsG$H|#{>?*TaWu^~VCOTL!dUSQ;K zWPrMc#?an)2JlDzVqnXnxE6{+(+D$|?Y^S7zY`ZmfmhR|B#G9Y2R%}1czm^Y>HcxJ zj>dq-oUWN;!btm)J5_!<>>{7+Kd0Q^RcdI)E3BlNhlmh_RQG9T_FazC%`fW+M1VC{ zZ&Y~X3BxJA7Y`N;B`Kpt9?OOGn8LVvWyhJt3x#f1=DSV#0-oJEsrU?5Hd`YLIfL)0?wA(WR9ZG~CsjDu zY1w($*t$6M>uI zi#|mzNn3L4k^9nWxLD_bAb7uV3LQOmtEL^aEsHAets8z^$0a4m7}QztBQ%l0`cz0O z@2!(sUW{Ag>56+~Sf;6>f|bEzN5O|aKtR`nc|$e9o`yYQVajQ)&SGwJrQH)Ym>@{x zd1{CpvOEOY=4KkP94Mp_{6`v_){MF-c1NL#3>Xvr7vEB^19YzjkKC6@E4wj&cr40{ zu=3XQ!s$6W>i4M^vbd;n)8|6V=|bJ>U7H&Ic$Mz-bi!<}2dgJwA|srQ50;_<8o2tI z$|BQ;TyM>0sdM)Ol66MfHOrxTdYnS~y+~$qlQORV`@MkoOt<|`t-0XUseK5jDu)gI zb5TT=5nwW$wsmPnZGe@f^Gz4yQfN?YNIreHBqfIyzbIhHkPIVAYN^2nPnsdx5Y;S> zaO_Py5zo)?Re3G#uoc0AuedcGjTwl%3)81}32`mKgn0Cv0odN>C4r5RcCR)DrQ9(7^-DP^bzH>5bF0FXL-3mhEd@gWhWbK&Bcz1+c z%aCNM-Sy2&f?l@<NAYPH5M!&Ao79w1oT zd>g33t`f0;T_-nl78DRztTBRnQAE`+L@9d>V%-$+?fI!3orr5<#aZs5`jKJl+#LR*47X_b%01yoxS-MUg{<0Z%M1%1W$F10@@ z3qT+W7@PGL6>pS6pQf21dPHH*$5*o&w7GxZ_!(<6({5AojQ-8yN@t27?*^#0(*#&+ zJ3i`ltg3x1aDV2NLlrAPwZ>2uw}!LJiG`G^ohfpn-Ob38?9xdwV!xl7S%=~@l1qD#HOhpKgiM8cUb3-CA^ zdr5G&@$GkY_Ac^+Saw>g>h^Y17Js^EQ0U14C1uXfx7(H0vU%UvSdfOHTtuvOZGuKu{xetQGxxGhXst)r<53u7 z??czS%J6hfK7eJBc0{lDCWjAZ1 z=TxCc_vY^AGUYKqshIV3{!TSObVfR<_PW)<$c@iZ@QP@b+k?H8k>CWs1Y(Rg1!zNp zqosL}X?h_XYUkXnXzCFt5JjxHg=qWNoFdjEuI%jFAV@x^Wj3^?G&v)A{%%F?iP!C5 zyU%CxC~$o4{n?KI#_|;b5UsCE1XKbOWeCK5yc6Yz4SNH9Z6{1UT>97+wP(h2co(LM zxxajUqLFLQGX3zmX&Q%!I(Q)=sRdt>{n8$#?;n#pP86YM%sm<2AP?X^7ApRF;vJG(7F<_Q+CQ4 za-I(A)F9k!`;Y}3)mYero17+ZeKd8t+%Iquth<2Jk2CK{6}F1ySjgiAs3aMRI7O_t zZ%fTgTW$NQ%*Nbq!a`HIo zyHoFwJk*%19)jr@AKseRW!!C-uPF`XclD_r67eXj%l;g0y`4Fbl)Mn2X zVA!Gky16hiKJDpW%pbt@=O2_BE2yb=L2gnbH9EhX;<~9u*hYP)R+r@hJ?;rmF%^Nl}R(cKZKwiR3(Rqa4 zW8(96A)J7&P9rEiQ{*UQA|XlX3cMyd1c>r@x9~)muiX);gSEA^Gz&!q99Bx3nh0iXKjL(e%H`njSC#EcKyROI~`Zrt95vJbm6X_pzr<< z8Duq0S=kmb#uD3ItBHb;J$%pcFp+vpi(J!;X$qptv|7JoT!P~*fn1e+@=CKW9GwCA~9$g`O&DJF9JSV&46y##F ztgC06n7P{H>Y*>sRwd$Jv#&-}(wx=VKipk(5+_wYKN*QLEA%j2AO*J>ebxX#`$wSYTfO`(|wtFF^1wEP$`p z=3I^&(nRwpN9>jcc~C{Xp{J>`^-Ic#IWg6_6nN{;9qq0iOwm2t=og;f?~~&zAdsqm!Anx{1mV>dc&^|0Uf%uH2RT&pBzebE zNO@76{fo%==4T`hw5-$pSZx8o^^Qzlok`lG0F+1wf>VOE`JqCN*>wCaU3j1oKC!nC zbG7gtN@qP&&ETC{34VnT)VF9N73lPv+L$$fG=sIpg34BnfXzUm1T3p)d!>Fz=C_S; zlH!j;Y}J?TA$|Ozvu(F+_GZBdAE9;~-ztk|FXi!*vdt)P(G`zh!xz_MqAiD2MCflcybla*JMjLA z`H2vQ9P7z3Gb;rd+up|WhfP`IPx1>?@76mEWZ?|H$*j0>NrQWU^T^1X0~?3khDZPL zsWTDdLy$f(L20Qjv{Wgs$Sqg69<#w*+<3c~@mHK$^!hapS0$TMbYJajcgw<%&<|8& zaf*C*S*Itula@aTgAN|}wah)ZP~_5IpSZA>@=ds<)o5XBCO9oKDZzcj0}YYV*3(K9 z4iyOrltie}IFbn-+LQ&5*3{p^-}en_Gqm2tr!~a62>W5Lgq);mjQ!rNqTt&y1X0%b~tnE!%G zk-$07w#6<8;&h4(d_+=fZv+=ZS|_)6&m7Qix5@&=82Z>epCQLj=Z(-p#@S%fd0@Tt@R1_#Srf zaamlm6vF$7m_b)XZW2ogy^2rBR_Lp(p@0P!rMVw&IX75uGDa%@RgXAscE4Hr@q+Q! zH*mcUht~@^<44n~1kCTH-e2-%P4Yg4sJRJh;XToiJhM~0NQ=b)is_KRRqfeYczPkm z98*s1$qW8>a)fO@@AqSV^eFDDN2JNIv?SIN_d!n6el4UfuAu)+FJWcsbGruPPsITr zbx2S>t8=1TPBM)qm$z-U9#=Xi9|mvmYat?NDy+X}Q@*Bkz}h7fg}f!8WHNv8F%^-F zR;d<)cn8_~*TM!MQWgJ$a7d}Tmn}+AZU?Eqc60&U*$I8Z%b;U^9lg}Ro{Y^VE#r@h z&r^y|=5f*d#i3eX8MR)VLsMh7a&gHNG;B=k1$OYB1am9ozt%B2eC{w&5R|+kAuE51 z+D?RT%Y7{U>tS`svYl~MHu3W9>Ra5wS7$j>bAlyGI^Qc5DMK`C*rW`>$j%7bZtXcgxJ`E^J?LRiWH1rP|*gU=gPlgZa=5q9=gY zMfjx&zRlIGNM-(**JcgC^UO#BY%#pK+@m~h5)FQc;BKK&#wO3=fDxBL0J zf`P$C&E!>Uo03;FWb?1IK;&=@YUOSyao~0`Uinn6x3zw$Ty+Q`c=h@gdYi{w_YpvZ zb+H&#s)=!ca5VDE<8gCG8W*X^@V_I;6KD2;114;?AU{l(A|>-QKhY6NMzIL0!M17U zSsa{rpG}0Z9s;0KT?gR2A)z*!P+z<0XIuQg2BW7cs2{;tLV#isR$V>|nJ<|aj?!lM z$Hq4^0{be~;eIobn@(W#gMVX}x_E!Fi*Z6*ZvQZ$jrqjSwA67>Y02wENcGY0T)mYk zT?fwcnk20%{CRSAIoT09*>H#6Ejp3i=WD~*mj(TNXp#ndFDUw~6)v!jD^*R*>acjD zj#kFThOy24G%r8jWYJUI08oe{&4!B7KAN^2^k*z>8$k6Nxem&T2&zV-8f-KzIT=~& zKW7N|{Me0>eF05(H2qd`u8h*b=(I|(uh-ve<3NS`zHaXYYO-NqK)DAZ<1*Hz*c~x% za6WZK8wl-!^FswaF3YP%$$xx5M&mI=%N|+ZZ$ZD~Dx{GU1WHFC{8WqHwRWfTZ?#lH zT)EfIh^s54vMKVz%97;{r=g5w8D>V(WRj`M3(H*Prx!Y(1(M=jOK7YzTpxFL+I|#u z7n{f8rGoIsvlY*8=@$Y>bul%3+_HPWTp788dwY+EFIa?j86q$uwtOD#yfvz&06&d$ zGss;-6g`V%?LkSV7CE6H*P}xRB_*^rkMpA3T%*P2A;3Q;GVoSG3rQ0H|B7=Q{7N}WqxIOmy(Fil!vhmc8T_luQV@4m|W?K>J1I{cK7>2el| z272{nyU2lYJDYBNX76UP4kOWzqm16SUBFKiRU2YAGXYIbk#r4W2d>6cXI0+9w%UJb z>PiSYCYmw^!F*DIGmYWpw73*vO8$LA!5+1L%XM{C%gr~_Shq@K*lyz4s;0h&c?GWS zw{_2Q742htce42LTtx}P#zroh5k0#Ei%(@Ji8t+M9?^zdLhIzd$@zMRs)hy{kw-{h zWJLv4ejR7rgn16%`@5F?ZoE#%5gQ=dpZlZ3V!i}$4MwnPuzTp>(Gt4cX&U;R;o2WV zFqprW3Y|T2e=o_>ykM@sIO}gA2p*_-nkHFP(QSv!_>?R+z8|-yRTcQK#ruAM+nu1I4^j=8{qlgLem_cHqnn&|qyNw(;N&{Q_v zR27{i4TYb@uk*A}{R6`JZ;r~X5lX);;_ZcRu4~)oCfB)#4v%GuL*ZK`M9d>q zdmjEz(PMb!mu5^@ME@+|Z$aBB5&YEX&AZS36MDi;m?QaCu5n>LzA&;i3D z;K4=JZf$r4O;~L4oHqT4I#C0b28S)RWZpT~4S9b4w%_Yx1~8ve<=|qOZmo;h<`L&0 zNJU6;?lRLraU}DppX&8SIQ=p&;J+u-+IT~@f|V|3Zi2_8>onp?q(yy#AbJ2~|WKB+g!+=-62_*|8o zD$j#-RZYd|vPAFWEOB&v=ymn^)8ic)Q4B6VWdFGT3Wb9cSLKW2IK75~ajj-vfjw3H zlVEAO)Mq>9;3$O>Zy~bUD8i`yX*tJ8K){H{|6@L)pwTfg=e%V1iC0kbK&c3Q&htYp z*){WW{;tqER1U#7&2q{+??t0K>>QcB)O@0KYbH@Xdk|UlMdSwY&V&wWYZWu^Pz%QN z*Equ{O?ciMP~jczbmdWa*5b4NU}YD9FbBDlgIpEPId?*hDJ@)R$ajR!uA4{Ok|nVM z=0MzEVojL0PIOxM@}%(yp=2FMU3*o7~=L zelLT-RQuYI_01Z72iKPW?dNueW7}Z1YiHH*?Cflf&z(K&_utvXk_+^fwx$wmPE56s z@c0H>DytOTK)>mJ59TSx7yrM-@GRH9&A4Qi#!kJV0KhwAK%{VBS@ig=;9l^$Va7S( zEkwfz|DWI{EMywmUuTg_6VPo9tE!4kR)a^OS{eK`Yf4Qv%(b)rPl>^{CfPrURJhV; zX4C9*%T^_S<$nFbP2#Z@b&v^Z*y!$PPMxibP)6X59=gUy1Nf&JoIc^eF~jvgnBa$e z$7Q0l)C=d~h{%oWzE-8>#W9b!5p+|E>5L|OoS&PS7D z)mZxh$G^8e)-Md+u}iES{s7Cd%OmZSZWGTZjEHR`LSx4zc89SAI4d-J6$fqG5nz!q zkKb6Q!=ESZ)FgRh-to`6g$eSmgIBHBDD3lHA?vWil_! z%4~g$9%V_qG(A$gW`{o*>-0L5vFa-qp@ReQun&_~#^vibD5XNiC!(NG} zWuQU!YAGKEi9idwKgLMld+wk<==;8>Ox3OZWrvEnM>8S|M4a^23LM*iDeA>x>8TCd($O9dR~|^IZ{zRR+fK6(0zsrX z>+rARA02lKLd~ZiKiQFATejm#&x!(LE!e&Nt*=^en%NkmMxAGzN@&m9UjLn7FTaD> zvpnt}hhc^v^zy%!el&IW@FP!9a&vo)pSo2F)!fl@J?c-4MRNRWF*us;3KR=V4nh*j zR0z^T0(PXlbNoJ3(k@+3e!&S;;SQ{GMIkCFi|FmOQPN6ps;-V%Yx8h;M*aWs^-uA2N88&s+=gwVrqPOR+qP}nwwuPbZ8x@U+f8HJdVbw|-~Z2h^v;8v z*c=A2_(;~L*FX#(!J94Wz2a&)~~igko{C@0T^w8u#!bk_1c^D#iZro2E`E6P#A zAIG$8HNZg$;Iz#hEe($3yOmm;`rrfNH5(?U}3Oe z`|z4g5x4?bFgt)`FxXpD;?lDB{qX9Q4aZV#WfAB&g|OYwXJXZ9biiEjZY(+n#|& zGE5`&7vo1aj3BJg<1T&tku97-t`tExld2CX+_RA=xZSBaV`v;|Xl0BuTLtoGr`9np zqg)=?NI%~nz^46if*BD7nS(sTM06IUUUXu)DH$WIbJw^1y`IctES%(=?m+5smm z2_-~-^T{uPgbQ6pg{u8i)e=lUYbtMpFGAG^Nte`o}U!|B{@V&^`6k@ZGU#_#P9uv{_~E?7W^Lcvc#@93L;=>Jy*_jIewkLHYG`Edes)8>s| zbWcLs3_s^#Rm59Y^r1K(X!<$Fvg2?&d4^!b8=9~vgWpqI+Mo*X-x{A9SxN9Fqsz*R z)V=_1X=Y^ic2rw@swi|hyMF{uCzkRUL3}0Ovi1n=sLA-~$w5IqjEPfrK%?gL+^T=> z5b3E#^UoY_b`A6QYFCY{*iq*v^ycy6EUBi&`x;+u!uL))11Z%!2*tDz_2*PJbAq`d zX-TO;gr>%ubnWOLau4(i`SfEbeH=tZ_Jt9J&5!YHSOb0MNai+052eLl&R3bO*2$b^ zd`)m?dLK6tgz4ks9Y43Qm&+~eN<x5&il#h1M^>}W<+$(4-HjR zBQ7owwj(pdh{Iw{-odSBTsF@;l5=omA!i8|4!2pS4X(t?RxF6~s{>lSM*uE>Dn(<> zPU>IXq103KB%8f4T4P^+T7KxCzcvm``hR26_nHz#(VKDtT_~uQK3@5cSMNLPSEJZg zob}dr+0Z#_Uj|UWPo{rPGK!JkuXd1>N6l9Zs^ZJ|ei&_cSt*iM<{2D;5paebaBAJG zpqRq@fdzCPf4&SRe6=`%QF>mAvqY$##U^wFii|6#Mb&>a+BYHlRMZVNxNj?UB5mJ1 zrsF?n#_jd6l8RN=CnKE=X_M!Z({z3fCR|aIUvfS^K3?wdWaZIySP+|Wx=v3A$-81% zGW|LhC%o%TY(}LWyruCIb#-M`R#pbWlMIIj!~PINBebMzhs5kN=++s+8ATmYFT4NU zeX#a<_2&;!%#7a`noCJ~D;E%DPSfPfhm7CR*IvWfezbr6)Hlt)B{1JbZI4|{8fnHR zr8zOvuQs@QRDj+%VR zHL(O|k5$vB&vxlO$`0?T+>44UjBnK;V!j?|J1DS|29zx$4>{RHo5G{{)AJkyOBf9& zV1tfHQ)WYK;2Aw`%}mBq{1z~D{oJ-MX|k%k!O9E$iL=On%0&z%g^@80KJUk<{=}yS zzMt>Oy83_amgs_{?xk^9x7}r)N7LD^gv-m~f4!EEjB~*Vi=V5TTUZzXEC450Qq~f1 zqozg$70qx$P=CU4kK>bZa}rgL5x2XoBooFS(9eI-x*D65GZ6TB zFU@V~Ok(!87SH~f7UV&B}RbeA7YI)7WvKMeSyZJ$}3c+0M# z{N7jl?crT1{5m&x-Ai#KOl9<}Zt^e0nrdfR&G9|8p{J!be*VI!p>tS5Ap;-#vF9vp z1G70MVu*{hWm}W453Q^F24|5TXY36(AwBHG65DIv=ixym=4vnKL!xt1TI`(}$#Y*> zS=>d5-Vc(9$f-*$X+R5}>sfD+B&P_g;+uDBx*j`2n3>WaY+>3j=(mF<$J=v?$SFBg zY}VQfrRT;NXmX+UrfvVp<22BF-d%48k(p09JLuxr9G{7*oe(R=B8~!etmtyOulG*YU)T*n$7#g)3?^QksU60 zO0=obolR4jC*?2%vHu#vyiPO8Dqn6|SqOr9`gI~dHqeMzod_VN#pH2!@f1L70K=-smjqN_2xpl@R8Dy zpr3+)uk!HLW_jUZa~}MQmt`G)b^3_j2V+WKuA;J6p6wL zoiNF7>>IMxDf=U4d2L&ghCG>>G8EU&MA0;#?F4t#^gs7At|h6&iORE}9!N_Wckh0b zj<*-K%=Wj#j&0$pHr>nRc^7Fo1rb=-LFcM|qC8mg;xVBRD6{-|XKK_L&dxTOO z6o=g(YEI110#iT2;fwUmzZt(w_RPAYb6kzI8PLZzIuK2!Uh$yIUbv-QbU7e+_ZW5O zh}L~6$nZ~!UthOY{!^<(i)K=+&n;{Vqs_|ZlM~;E3Am}^%Q@39@KR<2OyCU~G*Y=e zX^f4H$-;Uu7uMWskL{Hjf}hSo@z|@=!l>;>j^t#`fRxOA^%ek+Q*aPU8oG#ZF|eJ& z9sh^RpTt|zKuTT;5Q#)}&WTGby!Hq{u(iG)K2ccgzvv52a=AeT6-7a(jVw~|(52-x zgB=F!780Y?FHWwmit6g(fWc|z@X{MoP?fW`wif8J=+q0~t*X-Bh~1WkDMl@b0={F*2!e8|+ya^!JJ2xUZ0 z=3Vdbb+;-kf8sfQXGdmT_viFe%gwCzRDF_)Df|Rh==t6KW5#tE8=6s~C70tY9PUb= z`%3GaV(JxjEMXvHBQZFEf&_>uDXg|QG|A!5ov1!7J5x>r6y&aE1i`?JB*=IB0Zqw0h+)%78)IWLjS(S3|iU z9}#-YUeRicff2k$WOSIS@xo3%(SHqbJT5vHr#qO+k@W#PT@lF$X0KkpDO%YqyCumh zhqOh^9_9u_%yY6O5AGbt8nW&i>wm!}(=Gn6KPyTJ&Q@Y5lIV9_-Y7M^1=zW&dQJb# zBdilMZ%5n!Nnt8%7K}-;%bC(j1%@x zlB_aM=;Wt51p_HpixNQt4B2C*urQl$lW=Ihe2d6VEHO9d z^J>U%Y)mREqu}5ShF1A>baWKjfxYOe)Cbqgv z=(BTuK=HQZ5Xp^;Q4SdrxDh|@mX3U%P$Dj4P+*cVr^=L5Owbg!UP*sZ-wFQS29oah zg2IVUISmbonVha!$b3c(O^O~BK?!0I4}XOVertugSMNM;wXJ^s9%07S)fAcxUr#i4 zj6p{@FcJ`wDkuFDAOHK?B2AQub@811Sj4+R(FM5)9-S9s`~NF^g?yL^N}goV(ZhDJ zgZfrdGuT{*Tx$DtC5FXV+A-aOGNaN+OE-1AXPp%@RA@2{3G4RI6BdoC?E+$zkadT4 zSLlz^Z3I>S#=9xbj}LPv>m75`#%35hq=~mRXV~SYa%MMY55aTOsYS6)PAkk{OI{U5 z%SNq%5AJ z9kJcx5iPnR*Vd`TWc#w09p|*Q{cAa%nV)AmUE${Dj^I-9AG+vc_Whg%qiQfYO7J68 zPFeXbs~ns3-lg5K0sJo|e|j0GyOSpOhF?!22z)TLLaHxp5r>$G=+8-AlVWO(f67dM zNt6?bv#H-Uq1SBUz?R^D!>Cu$utScn-?j$_Lu+47MnWH(dRbJgkNkSR$yy$9r4QG6xpiLvqQ2UIeV^7(tnf6iDH>1 zi_&w$k90T)?~%mM<#R$^g;CY3=^#vAAFjE{ltE26Om~Z=IWv);rSOset&>HLF(>`a z!?b4$qk{$ixIeq)xnrtn#P=kWqWC=!eyQb#2tF!LVc8`}lqRL;z$QUP-kF+^5c}xG zbAP(hU1K;D#O)b2C8~Z$&*0%1Ft_wS6g^P7?o;m3?4e+PixADJ|v*KJw zUqTT6hXr{ZT47excnINb>7}2w*nXIxFmH?F7nH4t-1vNXG=dT|TZ&##aB6&mB%A59 z(F==2Ipnl`x{?A4&#U!YIh9oJZ@J0ccwlZ_Ksw_7Rv4V5Z{2~Rjhlg&j-oJ0^H2i&KSlBlwz(rvI7f4oK zieFrby_8yaRiOcijy^xXsL)`I2{^V%JIa?%i~$`KNSf>gbm@AL)-csnS8#lBz$Nl2 z6k%bKNCM*`E7#QRJG8C4&cAQ}t&xX( zfI53-TYWL8Dq*f7S9K+B943lv>Vw=o;!QwUaJa<`309A$4dvslbkSwfzD0j0y!(Dz z${T38K_x&m<=+x1I#Yl~PN)bxh0w>YRp*c^467rdqkIquqr6Z$n&|A?*@yV2v`Du$ zZZT}Je6a@PgB=X$`{?p17>_1(VI{oC`}Gx?IcWVI8M#Y};(fQ53^+tx>*X8%NlP*% zignaZpu~W@&VC9hcXxKf;;6l=QPY)$8pzC?4^jxi72 zkAd<_kS}f{y`fmwwL}G>r1^!Le^Q@p-q8pIvFx!D@E!^&&#^ll(!D%f;5O>^VTH;$ zv}gS)B3WlF+Ii|l1KF`HD=QDwG+2I|FTjT+FL=M%Vai@u;DKi3puwX<)6mnQM(XJf z8YW;Lh+Z+9tE{P;?9rf($F!7a`oS`hB_DR-eiLsK4Wq)cwn zjAw(re41(`A=}-Y#)fLR-;(>zsj~8S^xFx>)g1}x`#myD()wqN)(28Bg!GBQRL7|T zf%08n7Vq>FM1yugLmLU$ml&QvnS(E3VLXA9g&At5q?uDZVZJ*gK{CtKkbwo-?vPRB zieDg3N=jeh{qO+`T@uqb7+yb8XApI;WU->_FGmg#YyD>e%g zS!p$$YWwXHfzB8-J3ITJb;hQzD@g0Rq9Ceh`+eajy?kPgJW3lqksdwMGj;G6QOYYP zhUUdsDf7B?tX+1|I8Kjm!KC|kzHDOBwihp(nqGEc^z{t|kHyCq7ehN&(@RUD$1$sm z{{RGTu4mh1TU@LC;n*DjkY=QRNz$RYmLlY10*dZ$Vs%vD3;U1SJcM_s@-*r3&XNQ* zJ2Xt3x4G)5H5|#1F%p+p)H3l1Vfwl(bt`?2BN;V?can*$Bq4Pz$K}D{<0=6~_rDo2 z+J>6?F}N3NQcdn~B$~Bzjb$q#>{EGL@l=)RrgfJ`y;Ma-9I{WHJ$_%HH*NAtDO#ok zd*qByToXF%b}2&jeFYt{SpWx0}yG5X)h!+H2z|azXVyyi7t&;TNlD=2G9CmR*Q2>nSN2TL}$_FkI5r`v@HK-|7)2 zEnlJ_Lk3D|etse+43);}D^rQ8~qw^=7v+JKWgSAU@MrRcE}J{&B0-$OkyF-RG^mWf_$$;sm0MXshLP>snQ=w|w6A%iP= z+(a};g$lD%9BJyUN9c)gI#|~2r5Z5;ADNq~wRziujI0%mPWo2WF0vI)s}B*k(2H#P zEh`c2k4__O{DOq;md)|WhY(SkR;ArC%s<7ji#L+lwq5##lOx8|$w^K{QBuR4yn}VU zyYbwn)%Ako=xn+*l|owzlDp! zE=V}2JYw|g$}9VZkTDw=_`CiC`cZu?L0@0H6PgEEe?0EtQGeV288%Qv9vsOU*|&_EyntUb_*w7g)&bxnaDP(o zKdC0*4&>gE`mA5jySuCF3NaH77sOkNR1}r!{e17idSo*!^b zqIq|);zhlHqRQH}_{p3kko_R=jAa~JQ)&YZRL)~9Iq&-0%14Ge8{lr8N#;^3;28;v z3KbUGgFByh@9G?DzoG;_I``SmM3C*VL_X2LC8xbIZ`n-cmt2ahlkZ&Gu8Y0YP37JZ zDUKu8K|X}-6=eDHl#K}!%}N_i2;Sb>NMac>s1J{IK$JVnL=$&BxwDx7#YUN%@%f!wa!D=cYaj z_C1J3q$K#AADNgAtcBLo$Bzh29%AVrROA-dz(iYA52F+=C%tC<3&Uetm$A+Z;W=mMYS#D}TzJzO9?5k?z>b)8phBcx|&ryfYO7=VThj=&WI zYP+44wCBkD$3g~7z&<`a|L~={AJ0plzXbQ~?(W)MbUZi!9h;pO+(t;Pz`?Swb)~HI zwA5$OC7&2r$H@5yFgX7%zoF+VmrtLTvB{=b2{iA6G|HE1o<@R$t(kCljtqp)5vhtE zjhOb)d%{-*?w=U!zW=qFTWgkxo>PlC?b3(wB)4owdrJunK`qQ}3MA~IIagdgytEN= zo+ph`c21NVRfkw-1p0-B*v{59G6uc`pCw$Zt)c2|twObG#*grz0!`{S*IzX`R~kIg z(vmXF${{IiEp792<^LxdD8!EaM>K%S@bh}k@<{9co!NJ8ip?H(OIg*=<3jZ*4YjD@ zPJMM%w}&q7L0nchVv98s+!Fx_-Q&Y7p?*`Rx3u)pinMDkSpDo%hy{l&mc`y4c4Wdc zii9DF68A6Ea?$8{JrHT~z?q|n*(kh$LovM$Z*o|L)qQc9AR5P~;l?y|pgj6;kzJ0<2FwFU(Pd6&eP4oP21L66rk~lMB_|!dcQ0;+Y|DBJWYKrsjMsn z^ozZ*WYWo+6)P%@`jClq)@+7PUxWJs`bLcU-hE0bse!WuduLPV?90#?5=sO8j$K*L z>kG@|A5}7$#TW4>Ca#=tYS`e~fYtW({bOb!1r}E7kZOW^u%KQA84@-;zNohRacoA3 zfJ5r<7Z|M*c9uZ_LkWh*;X7@q=Xc2vI3aU%v;3N>#5<9gg>&wdS(hA&kvAw4iNndx z?}CxC3L7R!O9!Ua{pn#x$X(TX#B<}*&# zvYM!fX#}x6itq_v^x}_D=3dU;(3G;d48%NoPOcO^$sy|b4NGTb( zq{N-Gu5DwzhCosOrMS zJmLz-$V^t>0Qh(|pVvq7D)%Yw2fHP0*Ed64Eg(34WW5Expe~iPv0|7yx&bGTtTKY? zHtY#HHmupwuO}JH>H5wk<6Z3;=S5BKuOHk|^aU?2WyJlXzrHzOUpX|aE+@7Z(dvmB z!yMf@uv^w3yV%(UAQ@I0C6uv~*><797tA6a{&kZ@($)y!)krIya)XIyR(~3)SUG&i zlAY(Fp?7f!NL!3gKfAu^xt#)9DFe)f5_iJo8tmrEK4!5mFD!g5;x+0lyv6nQ_h z{P=x?J3W{y6+QgPD+)*95Qaz+(GXNJLzcE6(aj9_K}}3Z0FtN)P|5XOvKabW>CKPh zS&o`NITc|BLFj_Ttq`vND8tb>gq=%IDOS!ZG_Dh{=7oOtTT5eerkQ@D!okIaVvIpy zgez9!!A9Us?hZq#9iqpzKx;+8?+>{w(!UN*+-W3PuAV*w-tqisp3#7>NXvj`{qK5v zdU{&7>w^p3*-T|L0}ZzABW~IcVS61(>Pq~>l4s}jv`hZu+3y@~NSx5fxH?{>2uNVD zh-xt{998`eOUSuoVd79 z8Gm$51+Lg`p%A(;S}Cj^;mppK`2HL3Wr=xuCMH9z+yu#RYP?X-i(;+Owy=|@#lau) zzU^Vo@C<({uWlKe(D1*Nc)S-2D$hQrkJsYE&Ru7eHt?yZgKeD}u=ow0NAD9S=MHJZ zxqP$Lm}i+mBaM@>!$ZmQ?U1e4Qfm_ zTaNYAq~=Xwr(>{AuuW`(q-qRztVNw$z6ddRe@7; zz1H0-fP4{+rhY=xKFM7?*^~a`tuIvhB-(oIU}`xpD1VYlV+!3Figx^WUi#ozV*uWH zOi7HhfT!n+csT(;v|_O;9!^9CGEAPR&C2?7*D;u8CQ@u+`7fs@IR{4)^&yip)iTCn zeITtnxruLeDoN98uc|5^mw~QY8+tm6_9muGIck|8n63exAuSyrYdH2A5uOQ*gwxM1 ziET6E{^XoNp|zbK!JX9EW#@)Yk8PoPmuN5a6dkttDe;Qh3zyT$_K0c3?}B-Nl}tG+ z`G#>$PL}>CQWz*zHYs$}VS9@)SGC9DkWkYUlvhQf>3aCdk+p1h&drDyw*3faADm4f z+rbi4j6r5#Op4i*8|=>3?dPpW3$_^SaQX^ZMuf0yP4Piid7bZ{z1|5&4#JG5=UCDg ze}gWg{(yHUNSSiftjcR>gbiHtP=31*T!PzNT^OICZZLYZ90^@SWR&UbN{b!!t4GD? z02iuk5z2rGStZd+394#ro*2*f$KX!u2~8-kAV4!b=w3AK9O5&DzS14v z$!4D?JJ`e34=6_)tRkr0mC@1Y3LbqcS06MfN_~)5KF_1(RIgzW#+B3`STg5Y7g7As z2lArP-JPi;TO{dHiTYYaSftzp_W-RMzR+UT3311((qFI)o5T~vEv?CKwk+SV#EO*I z6)UCK%fHyh`eSpt*xj1dUMHB$mPl0=%x(6t1rM$x!?l?YlX#kvw}6L#+3fPmdTt8d z7-KhuHwWm(#GIV&+|&Y^YcTbV9Y6K^A1e9{R6ICM=Vncyjor2)asf9KAg4f8Exr66 zdZWI_wJ_XD1B|{41p^ve@q-U*yUk_w`fp+z9iM){U%>$G=NVckY~r zSC>QBd;>R%+^B~2-O{^)RA@;MI+O{rB>WKT+i|FPSzh-pam#H(`(WBu6(PD?zhD5D zC@&haQcRjA*a5d#n%ql6j=ak3?C2J_1W* zYBaa5+#gLx&EHmRRVle4oI(}_M>9ooL*9XUq+5`geRyFiXkqAx_w};cbA?oj=qzlk zCNT*f6BooL<=qD!AVB@eEKNdoiEUNGafZI9&4>(;!-?-*yq1AXhvH$e*7Z!}a!HR_ zfK<6;lo~T|NV7jZHuKaT8~<;HNIwtx4EsAou(*CKYvNvN>4k>66-XCasS`G_N?;e; zQ$mZK?py%m%%Y}En#n;&M`xuh@#_6AKlQmQ*S$Kk^-W*1X^XtScL658wA?LfK25rI z#b_tA9DLw^)H5NM0MIuE=bviR&-rM8@i1S1IfP&6EZq&z|pWjOb$&NZZpJxn>cXtz^9sj(go>_MmKH;P8lXq!z8V(VG#0?H*}7BhZAJ z{b*SsI1wck2eqJ0W<_$3=u9-{uY1YHFejy1EF*cAi82$66sc}`adB{Qwoe)`a>o%M z40}&6pJBpMVl7HNR6mF47eaVm4c7&k;lX6^o-2~G$<62(t^VeV>7)sgeDPpz zjg8mu-HYm|cjeo5`ba)o)=wB5(JihHc-EMMF$o1J&Qv~A-{=N>v9pg|>>Tw`pDt>r za^Bo{Uly7Fo`}C&*!-7V2$?^3bbfBq7X){Ee^0`5QFkk!>JlJOoc%--iOl@;7oHmJ z;{8W2=EHzwKRkn}@pj88gM!JF2znfY4G3yu1Jm5fBSp>X6YSynWPXD&Y?{xp>E!6J z-tBS??vaJ4t|(^k=Bm_AYzN3=7dxAxaYMHo%oU-}7&y37ICc?$t1r@6;IA({B9heNz`C9y4O;Av|xuCMT@VUCkcGcKV-HVZ}I#M>V2w~7b7xuP^(sle4UmFw(F zgaIF?4>ye>Uc}{I`I#mInP{ihGslWPGc&Wo`!;#}#OD{7hWU7tqIS|R9=9s9e*S~T zwHjr}o%C2g3rk7_;|hGUBdqINnpg7!#Jb3^t)U7BLw!`oIRzQ^ukgOJi7EzLGzwVszS(Y0{TRzNs?%1Aj%a7!*6Q6lLl zbIZCLP3xDXxH`HHLbWe}8l|>wKmGg!_4rIp5zo#DXX@j@5m3lzX-&r;uW&akM2Q6Y zw!xKbRwQ&icf_+X!(gaQnIw~GyJzyQL^Qc+4+4&w4oK5jvSLgX*-05A>)K13W#mU6 zi7wPdmcR|C{OJ$;Zu~ne>AwFNrL5BHPG0{>bJNh3U7+{%-<6F!N(YN$d9?rgfvnO~ z;2)4C_m3Wum~zt6}&%I+HNnm)@WN!Ocv5i%RPF45o9 zb@ro|wMA-6X8fC{Xz}b>13V8BR+)yM^NA2c{*{HKJ^@#1W2k@W3tdoxHyo!aqJ%mG z3FS9CpQPaO>vlHT*!z4-4rWiz(&bqxsyL~eD*)MecS^veF7y2S{4XcP7Nk&q8s~{B zQl+D5$Y#voC}VK*#h#5$)Z3hnUi4+NZ#QVz<}rmVJ;;te26d7OEalfXbO~9WI0_L? z&(McWP7=WG?3(MAjr8{)&5>hsKND)69hzGgnJl?jJe=`|cRDuo1(?v}ka{8?P;-Mf zj7-4({{JQne9#Sn;dg4R4DWC5nryiyEke>cfp2LxICbbuZR5?u zr?zWa$Ea@h%}{ssTR^b)tqsO@T7mg@?WRwwGchNcH@)EuDDp937%ve%&^;g8ri$U7 zp{r1cw1ueuMH&m+*D7n$8Xd<$p}b-$61>OAn)E{IB3IW~lB>J)oRn44#Mr5~2W+;5 zGB4y?4Q(q!oBtGCB2}^q7e*x1T}1|baAY=z-7kRA8o33a%)d%gS zO^mahP%*&3Z0%G%^au;!A0wRSyF9?RYNp9NYso8o)s!r~NvgIop&#T62tMIhKB3od z&ghF`J^`n?RBLH;W7>SM1hGBxTxg59F6yCgj9k+2O9=}@BJkd#F=T%G=rAB+y70?d z)gRL0nv_zV{_{(oqNx*$XV3ZnOyWEaxCQm+Up??79{SqMO25@{<{(&7q$r#9F5M9% zVn)-=%muAsnOLgY=RE|EmDODDV-D*gU(7Acxg|se^G>AZa`!6*_7Q5=?+$_oExs#d zZM7!Y-#v|EW`NzLzjDQ2v7kidzJM$J`YkM!QO755UrO?OYD&*sgrZ1MN{_Gy6wJaT z?`r2(HWebCDwUEQy`VpM@laWhM9PLcDVH0 zC++#IrigO}kmqMN8JZ=`uENRA$f}#m{OFo;2A|FWh$YX5m?JOI>7rFJ>h$qs)C@mf zYuNVJ)CXUltKa`CdWs(VCoFQ~&rZt@;kw!th!!#wkop{{DrZLgf0Iw`As#@_c;MyjNzM8i#6L&L+uOE78bKnIy*3WKb-&n& zu$gqMXTDI_?PiCc4;W&W-eg6BA#T%Z>%tV5=9v(#MNj2_q+(J0%hZyh$buKDBh=6u zFpc@_B`%N3Zjx1=0E0Yj9Ud=jJUrS#gUj(z@=TEo3*)EC<<&mJGJBu4^?vTWJjm5~ zLVKTClWt8V1dS+&R5ir-yC4x8+c0RWWZ50|OMUB8F>=Cf{G&7Jl-}$!3h9Q8i$~`% z#n8IqZ|szuSsOvqgA*~hVdeeejPrED1K$9Lke0{6U?D&A}oaP^0NP<`0k!uIsvhDmNAZi@GsgQ&Wj zFy=}-bXN0zIjeBrr3}dvvN~kQBJC2&eIN+?bViKIAu-;M9LqXItG|>QXceW_9PY** zEy+4~v*LM3N5m`wLjra$EhG)Y_nnL${n4T(-o0`DJ&ZB}0h+C?82Ukv0JMN9v|mA; zV<69xNA%-cARutD0q?h>XRkp@O$H3r)MZRzbU3Ox7}ZcDh?atH_U;>uxbG$ZcsSbB zq3@SK0VdY$o!LT12!9SejSq;QREqfGR9$B*RPOGKOS}+eWq*&YiYwoVypw71hKizL z=JAgt5%2bzZ{cZDkg14Kccln}BNPoWi(MpR;UoMQmC^*fY~EeU7&g}ezkO0gV(Rol z!Q6n1XK5{0uy!&;1hsy7yBqE>Wpio_B%Km9ch>C)-|5Z?tlE5Fbh?kGU1Ty5MZ&}Q z@4`)Asc=5AGU?1Vs`P{;rrLSmL&U&D!SJ`3mE(sLRpIrgo{~@AoO%wES@lZgT4)Ga zE*SVdVqkFM`vJ8lnIuRhVE4eA$9qp}gh;6OqlIlKYUuZYn<@2FhE~vsrg7yZtv}si_59j^y^^oUp zMBa%09I;T)Um#5e>tKb7e0?Rp3tnOc>2aegM0l287;A5H6sYgpNZ}9Vyoj}rk2<@r zPMFrrC@b5!_It8DpXeVF)R?7kpD}PwiXL6*XuBDinEaaq<}ifqnp3CtyH$2)C;#hr zU}!I}BBLWHf9&}--d>F|S#I!BPaTwtFSe?Nz`Gs2UCGNtf$WLlQ0g@V9y{9PJTaDa z7Q^NaO)un#4~CH5;9F3X*RMo<{Rm0XTBDJC-n;bfU2?#@-9^$Ut+iaxuFJtKk3bR! zsJH7uIA8r}1bJzV&h+K7zvQ8e@OS%A*4F&^xd1ezsij0ZCJmY@D<4^6?7aH%2)qZB zR2!$Lc{w6Z#<`iR0}T_0ZK6kJ(oA%sfnOx}!71lR>BJfOyVvpb*h@vfP-?lS)2dal zoi}5@3`T|o2_XoPA?HnSC8z*hqfv+ScUbI|v$RVe0->a-1%g$~& zeHBhkvi=S$*6P+M7=v|th&;I~Iov|xb)UMGiF`Kjy<+HlYe2xLG%>5a>Vme~U7c(M z^k0@%>NenyU+jFt5ld?iz1bQoImaX)9nTmsL3#VikDVhJ`k+@;G@O=}7OvOJKC6vZ z6#s4T+blCLE2htRx&K*Lxh-i8=XdBXos1J258wOa?vD3dZVqL zTp8`X<>!(|l69srVH+`Uof*_@*{-R|3xAT=dHeW&;_HVPatKMIyk^d{ce&eh!nU9z zR#bMqMXwMjB=@C`@$Jjd*+E=|^MJVJ#vLBUF!SM~Lu|Zp)C&0DudXq5o}Tv3vQpUb zM6s*P?n=}X{Idg|7*J5q%Z_>o4s_&gaf^cTKA0_oUrO}a$@I8M@SpW0+zxM-S*-i* zU(Uo>*5)5Dr(BrkR#w;*A*2Welhiv+-~w;x76&)9`U1t~tpLlNrmCu9IW zZXs>_FFz(&*mO%sPnif#6w@1tiGz?ig7Mv;$WgQ1cxWwg)(&inr&&A|*)DsmoFo^! z%`Dro%0FP6*G#qcg|f$+q66%qO{t{iwY0|X&(?r3tD4hC^)ZjEq4(C7X8&1UWUJu% z?**l%K@I0y$|w%LaSi7v^C`WTQ}=eK?OB~>1``D^h?gD0ogN9$6dd#?2KCZL*DAhn z`o!-f+NN~1SCk)#?kBbZ;k3E!Po^P$kFOE2u-v2+4sJ#Ea2Hw?M5st=e#77(Izqdi z^-;>ymrJqGgM_;$h%?RDJNH9~W=>N77Y9Z#$d^qq zLyMn5KnJ^p*f^r&hSDT`SzcXzEaxO)P@Y92axzNo!(RE5Uia+uI78*wm@3@v*wy*dIHz z_C=x9JNRZRfnSCRw5VJ!VWu>6+*{y%<@#Z{!eWgNFU5GW#+HX5B`yE*LvZt-+zC;Q z@yDo{vEC#SkOmg5NZLTHab;{Q33jL3iPtW}QMK2Eyq4XT8dic=VzJqMA}5j#LqHKU zfgW(rRCA(t0tZ{{`|;d4-@VrEMt}6c`!lxyq^yjNg;h{m8v6V9Z}b&-{uucM%5(Xv z6OeJL@Xdi@o56tSw>)nf)-zL?Y4^sgKm9_-d7t8FaQP`j=lA^a{xXJTP{bXMG3J02 zE{YYEEVz*%65g5(5301l@{M*I!`7Cy8qxc#8e1=n^C{8sU3m_rt~R4LU8~;p87On@ z$dRf1GFtG^$siYT4|o6c_$#jMPi0RLMsxKZFO>7fsm(p^PD6wQ{bvonC|q3K3`uiq zNz^V)I22QeslR z!_x~A`_)sIC~%;2gwmp#IBEx3FXGK#e0B8kr3JSRJ@qI1rbIiHYod(PD$cp7$22@9 zszWl3&PU)QWqTQ`?0{2j3}y~XB}x=gS^7Yyq%xRUxj#va{LOy57ZQm2uRJ=WhH?OtK%D&8`X$@;*k#*pa4+{D*HIByQlX+y+zw)%K0-E(sj%@Nc9?I; zbVe0=a?Z78d#mbA+|P&kSX^!~#$!oW!-Ub*kAxQcL07td8VSLF;MuYSBS!?Uhjk%u}5&kO#3C0s;dF--c4TJP=0q=Q@1hZdU5_cd=g zNVIdfme}|Ur%kY5UA#M_8@nUV)=6hSxt_kK)Hbm90y!7yD)4?-0W#v7wAw-N#>u%IW ze0=;b3`g!0yQU9$2qkKpi1a$&5#!2yo!s3Ewmv@X?~Q?QaQ6HC!0SvnZ{vQ7vkKsu z5dV<=!umNd?H56k)$-2~rWd07@@;##IeFh-QI4h|5Mbn%d3XjRRK!0h!0^!^{Bm@1 z8u+FP!MODmk6no=D8dJge>(=EOY;tK77+%-kLF685?f`rWv-5|rXpPHu(YcB?3v-c zlctW;QhfW%$nHU+H>4iYZ3M`WH~@-}Z5gawzF^`h}jaZj83gAffFLrz@quqrXqQSG?R5dA&73<0U; zNg5hr{RV7aszrEg6$)o*^*By*TWd$g#@bi_XY2;O`Yly+ZcN^)kgQ}?Q!-j~M~HFv zuSmDL=81iRro$g9%mGg+A*DJ3QsYEIPHbXb2RKfYsLw zIm2{frC{d1P7&qY5x$d>ryvH1Kj4@{wd{G|1ZALkVvV;b3NkP9j zV4Hs}03~sWKL7>GZuKyxQps8_fIZb_T4*)SVlHDdec;?Mx$NfO6W_TUSQ~G(%KRN| z__|jktP-5#y8U*WxE%9yY9lOFg)WWyC!mA0ct}J=WipGa@2}t>oyDx$13R#%`(}R( zxS%_2qF%0Q@#!xA-#7m2Ux?UH9!df%=bud#aZskU3mpN6vt%xxHQD*%J9OUZ+n_X6 z0^JtU#u&gQ}fKY)A~Vwo^PwrKn{@rnBHu_C^4?5 zCw}}!8#Hnz`|8HSLx1*dv9yp^9l>vaSxiuYBqsmMftko%^*qN#@6Lden#vqMf5_}o zTAe8?PI*N|fpWst<;qC0Q?P*^@C-wa=%i1rXYtpXa}i!+6kVQD8(D zRZ4mAk=)=wQaxW=d%>0p1bzHsodwnQpbG zzyTLbaEM#^t^;=SOe_vtpM5PCn9Z2NVpgs}>T1Am(m7N9K-_|ivFb%77lHFLel1OAe9*(xhj?E~ZELu^=ZY+9qb5n@L1j*H>G-(qADA{ zMhchR)|bEA!OqXsx=b}SaUR!Q2_M%S5nX=2pFA!+DgWE`M{g>ebohMiIUq(8_G)4h zah{l7x<1Zu5%}KH64fu&MeaB086u%Jiby_ad!2ryEat2a=&yd1@524aUL);{@?jN< zO_&Rh9`?lA0-_4iFIifr9NG>#?o3P-*qf+|;~S2-na zsi45FhKgwMZ~G*;(3fy<)MEV@E0({N=O^PvGm?_w+4;uUPr6?T0x44k-GFaoEcKy6 zj&Mz`=+ZLfJ49LO1N#YvYjYl~)y6zOe*9pJj@t71aG!J=JSw9V#&9To2scbhKuK2l zc`?MBsdJt@l~>Wiy=w7OKw@(rZdhX9{)EV%K=cHWtkqvls+pn7Zm7Qgwn`#V%P)4i|T0GZDGtPvX?%I)uJ(ifVpvq;Jgq zEO^d{evXsyryD=*clu#E@2hNeocU;IfV(%m;&?7vglQUI;Pd`laiTYw-VztuKA(w! z_;LDq(*B`yi@21jLR92YWixiYm?)3m1Upq-74q@Oq0s)C|oz}j5jlAQ10zCXyy&oLODYzaB? z#Kc|Gfrx0%?8sj)I#AxIPVDn@Gj<8#Gc(wy%c5k;v|18Cv@jUj$4Y=*w7y@!r6;$l ziEAMIqe-~5tTJcZB?)4utKBN8hJHj)Epzaqlds+9&G~NT3r!y~h6sQ*YM676lJWL~ zswlOm04m=JKa8*w+v`t-N>WP7?4RV5rR3DqA>d+>r8*Nh$i6dS61Hl-e-ZpOPk)XA zgYU-tZGNRQNI?%}=;uBg4$mA2pQ(M;=~-97LOX{^Zu^#Ckj&=JQMD`QLvQm=^oUVDi*vr%Fsz|eJI4CAgHXP6Uk)aCn` z-5KMuQbBz^k(+vB6>}$ef{~=8`@vPDQ4&ZKF)r^(b6yJMw!AD#98(5_o_ooX7&K%v zSTNP5z`yIB6cOVUw03uY+m~iKfFE6BrLFg14KZPMM_~^$rkxsKrii>HG2`s~JVf&d zeY&*^s#CWbWHbF9Fp8^xksYUV4>FaGuYk7P>CN+bC-({7f9}|9yE!?*vH6w{MgPO= zWyVM0Kg{AL2!BN*efQRYi_7N|U_+c6lo^ipx4QMJzaa2VEx=|wx_sv7J$7`z-R%6n z*c#-h5Ns4c$A!5x1nAsfkq(8D-^E6hh|@?}?LKK&N*YC+{sS#A=9Z-(wZmmXO&Ilj)+ISO!P z@SD5T7XEVz<5Ql}hkg;3Ub;;Y&3kl6?iIIlsL%2KGPtm*`IgCLf8xI3O}C4^`80eL z**p93F)KrzZKfkJ*xG`a!5>1S6r)VI0m`D2i8_QLIC3u+e*V3n z+@qu6SkY1R}?f$TA z=6?T24F+;|(n#QK8xe>xC!x4M=fXBG4}o&L#hu1j{}hm!>A!zZQOuc*HX*V*mld0< znwZ_|JcAd$eEngIAsTpQ(eJ6_Y?o5Ys1=>Kb2^*Cjiz%~51D74ZvygrZqG5Im?kD4 zUj!6@q2(JWNi~FFk+A?RLJkZ<@+od(-aEF7VDR1jBPcN{od>cNvRxJn;A0XZF?2sjc<#!)d04~ztCnL_Cn z5raO)m!A34m_6fJOfvo349st*hL$hN94BMRMHT;D$bQT;`&ry9Sr2 z=qG9*vG070*j_gZk%U|c zzn$c3=AUn(ge~P>c6M=pwMHD9UWw+ce=>j}YPnuhA&${g{25>VJ#za2%}1#0z##sj z#_Ec)EYElNp$!~Cg^78M4IozlCC0?qNTE+Pa5o*xlw3`W1AG0@^Ru=;|6Nf9(&OI)i&BN)Qzmu7g@d?AqpvV+6w@D!qw z<_!d1%)po7|Bn#M9Y{FH^BQp&O{E<=5s%F!89V#U*gv^#zk&yl^r`sb2o1_n?vbLG zL9}}Ky*F6UN|2$U0ChD!XylU2nTQ)1JOkc?K2zG*^iPeA6VlKT>#0^Yb_GXo)@qLe z=jo#W?)v&V@BO^e*+vJhMvB?Gt@y3#tE$x|PU5Xnuzl#D6`d6>Z>=6WC$;U%jJL7UE2G3ZF zG&WkG+L0$OFN?dJy-w07p_S>T@?BI2xC4UR*3M#1Bsn1Hdwn@|d%P?a;0T>erU}DB-M0)NN<2R! zr6|n|c$?VUUk@e4zHSLQE)x(OYGn}t1xY{_jepDFQl{6DurWd3De{~bAswVi4P83C zWiiDdCQ)&lkKk_VcN*u~jHOx$60{n~vlT?)ReQJo?aWP&^;Me{$9x7?-Q4LW?kBF< zQ2BgxQU)4`5DkN{WT@d)!1ByagmamNt(jH6Cuo+q)h8_qFYX-oEN{m96 z?+bm2aUxP>!V5+P$Gl=f9pv}B_ukP{4s#5gKd7SGpvzEBuE>4Rx#aX#g3B#w60-BG z;h2=ZE}AX5RWfEey^kY_rl7CLB04@l5joIqBka@G)n1ht&erYT5_9uq^SU2PXbx$C z48xk%cI!+A^o$uddmts~jt^CWcCh_fTCg@1wmy%_@LAsNxqZQvK3gBNYYTkXAA{CR z!0kk5X7L=EupHW^EGc@rWIDPz=J(Bccu9=9D_R)^U1DY_SFcN`8<1jJMd`cKBoAm` zI@n3V6T^UDq>zzFRbj`vTVtA)6;tE$XoSd~4$aHuTT+ubzT>%B!grn_f^j2X?}ddR z@jW6i)pg^%4_bq`{)pL8AsiKZ+!=`chrAK+d8_br;>OS9ur*z6vPQ%3xw48FG{cnf z`_GU`dw1Nl>UX#4foJ0Yt?ci%M*45Vm?odT1jX+TLEK}jl?{B!iZ=W4H;nvO!n22K z;QdnJ2>j2EC!1a-KVr51+-9|)*~&xp=jN|$jL4Y0O0dXIehE*O-^?CBUgbyYOU~0E zGSn5Db^!}E#nq#kH1PL+Aa<jM&#%S@Vgv`g~h*K2M9VaXZdN@#5&yF=LELm{h00iplPjU7(;A$<}l zzw^Dim+zCkDF~!*OG~zkj-Th|73|W!d;{#~OCqT!iEe;>X5aMQU_Sz*o!WU^nQKq2 z$(^`Y4(4|zCuNt78rw$3YEBAqjy*x&x!|()81zOm!rSK_q($jMDckZ%KrUaqbEX+iq>;A$hl~QU(DT zVLjndDqK*(i|ng-mtxivlBFZrA)98$uSf5{{gXjDi5%OseL*7IgC6rxt$>MlcUwf|<}1~5`he0< z+a$-;;O8?%0KY&)0W%J?<2OBt&{lZxVdh9$XFL=8?UC|tTzC?@B6{p*RhWqY1bpIE z?%tF?mD0_(#Q+K}$oD8SWwhi;M-oK_sgpbkUc1c?lVO~?Sa2fv*`=!{UTZ|`Xga25qC8ARjtWP`aX#MNPWpTAXsUNB5 zL_FwRSI@9!>wC>i2M$7L;O~pJNV6Pw(-U>Z&m;Dd0G{QXcPGi#KSA2xjuyHoe9ys@hLlCO`y+Wc zZ{Fr8BSu9irR9)fxKo&H#D{E>)HAkA=ubt*4@S%s^Nm`9yhk}fEH~#H4MP+I9;%Er zvbqdr<7ik(gnWN;V;jAU8AA^VVBV%?T`P6kjDsh|<-|G1`$ zZjfU%Z3$uKjb z^piS1ED6!K8S1phZ7U~`f*DGnTYVfDGqrFJMd0R#spo|p+Se0^$Ul7Eycx61>j{$` zBF6kLaBP7Lqox)(!9IAcSO0tVAd?z(&?Cc4!HK^b8Eb%d@!Ut^S%ZjUL#5{NSX*rG z=Z(%;h{zV+&9mDnkFTJo5>$_Pl7gNeJyoDm`k4GZWYfHH0$V@zLvqXAN3)J-?X(3hM9f zr?XnD+CRFFT@@)74IW<0t-Ac?l09@;<;Yyd@ThIxz~EozKfaRTnHo;2T}P+(J#e%?urA;-EM6=TmBuj#SZ&t5SuHCO!6f*1DcVsx3koQli0v#mBR!SXYXpX8rS-o3fpJmkQ7Ob3XZ)9?1mX~(>`#wb6H-E!xFXb zrg=cmFJH6`J>D4!o^%pYu}QkRlN8KyFgu#)_Vj=-tF~1)PK}}vOo&}t-6Z+V>x=jW zLHwM-4mXX7*2kAnBcIU@V4T@z=ewJ(Z*sVbRZ-<~K!Iw0 zLI`GXM?a@X5_C-ybLMx|Jnj_x2lOUfKO5wGaR;T~m)Dm5N-Ipx* z{O+UceXo+^dBHU}hypkc#?;-C(tDY$Je>dY$Ggl^J5r>VS?BQk5%-3e$0`%7_My*e ztkVQZnHr1b!c+9_y@x#~o*QotHoMbx$`CnM&~3#>f>PaVP)O-%Ao*b9rHu2Ve? z8*j+Kv@})%)e5Z97iQ6}PZg1lB&V2O|J*mQp~ue1MM7gtjuoBdb^#rP&ORVzs7`&_!P2fk8?REH(Z8;g(ybMn4S=~ zsLF@a#7@V+8S<86Z}*{X>Gvi6i^nb>DGEvet8jSQpgW4C{hZaOH~YKm<7N8@1hzcZA_NsX?P9W{wNwMUm2Qg`?*A15FV|4Ca!U zGn9hqxSNGXs=kJx2}hXpn61!hzy*2QF!qs-u_;rC!GlXX(pCL*35U zjlXi__4veGPk~j&YY8hxm6@QbSGgmgx1D!S%4Y9+zA{WJKy4q%EKVUz&T*4fAoVpB z!-%B&syNlH#8%*5;#VYuzPHH1M!>24`0qoKv{%!iPWg*Ta*gwTy^Hk^QH`E9|H(T;`OMpJ3!Da)pMW4sTN|Q|FB0uDR4_tUx zse7n#0Rr0N&FN!EK>qk08`21n_b{gNWY`tkV*FL~aa?dZQt8plaZ}Le<;^Ez1rg=z zkWQ(wpiqTI@8V?#9KM2V?gxLu1w1$36FTP}(<}}|br_pIdrWfCDT2=XM4n ziR;Vn$tG`?Io-E6QvHxnFxXK}^OFXQ0*DC*QDL>v+|6)QY03_yWqV2J3LQ6MH$Q*G zzX?yf!k;^$K_L4b^UEPSHDHfnhbto!Fi;R-$k$Fw6!(dr-B8BI_$R#+Bo5!^ zfB7o0Z{!?|K%k{07SAbJ_7U37=oY18N-|RtI%S}iXgZHTW4;Jz{!jx&970v%3 z|K1~?-IL`SGF!aXrWE(4yiU(@A<5O!8HM$x$a*o0`OR=uxjvXiM$9=E@0Rz3p*rRL zMd8iv9bXL#3u_Bb?+H|m#tTRbW!iS8Tdy`L=<+*$+co>T>6Z5JV!+K119;}!L&zqz zyxWo9uC+k5&|)W9KJOYReLwpjm$r!lInB2~7 zSFr9cMhw&?j{H&q>h7W^c~LmQS32WNj2pA$=XsrC29uh;KHx|2l*o(~AlqYm(o^V> zfNu>GPVDuA!BOi)eVVRRo8mwjrcwzS?WlI?a=Wedkq8>Jq5`Gzm)To!YM6^_AvB<4 zfXpd51xczYB-zACm*XXzNnQm>*~;CgLQ+QASUHc-CWPaYM!UFjlw{ewW@@{#BZZ(b zV$FcX zekNW&lQo|SAg*b(<7=Ms#;U*Aomd>6nlgL7+0Wul&oG%iy|>zE|K}OV%U{)ATw4Iw zjEDh?eKtW!mouKQaR8`{+negYs>(rI|DPJCKEF%SG6nn^=^fB6aX)cyk1rD`NUOJF zRCiOmV!nM%8IYa5EEi*yjCv+{Th+RM+p)u4=!vX!#2;`PD3|aXz_l$jy>|{0BFW-= z=L4^Wg5W$)`p@29*cEqpSH@z5}Jj|K3x+@rV0^NYde0ZE)no_GNiW+L+(M1<#bsj3K@?nU2;`uiSGc$t6fCH) zySr0TDyl3&NGYW_>MmA$Vcu}jDp=A%bb=XlB1RH26o7G>bN89#sKxl_R%KO6NCVd$ zE*vF(n8F-}L6sax0oGr}z$B3ZMufgKTtrb66++boWk333CaLdq^vtT6BX0Q(jJ$w9 zr*4%qE;}9IjbTQ&mG2%KXEw2$xHI#eFdKzPtS}xp?G6M^y^#(ZI@6|b>MExh!Omc6^p5&tUtd;+!qXf~VAYPw5q*Z){rFQWUjx|7G z2OK#SZ7PI2s}LY-Y^OqLKBsb=+9M(=Fs*b4gb$V{0O}_OGoT0tG!!L)sq8N=zW$VA zSYfbd_c&OI+mfo^;+dg~)+Mv6BYsWNklLoC69E4s-OHWXT97?;#qyLr67zH6nE}z* z3bkWq7p4kAeG93yRa|swiEyw1@E#TB9`0oQe!;e9kQDmgOdlEy+TFLkkwL4P3jQrxP-ZK*0_5qbMgXz6Sx8$?zzz4w*{J#ew+|F{cKb7fu^pz|t^k7xm z>sM0{8DY03rmetsYL|cQJ9;%%K}E$kOLNqU8!QZ}uT*{F3nY#+m@97YYhOO!e(+`U zy+fl4(-QtHW#r{_Ze6>PRNZ`K^r#;mh}@(=&;jI6Sx~UFmQwzotloC+rz-ONTL}6 zRT#FEj4}X{=WCOutfnQG*{_}|IjEf;g+{gFhJo0*Ok;1$Ii<$oa26DjSxzAl*-;H> z{YuGFva#+dhC7xWsidsp<86a6i)zF(5!eb=oVzn|$LUh3AOq9vbRL?^y_5v4X$eAJ z-b9mh@7D)lP%r{FH}{vN8Urv6V6si+>*qG%$2QnKn$FnMpm4*V-$!kn5qK)B+t*Yg z|GRBXwc{y$=Vphb{_4ArmvPhJz+R!^8n?G3@A4{}E^ zzg_Ygr=&2<`7#;?7A@q=`4DnY%pL>?{db6J-P#c-^3@QFZmE3qt52s{MB5{k9H zHG}q;=Cn&tI98C58i9-Ug+@)?2x`sB)!qmW!+&U(M=VS0Wt93 z1}4EF;1wtz6Dgwf8AllBK(JKinc~?(l@@R|=GCTc=)s8<_z%#?4&cQ`Y;TOB$ohlH zCcdfYurKFR#^2HdB;L8hKucEO2PLiFuB-^7=_C;Jx=s7IE`W+lxDfkek(|a-`_ZHm z^QLM${Kv($*uFIG%)O2<5kNbTGX6WOx_f*qt>go$FSUK&@9SZsrz)Q0Rg!1;1*%Fz zvCJbMSNc79O_2%6Ssr9?*|x8>{@;@zS610i2ijz6NiEl%kL@kj9mb%r%ojQdpBn|l za4b7!jb!B|cB3wl@pdq7?oqfyJJEKb8bJqCMm^HiZ4!8r^6cNIwWI{qvkzJC$Bg#N#G|S zU15}QI}#ngt!J8?GPW(vG}HU-Cy>zMMsLHaDU<&qW1q?6O^?5eQ@%?b;C74oqOioVz$KPPJT!-kiZVB9PR@YV7!^SqPh)S@C z@V}!6|7%I(<2ruxcHVx~IvoVqy?y2rJh2P0DloHQm2U@KMkXB{Dp_X0YmUvjHO`KA z@i}K*_W(B@VC5y?I@TJzVbvB9FD6T=)w$hTw+tap&wbFW)s5%Ckn}0E%oSdKA2^-_v45C-rEj9_dMFKa@cR$ZhQB1 zNCgdzmc=eATTtsi0+&xbcnSWVyROG^@gts}nwHksU;orfqb0JLJ=tsJmSdsmh2{Byq0eR%T zP=V+e>)O%^$%*`WgaT!sAoyU>m6pot%SEzW-$6vGK=T`!dL31eh*6kkHaSw)8U`wl zJHB15U*>Te?NxnMES5v~REnRAh;tmpM&hxwzzu>5lEyYS1w`QMHlGwsE zC$^5&g3x*u9jpk9!#B#W8}#>{ma}TRVmz&(bu!Gz95Lq{l|yK{vH5=D*W=vl-gLS_ ztaPqRAedz6XfMDuA<`nyo~WYGXcQD%52U8dn6& znt@{?YfFMoeZSlL`-X-FBzQ<7&q-rQA%4D@F*v78d zSXd;JU<^P}vLX$r7`-)nb+5`#HJ|09K00JtU!9NW80NZN){>u)Dm=V;<}Q8MQ+HTm zH^Yt0isVoF#)t)v$L(}fv10_(ZT>?}02$~lOI^$1Iw8F|PV4*d4}>tdSg%D1=Iv!Rxyaw)PAdBv&3gFWDyivpyq{&+7s>StNApmI? z{O>O@S3+}+NgVFazYfvx!ejjb;oullL26?16guTeFf8fbHI!b+9Y|n&*8&p5(D1uO zxp=)AaAg`D!E0w$YZte)%TMpNO zXGa3xrnY9v`NT$s@snL^%AHU>j^8O(1gA0*|+O5AcTU&4hd_nK#BkP z$8-C(U?*DORo|G4844VadsAAjH+5Vc0CP6R=JWls2AMXE8bTIortwO|bECh@KSLnv zD!v5`LIQI}^U@3m;veKme{*uH$}pn&`Z7R+!r3kh`P8PzOnwfT=p=cgk^>|G`ib|! zY0=Gf9Ycc788IM-;8pnN;DJ3)kmyb`tm7Y`B5X5$HqKb;Zc0q<`v}~;_`J(c;D$!H z&8(DrEQNd3}n~%aLY{k{UOKQM4>NV4P-YVbN)g)vwz+8eWNvHZEXP?tf&w zjxd^B`M|@&$K~bsA-Oi2jV1S(Uf9~?9yTS_UDTJ8o<|=O>jrUK@ zLc!5X=SE{_Ug?F|WXDSg6+OTs9T~qBant^~b033rix60`)jcFU>r)Lh>kRTvKAgyt ze^PO*T2;0KW1-d=W=%S}3A)ld#dolQu8MgN5{_6p{qV5~`9bhN0=3aym^u*87I5OE z;SKQw@%sq8AF6vhN?z?tH-Pi6P_4y+C03mKPHzLI09>zO+51t<5Jy&_ZG9}Naw-AR zQ>?i9qdCkOhCO5=9|7Q2h6FMxVA2zm@#JI2#41T4Ygr^T>_UALI5JQXY)+%IayYG-8?lcJ&TmhX&#=j9i=Az`UETN;%*Uvpu%?Su0>bqRd# z95ve?n5MypOQHWW*7RySh7WnJFCjo6*ElUXCH;5^R6iZ;wLAOl?YWepY0l^qyi~Iv ziYTvdP^!!w(-k}z3Oc%t9XNC!Murz@5$2sdpJj65Mx`jEIX;#MgEF(=x;<23Jn{)Z zWl!Gq;geKMmz-CZiuXWWym!B*5)S%vEVBXH8u9}`&muV+bh$Rm3KS*=ap_ELo2KBP?LKY!9#*Y zVltF8HDQ3q3-?X5GcCzwYVz*>q-DlgI+NZFk>&}(YT#%w=i`$mO`_(#p_!!|V=p|t z%Y#&0baKb2lyaECTt@oR+MKg~$$nM&JK)TmH!YSDr!OZ$=HF zOKY%aEj`k1t$?9FXf zljBLD(phUW{I^zglPo^$FhY#1S5C?FS7S*q+Qx5@%KcraJBCZ&ohk|0P`)VJpiSNQ zHRMY7gbuZ)6rMx2Uj(5lO(dXm27G13Y^-H5??aVpPgWzv4R9wJ3msSQ@RnW_XU~i- zsHEmSM*)!&N=mc#IH_hR$Rp1#sU_Ftz2{^bdevCS_)$)yX&hi_LVggbWDQW1&bMQX zGLYA2G&Z6%H{-MtX6Fer-A9(H3r{8ucfUOVZcPrw^l#QFJadWOQBY!$Kw-9=wYIW1 zWnTONz)7$G!pm1|%=ntDy5<_{>;!nQHUz{Ul+H4G#zS@e;l!JeGe`}WyIy?~1dp^O zsr@ygsK^%+xCUcwDp<^sN7+aFf*DiA45}#}jKB?i8xtKU~PMMHT)=V#)Dd zgHKFMuq=ow?5TCVphG|qjuW419!UCr2mWln1(}0I+n0TR$fB`QGuYS(ts2{vCtOT| z8N0B_`um0~&dGjr?W^yGOg=78Nf^Jp;Ty=E{^J;U-1@Q5wpmSgkn&i+fPd+);|r3i zn+e2Opod^uT-&Q+B5d{DZ}i-Kh982{_KXL_?EGPPVUO;#Xe(|a9-)f%Se0B(`@H?- zBxd2FyVzJAGsEq(ibDCR?o^xI!7wDG(G!trsft)xQZiZs+<*AUkiZ4=T3XU>cBr*e zjqb9s4iY>EhZ4}s3jaaQ zGeiLkGYl!OOv{bxU{BR!aZ*}R5)urDISYXE>M{#b()~1ERub|uhSg;^_1tOwK^0mXH>79cyouA?gV>@rU2d^GC;nhe!Uek$t=mxi0V_-gxeGk~|9gkDpQ zpz!w0qF_5oAt`MRuWQEanf70caJ0tN81tsZXV^kpEhFB0vsD*3tc`1{YF4@<}$gP5p9Nd3k<8K|l|=0HzB9lGIJ|1a(8*Q3=X8Bxdwb zXY|Js7klH8d?AcKu{iZh26Xj3D9{kna+Zk2n<{F@%CA3#m26K8CHv|jDJfZ| z*^oA;@HAJA98y9aE(eRIQle^ZqLdQ-RrEAYBpm2Kel7%a%EFhhkjH@VFUW9;7)LQI zg@ROsRU z2DDSWU~kgG<>o3YR3o8&uY$}KxX&B7qwV@`PHt{dylXlgv+S=9p2=(_{9F0&PeXetEG0B5s&-vS&EPL2q9l7)GCS?=A{j8Bfk1! zi49(;rJ=2f%_Spm@|phzLkzO=r!?A(<+!yb|F%Af({r)2+F{BN;`jpkr=%~7Mdivm zW$XSc>MeZ1sKPAFRooo{Zoi{=0Bm~l(`jdat!oVPN-7eeI|i=lDOXN)-5maG{IG|( z$b@AX&Q!jW6&eT<5+xN~KJfj1d-EEE1kG}*#hnrd6dEx~%ugUH6m1H-UD^Zi`Ri8c z`h`N0XaibF$A>-e1Xd-?RN&Y$ucjsrIJT<=rqSKKAllBnS{!z~@Q`+hyO)R6 zKXPub4~5BK5@@j-ZQf;~6U6Js0mE$?a(H8GX`P3Q%D_AgkiIWtg*4Cuz778z_aTl( zjQW>rC&v!&f683wj0H9@8((=oLFv2rohfx~oN+0<5K$GX(!deLfT9ge&B1S+-<&GZ z*-*Oudb4+kZBk>5Pzs3B^^XhTaSj~Lo)5#ocVtczh~)9ow{Cig5nxpJiin+=gkg?v zU{BhH7>5hhMNk`W59L{YVbm{6b0Y1JUl6o0kROsLkK$L2qv~}}Z&MsCFm3!G+o>=0 zVl^sH{uuB`npFU2LOyzhq>a)ZCjw|8Td9sh>O36)1L#;Akyo?gC9G`lZHGub#6YD> zwXIFCDbh+^6*S+tm}k{?9)m1+mt+5+t{SH7T@H}JEre9QfOiE3?1!i>oO(iFixMaz?!68M7nz6SDdI(8>$2ZN)sepy~ z{)!CBfKT>Dg+xH&O~=~h>GvUpPo=^3rGqS@&kn<$12Q0 zBh0zI=w&}Y;G)gw9k#o7)gV)h6p7cFhLzx~+zhG9t}8>S)4E$?$b`k1!ASPXkLMTW z728UHEWQGIa*QKA4&no{#7Vk%>WhZ4d$e?U>TpoMd}ekW&;3NF;*oLQiog0?#0E+x zb8$4JQwzQ6&OHzU$PFD63?-yUIJ(eBB(!{|B+0Ce(3~6vMec%^Ao(1x$Q8{3eni8@ z@THC`*KO=L*9+Ns4{fbbjsw7IkptqGK-yVUF-_|iMa>W}8+ieTvJ0lJo z@Kywy?Nyzrq{Q(`+uPf7=jthm3AUw&;cYiIExHxHf9-WJ^Lm&a{P>Zr;PtI&^{wEd z6Cj;0mYy4%5dT#uU-L}-sr-i_?z=RrTCMY}TdVK}*1aYNr=3Uh9NOlDAf)pY-5g}8 zFn66{RK7gwam)fQS+5Lci@NclED)M5F-|iW;L>h9uqv2l((k1G&**??au`EYr6Hpb zE;Ohg8uNrjA};bN>`;ev$=5!iVX@b@hZda32DDU#`4s)Uw*;fo6mi0!)uy=q`O5z2 zlFcmYaUt>?L2SPIKyjkqZp1F7AqB50va9M|30lYr(@4gzBb74M_1`-4-Ypn-_S36YQ;(l^h9{RP@l2B zj=dxpx5&^g$nY+x@X{X~^HQ`$Tjx#N$91T1Cw@UsNY2a;0De9 zLhug$#^bfiN8f^}x8Gs^ErUK3;Z)QD89ZnC zyqi4wO!QUDNWb{7v{gHH5+y_!FRiv=@P#P2!A&Pyb8j8P76JC|usO1X$u>h;eechmo)G)lx?&2In?p_-CM7-jNuV2SG zE`<`%R(M$AxrxdPBI0Jg>4ikA>!d}k*of#DGHo@@E(*lPC4gXvCz=4*alPZA`wiWq zP21{kkH+F!0=7-34H`RXY&N!S+qP}ncGB2RW23R{HfU_yd-Cr4 z?e5HGCjXN;=RCZh>*g|?{<87}?cQFxG(Eb@0}5Sd_p%5NW-kQYvIE?TM1%#2EBpcO!wL+ zBXvdZu?Y+B@Y%XW&I0JggI{OgxUPEKNfu?74M}ZoO5}vy%POSVxpBT@s|AbJMu{^w zg%O|5?i|_E&zcFSC^pE6cJTMUYD<1!GH_EiWJDu~%-_>j@#+kk*7%Wc7Hiqk{!~Fe{Nv9DWtBVs9WNMaXYuBy(xD!%DPU+Pg#g zaz!+|@xq%k+T1zb{QSzO(PSta;$R%eCNl{#Vy?Wlf2FPF92)|fhVUYJdW0iM7};VQ zMT#)-i+6<6-yvM4emPuUjv+HrLjVUL(=0uG8|Ph=&Fwdg2X!{*tdXZ8OuS-ZV&4Fau>QqH7e!>? z{E;y*=V7}4@_Ll}eq>hPLyQwW=iv%uF(knNi#J?Xo)jrZiZPYT3-6$-VKXE=HAcJ! z$d(78)S#rVg#eKV@;;AZYgJAjurke&(lU5jUt+Dv|9`$X zv(K{q2vF>LA}_Uny#$B=-3mD$8%ynzcEjV)MnU_$b7k#*mEk zvvJ6`h9Inl`oy5@cUl}E2p~6o|RpSP> z?x4ALRDF3v7bb{PMrwM3&fr&LvQtm^189}$oMOl(`x9aHi&PvfmAE(4_et2&MP#U8 z5OdYAdzvFiQ!*~A)WV9=CU)SgmeF}86xWIgl3=E z_!e#DBH~CTmmb~0&%wqq*z;!I;0jS5U`}$5QO%Fsi{>$@xQDw6X}cT85NN-HFW?7~ zTp=pobsDy3F8ef5PHC#hV(YcmWL4l`M^@O^J`m6`_xQ6Vj+7Z^Hh7fX6Q=IbW-5>^ zE-Vauf@HS(!<1tA0E)&M;IW1g!{imjYqf3Ehg)>k7Dsmbb*;QBc&Lydu67a

    bJTiM=PG@RlZ5{o2D(rRMX0~)^g{z_hfG%fL`MmtZ1Y9^% zq?~G{csqY}jr%N3A)v@6-`yj zjK!J4sZgycw%$T^4qZJ<;-jvpXfyQD{-1gz!;}PhC$rk8Gv2t`Dywnn?b%D?L{!Lr zSMT2?g5r4f*NoE#Z=|?d+vAmVf}2QA;pr6+3Wj|`hwrA);reN=`iZoGz3^1N2o<)y zJ9m!zi)oma?3fp)5XMMTYR{Mx(#fd#bo;SaXjRxW+1GY+vl2hgHH2r!{XI|)L{(8> z$&Z(+;Xz^Ss70?^X0GEl$&Ks{6^RBNv?gwiR~53LIif@vIFNH=YJZ!%VZQZBZX10k zEMuAhzAiUaS^*(Tjwq7fmSHi#q?@`n>+(EY+7&RIhP=Ok0hqQs#>hmtCNP27% zz`%@q`4wmQIj%UXo6(LGVTo5fmE(#`TSY}Si@i5Vj&~GrU2DT4ON!vS=uCpcX4Q6? zZi>WFI_%;W)q0a3%fbN37AUgzWkr+9#t1ZW*Y$}EC=@e;L>R8ts3I?bF_C-#X9oDO&9?{!ymmXE4#0-Xo5y6V9$1gY=&USt5B8w z{2KW&(Fwm{xAMp9^vjVL++B&X!v7wY#Op?u9^2+%QX1LqP{g}ybvKd(O;=NrZW@pQ zM@of0fo_Pn^27 zr9yox07fqPZ>Nx3KnSf!-IuQ?z&4l&ImpmsbVS=S=mHpR+w42NN?_|ybx2Z!Xy!!JCW1gixajL}aFM@?UXi#SsepO0=7i{#SZEgjrhwwV;|z>J zD6^R9NT>z|9TDnLKMq!ks19KIo0K2-WzP~O6i!c^kfNZ?d03?9JAx?h9;cAGZqPF@ z-S5fOe{xEs!hGq9&8cE85CJ!)kp`XbIE0JH({_e|by=jRNI^~@X=l1Q9GmF3W1N2U zOfA+}Nj%ec_z5n7D6bNdkkEB|#}`BWjX&g{IcaweHk9X_(o|D1HYHu{w*3=fx@PV# zx>`fZ`vQDl%zV4l`qF}wf&Goqnpy3fUl*hp5?Q%?7L^_DbE*$jC)9F!zCZK%3x)?w zYaQekd9?MM-;zHE@c;-Q6R>caSzKhSjts}DF#V%DzgDQ#Vc#H*)x>Je%W1Oxh4g*MLtJ=5;L2~~*nozV9C8X374<{x2 zYaKaQqJA9Vdwl6?GqBVN7d#CN5>4HzH=D^w5%cq89cyg+4xc?TME$MBxHKW@_6OkI8Dj;wax`JC%a+$7bZU>^= zAC*BdSy^}lzE^s!7TfHm)mKds6%}nAl*T0lrUecyKQRcE@hoHXm2h}?#^?DD0{dGG z67aW31%g&)QS&;4MR&5cdRqw3E~6in4kk6Bv+Dj7-F}c*QKE<4_Nl2T!x;ED;u_rNFHy*A+e&#Jr~@fTTC-*n)W6;d>uAfA~LrA}>l-HsmFF znio4CfX2?Xid;#5!y{#q;o8|#-HG65CRtgT*OJz{#Ut5q6cz~oW*dOyD&~2F*l&#} zx*`r0JL(-Y02z5MGNmPD5wk8>Bd%Hudw2Xjdj8!pwwNl{EpIVdr?c2Tr zp0xBDx-|0rod|_2Q>m-l{BknIDl*u}Sd>BQD>TrfrY8mVrxVO2Sq*nyku6oV<&1y# z9XuS6jouGtpKXb7j;1T-b;HwH^>CkL3cB$y1=Vt5(m1LukUCCE*nkz2WvZJh&~GC~2Ar%^>`{Se00wA6A%#Cni}Or4WUr zO@X3ORVcM!6hLIagdy`{mfZ29F2=aU@7A8=;}ty_-D%9_kRVC_lWbf6r%b&$am<9O zuE@u+*dDk8Xm^IXz_vr?^rJPAiFa17(USU8-C{^Vy#Rsa`}Kc@Z9j+T#=TpN;&Y_| zT1c0KmCj#ag0qfWdxJgG>2w_bL!8-NlAW6wf7KDeQ;7_uJ3cI`TNhr+*V6gywJANq z$#E$-x-Z;0*484}AXToJR2rhMKH8-58%z2~MKpU~R^>I~EG1++b&Zl!Te%SrE6WzT zF-5bHj-I&LJbT*4ApyDsBy12vaGf1O+W{y2ScJdU7f$G^!}GO~&_%a-uPYa<=~qH^ z6gzuT1X!1)OV=wJ=QJ~7sd58y;7U zN>*p{*`{NRF)I*nGifBWVD#t_>dxP0?=Gb4X2A)}cqckgB9{@9w~9k~H@MmOsU@^k z4hC#osIncj*86?JJi3oOxD$eH>`FM2!YuItt6pd@f!_x=22Gk~K0@7&dy*BEl@=Bj zpPLaeJda>NYx&M(Qp~luIs1wOZjqu&CKH)j^}0=Gl>3;Lyz$3fPf6zgR=f^y4V!0sa+v^a$Ceo~>;nPkeUoxe zwOGgrjxJeex2d#4e*6xr4bq=o50GL)8) z6DY%-QS8AXhiYDxD(5s0ORGo1ejHLZqdHnmckP#m0xY1JUiWVhf`JlhP$#jxE?GkT$80&>?Zaus`XiMJTTO{n-c87 zep}g=HnY+|61CXZZ#G{Lvb#uX6^q-(*7k3Cku}V}P3FmHLzkSpRsZ$|=_3&{QQ%L> z7cAlnYH?_M90CqC#`b%St5+ikz+BqmZjJ7&M}I@fWmvcVm#|2xt%ljMXoGKeFe)WC zcP=r3!5|LNoNQ-c^`sh|m{3>8@E=VepvipSw|fs&sZ^bO)D9%L{B*F@ryu#rV#Pbl zn6t^ckw9Q`*MF<+NIYKN+d0eN-*pLwZbk+9qnDQ~B#d@74P+2(HbvEWStTh!fp<@^ zc-hRya8rdDx#VOGQ&SG7e@8O=flvZ@@aCjUvn{l$Z{AB_}a!0nO%h06^I8&^VO z-o(UcvmWzrC|vk{MwdJmKK_4;U2UgmVZ&D&EBt9cb*uG~mVecJa+EERhfF}Y9r2I@ zuYc3U2?W)MWni8aQ!@{i8e*_z>g;D^jG#b+jS#c=E}|{SNg(qcvGZF94maGE?mJl) zMbgKFs59e1C3hhMRCRbe3w_T=RmAd5(BS=bI$2L1(FJ80XbDDz)?tgL+bmLoLxL`DLiJfdViqL?@VH zMA8Hfe8dpu=5LrcavZtW^#o#9lEV&Vk#)%)(=@RL_zr zLdzYBN53eIACee#mo{KETy0IgrEx24dGp+OeOW66mPn$*8S}z@<)j9t9oZEom6UqT zUmGTUQ>eU|4ULSXPdEApHoD3J78HL7Szz7+u~nxHd5b9-{Dt|y8`>DF&^YVr6Wg$s z?k_YQ$jivi+L4ncZb>n|C+OGn$MMQ344d@CC_&68fmO9#y~KvZy7}=@;f)gTL=qYB z;bvT8!2%WYsIb*RS#A-q8cwB4JWG&pEO>!rpi$NuRmXIt16{~Mb9}w~A*-zup0QmE zk|bHXmnhi8zx?>X&lg0G-lYRjDw$f}OXx1!%8~-U`%Ue=MvbUMu&oQMPRJg)Vx7S# zhC-Bp`zS}ZwH9{9he)aFHmy-$oR&7+9Kf<^#TMO1u)|a(r;|+df4L0F_^~nz zmCn@8AjciE>sqSI+=aTo4vxm=Py4PF^Nonxr#|ydro4eSHO2V4jfHfVV`5+zgNw`c z+VXEDn2`hzZ?jBfD41J@(X&0D`IH9bDWCYi36*xtkJZHz2IPXUz|kAY~jk7Mk*(6 zUpTvW6%m8lu8<{^;X^x{p9~NKz){lTSQF}0#z#b2ugLTBW%nI=0I`@tDNAZ5IxUIK ziK?{Ifp1B@ey-{NL{gaXTFKBKWSH4rP3nF=`_tQ^drn!m}THaJ8t1TdLJL4^% zgqc&15E;sV$*yyJp-uC2PXU>QXG22T7APtkL5+@+XXPCE znJAcQ(}~xwQX)tt8Qi_WW?p?^P;lV6YkmxD_yws3A)p$l;<;yV1b!Jd>-L@c!Otc= zi)I$2IBX^Km`lQnn1twjhw#YnPSa0Jr?yXjdi}$Q{=F2`e##}bl$LKW&(Gd6PQ-5O zyrQG6{E@7kvjaGQc|m`9xX3k_=Df28CdfuRER_6230I?pzDX$kLF>VNZ)FvMICcL{ z^rC;+?Ozlzd5BY45_GHu(Nu#p?CHYlV$ZfgqFq!A2NXePI|Z>tkki-7w*_a$)nUo$MO+D?C4xYcteqW-AX4Gh zjktZQqQ1xxWg09=t@U)KPu@7rN)QFT3*>aaGMnj`p*#rwd)_{2D}Ba${`2g<9YN0S zd3&hB7e^ui)T;@fce9GuqxXp3a}<)%_N}@6wOq8UU$0I@srR$%*p8Ij&7X`9D$DAn|1D4gBrK7lLLL(tdac?`XX5)9>{%02-96}wnE#*Y__*L`OY|H6 zGd0dOyXT6XoRs;Y!J4Tm{A3AR#JUKEMSf1vr)mR5XnSB ziGDOv&}yeq6OaY+QgX^lT<|g`n(73**gMyVFJBAd{pdzH*piB7@rAjNfwq(-vO*k~ z(6!AEFag<(>!85KCHZ^Mo44HX{(Q2@1cLC$oyFrGzLiRi>R~V!DXE)~Vh9$!Q{E@U zEL>ZQkmQL$h$UrSMuM#qU2dWklta+Ny(HrEpgwk$Y3bx{Zo&ZH5CCwFq-1_IR9by^ zoSW(R8I9GvXlvBzl-2Vw-g9t!G_Ur??b(&{X~i3c=NaDF*;#r1VuKVVg9xcTYVHiI z5K*A-x*ibu&;pH29zE3%ozqIFp}wLn7|S;;NSOL=bH&{v{PVa&`#K!^F%%qDFaq1i zJnOlQ5p-6~wB$5S1ynStfj>FIx5>3ki-QFLu!o`HvaDgvLLx6E6U@v0^wwP!-+F?t zbxR2kf_Q4d0P}QOLKgn-DgoZ4L6&A%q*}|w$0W(};dN#?y&X>EwhbB2?T*#~16>eI zL5&M#)>GmCZujE>=U{jiBt&?zA#?apfiY7{?KWg$yIW=tA96(UGcS`bvMMlHn#Lwl ztLV0TOj83)d<93QC_`ZdqfjVQ^}$`%!ZF8XxMw8;JkcEJekEgLl1nu@UU$3*dcjd* z(=%>RsBHumBBZ~>3xpXAFywrkXpY{}7h4$0OOe1huBatg+oe17=!tH&Gjun&`TVnz z2P;OKZbF(&l%@Y1 z#kPS6QksP7j*83LRq+lNs%9r-((0Enbm6 zY#}FKW|xzh|exv#-M!L3@YIoR{@ z(!=EU{<^us^f~6!J~?&s0#vxV?WI~LOXv*?3{vHQd&nM}{(+u9xq@x+F-@=`k?8}t z>dGxnu6uBr7~8+=d!%@6VQX6Bx0IIWh<}qM=@bg}lteLAaHJSk*YYZ8ALUBXJXa(N zEtzjo`vjt$O4~wc%0DGvi_}KBO@H#+{1uNd+e+@TRZeI-#P1Vh6^By87pn~`h+W4Z zj$q7$A^qz0J%XA>r~kv8k^a6v8%N`S7o8&3mUxhEn9YtY zD8sSDG#HMs<(6n}$3zE>tNO9kUSSQWAN%KfW2LyvapgK0mZLmb(`@zuyCV7{X^;s3 ze5m@xu;p*tMfXeVL5`QN6)8hK4gtm~Vf@^$*{Fix%@1QR>5{-v;KaC6OM#}SltJ?E zY69jBR~0-c8nD9Di4WO`NA&7}+hX8l7XQ@ZW?S*ciYP5vV`eB;s$sdc$HS{UM&hfd|0Ki@k8(wrh4_-aP zfSvcFRoBJJ3WiiF_0|x!-R_Cr2PX#yM`Kfyf~u-0U_TDB`F`K>H0<{(=6e;TC$FT` z&-dETXMg!m;OEbuwSPA^MP*MudA*N1`#@s;C}fV?q-%?8IycAed@7x}pIRVHNe25; zW6trbt$T=64g-NlIC_Vm1ilwVCB>UG3YjAlw(1b)Yb;HZI6U#}mcbezhRts7`ASRJCH>L~$%fiq8+KEx-3?co$m4SM9-kW<9{5w))+8Pj)$MF(OJ-%h z`2hM6Z1*(NqC*Foh-=QlhyRgT267-?=E7=mBv_+|pkQ_*Vd93o{!= z1b1TQT%5d7KZRN#G2^AoIz1H&gy<(+Mudd zQGI>}bJIpOs`@aP`kiCJ3zB6N*}`H<5%1>>B1dZ0!T|!(AX z+s&}9h}GbuJ^b%_dx>Oe&8<~1aX%0i2qaQREw)INoLHnww#x~9@s@XAW5;ciEpE8# zp{oH`InrNq0qM6NLPdTc(^S6@+21pf@FJ<_mluGS!l<>K)3oY9MOCTGk>*K-1+rm< z%MS-w=B%wnKTNhj=9J6nB$HHCstuE;eqed|HsZy{O|y{m*8rDMpFrlPr)j^be4#K3 zDykg-ZG{}ibB`e+B9i;~_BjZ%-yKP)Eb&!QDbCCD|9tkl(;u(XUjRVa?*9Jur*Hf( zpEIiqFNFUzz^}9bpL!Z0=4ui+_p+L|@os4jmyEL5mmr?3J^7XAA}9GfCAuII=Xz~2 z^Smv3BzxrfcQgNp#npCuu{t^DD85YA zg>00e7ULAR7f72CX$Y|uL-^GJ+~|+*K`3AnU_)Pjv;~omU~@*WYh3W9!+WKMyI-Gj z(`yT5YVEFjIF;M8)k!-(TwF?5xU88g<|uD5G^z}a!o4+=>Kk-J$6h~*1_%14f=tlKa+b$&DW<2jV?{?? zGDFE|xAu*#lx8(WYnPj7kL24l`{~ICZ5FSaD81J}0Ht>g91c010G%hZ?x5!r3V&)p zm=F&bXvB57el4~JRQJcI|7g z!%JI1jl!-I_fX9i(b!a61x3cxjBQ5(2wLLS)ZYzej-0FXdUQV#Ld#Vk5+#85WA4Z6 z!RvKekFmbKKLAX>-p{o2EqF+0v%>=dTS-ex8t6B8d3E)Xi;wq)^SV7$(h=TxR<;W$i{BaG~JMhfJ)s4rBMU5TT#s+Xos+N1@TE&@d1j`Fh@+-Yt<4{GI4z^ zz2G*oq<>F0t$t5Z1wuldTy|f=4lp(5R-#z4%Czxlpz6$f5ku3_l={i8i!?z{Rf@TA z^4Wg)$Gg8+J>1E!b$wSN$=Ske=<5z4vJpXM^Fp7^-*>9_q$LfNWxXMTA1a-?8?gX9 zTlq0%Y>vAHH8e0Q)qV{bOQKl;7eyr~LBNcOJkEA(pT?e0k6=osJ0_M zln1U=Y<%dYnzRyuI~+l(kxDw2Dn6PhE^!Ke3MO#7!2nXy z;&pKm_oXDSR*7hrW4bWxevQ%X9M*K>;D-00v$QzM!UY*^99LQ9#_e}gMA+T?i`@yB zotz#Wu!x#*Il^(|zPX?z-;|hqmQk+Kj#1?sH|(Vmj1a!W=T1*o=VeZ>lNoC;T5m%c z_xYP}ZvRcXbbiaR&AwxOz_9K#@QP-eNq`^Z)t7Jcjns8IVj|^m)Jd5*xompo4deQMI997)%S==7vx3OQnpFfo{o6b zpn}m|x5&LH8$^WVP>e`vsL@p1$!TEWZpk}X-e5_|k5hPYRLo+A z!VAiNg4i&Mb1z73J8FpjdGPSGC>%<~1_s7F>-!;%9Z_}VM!?7c##|bYs*>ofpCuY0 zwV;A2W|uQN7Wh;ZRa8>09tXt3OLjnSbuq^&az!Wun;v0Z#n`6KUuHrSbs(~5{3SU3 zRZlZIDV>G^qHRVELpK|bsv7y#Q@f(8?9eehc$jmk6`OQF_Sn_E`{Y>$zBz&@cJk ziMTNrpO7=Er_fX8i-{D|8!o*FHyIC}#l>kh0U#eKE!`rT1myXD=2O}f{0shwEYxgD z8>md;Ua60upgeATfNXxdD10o%9G8+DUG0Lo35A3FqhZ);hXTy_ZCiF+J4UCc<+`V; z4EL58E~F3VuK=#jRrZB<82;O#n0VsACsjeM8}NI3=Z-9>bv@Jk%xxgGo_ChCI_(2| z?>l_ggLJ+OZJW`}6%|uYVNYH_h2;Hqq9^zMQ4TMTu3?-oXoh*dx2b1DRh*4o=yI)``@U+k>YmTSqG#F(5rLfaZ$&VGSn9eK8vBwX^}4P%xNK;( z$ajL3S6He71NVUg<5Y*AnbT{zu&gYcMyuI);w~Kn-f?dQq-$~q^CeOd!|KSwaqVCf zd(FS;NCQlmUw~ZuH;GTUY8K9|TMEYd(IGa%RaYTy*4dPIH*OTPhpP@0YhkQC_e7?Q z-Hq*V#{ii`5l%c3T{vtuMgi3V%T8yVdNiPCPSJbc)9XII(Sxa55e}6jMm^5L*>*b< zkyKdFr%xu4*;4X_i`hSZ*tG=ypjkye@#&Ph)i+$1kk$&uH(Yy`Z3EJSgmrbd(^i{- z&)nvD3>-NRL&;FRx&mUq$S%H;GBO^K?#VTokor2ezCP*J^P1uilQ< zx^A0Ft&w>3Deirmjq?SIU#NhGh5hH+k@Nx!2dAK}&VIsi=jn4Flr4g;@j5|3LG>!) z#kYBkDXQ8_61KwZ8~cIN@q1_%C7f7h*{vYUFt*h zbdn|)2`F&K%;ngCkTElFk0dfmV%{7mXt``x;{Ei4xgi*P4L&&Y=hgXNsj_!w%z8G3 zzD5JkW*vmW%Cc7CX*hyNBH;YG<*$sc?gp+`4mEPR8`y5|H~ih-0if*JvfYn^bk}=y zei^_S+Q!wvI^c<bcMUt^jc{$9ZDmLGcihWw*Sc8`K38VFBhy) za>u~HAnqVEqzZn5; zRqS89R}?%RGOb~}h8~r0I^Ok=-_f$hc~&ApDbkh{(7V6Ih(@WYn#WLp%}K8-atk|b z5?=GbL6&LLF4o)iTSCCFqAZpcVUaCP%evr8g}{ssE2{tvQgUyvB`PT)6_N-N=_Jd! zGv{i%ixp#_Z{zZG$_^;3tFi2Os`HnsV)8olY!PDYk&~4e2XDf!4zSw_(sRS&eeOh} zErwo(zF{|idWs_pt{raZ>2eRJ!WWw|ojY6WvL+XyG9(X#$>~_Sh3C}+m4~<)I)}T! zXu;)oSA{@9SnW0@q5v;Sqh31PD|Z43=8|^oEqjD99ON!%$iQHM3)w{2!aAJ7a-8h@ zd$DJ|$<6$Esbo4g`6kPf9#Dcme>1P$*95i+hYg)|IOTwr+5OpzsTru8uL?+kq!QiG zc^&JFqpU&Zz7N~oU!`=Ffzq&zRx974n_8?qq@}in_ivlb&^M^zZP4{`q5k*UsJUFq!G50%E>9 zjj}bk9i6r}?i?pp&TG@_$$+OfjpsGwKZHk29BiRflY!PRLV!Uca~kqrNUD$?F*>q# zyn4&N?|!N2KYuFZ)6@}Ia$!E-^pK-NJLsR0!B;Wn!*oves@*DJPcFRY?-*z)hxW-4g(zTHpiZ7`A_~SY_h+4t+fkUh=qf7V!l8@@mS9{FL!xGU zv&`a&q_ea1Ddce55JC(E?q;f&rSZ3JS=fYFIp-HMa?f0+Os}|?qeyZ82EeNChRv(_ zBuFquR!Z11$}}5dkDIU={yN${wV4JX#~`yiLtb>dg(JWlTPIn!spJ2N*z10YKaZ~v zNhE=Wh6ajL4TRy+U=J%nHIH3JV1lV=mp?}U<#GIU%0D91W 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 literal 0 HcmV?d00001 diff --git a/_images/sphx_glr_example_03_posthoc_thumb.png b/_images/sphx_glr_example_03_posthoc_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/_images/sphx_glr_example_04_simulating_data_thumb.png b/_images/sphx_glr_example_04_simulating_data_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5fed589d17fe6ee62d6a9788519dba471fbd65 GIT binary patch literal 26794 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 literal 0 HcmV?d00001 diff --git a/_images/sphx_glr_example_05_misc_stats_001.png b/_images/sphx_glr_example_05_misc_stats_001.png new file mode 100644 index 0000000000000000000000000000000000000000..f39f7f620310740bdb4629bd49f4476ea8fc5eb5 GIT binary patch literal 21778 zcmeIacU09|wk*66a{`Z|AgHK-3IZZYkYqvu36epAf+8S6vLH#!iYQr#N#s#qG?I-IsXOOZcqd%?`o*386!)&8utjftfN zKaVgE|87=eTiXjZqP)E3zkY$o()t|lN2xc3+S9(%9|aJ+G7|d2#hp9<#D;+nKOaNoeaXxmuk<$qB(j$5wRPAAHq2d2xhB zyt70k+}F2~Yp^ZUrp}X38pENSy8Ph62J*$%z5^5*@(rd1OUeIB>7~dg&Fho}`1E4$ zLVEJwfUWN2)6{3?p-`$7)-=F^fFikI*&VPG#?RlM9u$bfXv%R6>mom(R zLX65En%9ZGj*{`^F#Q}UlT{ikq;45rX0&4BeQ9Z`S<|^Y(sws55-V=Vw4`&8p>VoW z7D)M|xlE5m2rKQN+ICfJZ9Kc+T-wNp?b&nZxc2WqX`h>~b8ogI#L~7}O(RYrOf+6A zHJT^y$HB57{urIoFS!mW4_&8BR&5kGCLba+x+PbQd&iEWT3TANa&jup&UxDDrcuRP z+;kQ#TGX!naRqN)g!lHNJu}1QflU^HWk!{+uB|9Fa~sSb=fs*EX2GzP>76BjsUK?;_54JS4+Zkp-rqry(A>@p@MCh_`(1=iNq z3UzbMmj?Z9XJ~!X&)2G39HLxZMYB-KeLc6frc+5}TvhCeL+15q%N&@b(m6RfmDSY) zusZ8`^%A`{?U(g=o|;;nf5`!J+TQN5=!@R-t)8ivOU!FbrZSC6XXnE$@ ziPn2++JlGa#3MKDx9>`En@zANoVAzn;gjBe)T`=zN`7>$-X(c_z0yQ$i|fQAQHO!V zsw&mHoA#@x_*YW-AY-~H(*^l7yYhGSiA}3BQa2RYp z`*8JMgEu!LY;xps7e_h{cgP+;zI#}u3A3WZ$H!Oy%&1n@O;g2!(y*d#mqW0r>X83hP7*-6wdZrZsi^9Nl3|< z2~nebJ4&HZI-OEDm$P^!V??;?l+5cJbQ(rR(E&WV@ufVuiH)5eH%z}gJuT`y@wC~E zIve4b>o8b@(NrgB@CsTqYWk#|e!W@+=g35|V zhwPf{YE9Zp{KS8Jsk9c~tHsaK zE_^$9_RJaM<~+x(DdVc@$vSZl#V?guWcFq>Sf~W@=#Josbw4lVS&{QJS1jd#q36_C zf5MK37Z2L?)>J>>GZb(dF%ENRc61tVa=5a<#7bVcS{aXf&g=Jhp8OEO;o2G1E zhjXmq>RP~4IP){2lY^UEzP}-}_BI1o7G=weI3~)TBD02!vSWJ@G=%Hw>Z0amrdz0E znd2A5irTG%f(6e9Z*iOXB$*!(@nWQ>y7buI?(S}y-gocb?KwMJ_x{5N0iO>zxHFaO zcWa(v3+n4LqoyGcGRbtrCnPV|E=nzzIL{Wu#BVeavq{wU9m~E8tg-!ANBQH&J>Qp< zEPo(zzGnCK_aA}V;2{1I<_}Z&na%#&YeFL zTb`c2B6IB69)v0(y_8zX*`eYs!ag6c-gnD8hZXg6?USrT!=e%0Y5L_FV%QO$?y{wx zdbxm_<}=Iv{zKS);fUEE-(KHk8?HHNIT_*@5Rh`I1g%^3)22ejMqp#LM-imIsIy zo;g{QqOU)2w#B}|{6NaB=b=66i@ts+7G|X^FsplhL?!z8uF+0kMTw!zOUM*$qfUaR zRXcHFOC-g4coY=HM^)3SYabt3Vb@=;7Va_@guuUH&)}dNHTQdKtDtcOD^(z~At}eM zcQJRTj~vg5T>Ji!w;S|B?ZZgW%&=@pUb4k`PuIZy4f@W{rp5ZJ&u(!)}W ze&8=(sB=FgC}>x1Q?g~jWRawK`9pE1&M=3nJjY?>ltLL9nW2^wagWnOOV%oiJ<7`3 zM;%1){}g-T2{P&3^PEO|qVV;SUJ!8C+Izu(2(aw-F7CS4&WTk%la2jLgSSfBol=i()=rh3ayx*4Z=WueklR70s4V zqP}gjrO@DbFw+Z^C|fTH#z9(K){Cf{ZFxX@GlC1*@d6G5I(M0c6@1cMXPuI?Ql*6( zFC3}}d2(&Vh8|wG$vf(anvZ6u#}i^>-$|B#yAW#cqVF>5&t}qEbT?}8)zDCuNoR@K zkxIp$&rx^WoRGAxG*{L4+ebx4;wcZ!nQ&<&`|(K!>R8K2(Z`l(m;AP2Lkzvs)0vc)@)9R2 z9^fRH|C|?fwSxGiF;)D09Wyg?nrD0t&8tU;Zj1yL&afL#1zD#qp*-D)6nxFk`Bf0c zD!?lwq>h!T&KL->$dOsgal9hLvY?xe)iQ7BdSvUjw!_q!PD#OwKTcK0tI6R_)O&$jNu>FhRUf1mChT-o=tI3*@|`W?BJt=%DE+3vCmb5s^Csqec(u?8E)w#8*! z#;2z`A;zk;sN4JK=3Rm}Rcr7l2#N`>wO}__B&|n zm0qS@(l$Klaqt~B6WgqVWME?EnW^`((Sd2c3&zLa$M22x>lD;X(G!;sm(bBt5(M_mRhgQTdsG!tI~1B0qWEq<=j1@x!07L)bVaeI2^y-$QA0y*!f{JAhuJGMoI zpT;Jg+c&Ewwh4q6QfCLX(~P}cC)+oy+AOxOYh5(=$&6U@hKvK>3<2)8wp`CVUz_aX zWvOA;g{_NsNIUh?BLeB(fg31et};hK^|}6j+b-7bi%*Sf5`%;=bEZn1*>Wl}m*V z7?p6hIY*_~`ut0o*zPgOy1ASZ5)#K57TjD&mh*F=n_IRHPg$slisbBwubb29(~n%K z(=CBh4}8x5hLEvo&#a=`lrIi}dh#f>oH}z4@CfOHZk!D^8CwqY2noQ=UANiMIc7?z88*_KcEXbY z-(se^EUPC*A47K`M&i$>W6l{F#Xo(jw04KW%8SF3K#u2Y6150)+H=a?%}Hx|8c8?K zr=cWZTrkVLL1^~JYq|rKa(c`=^g|1*TBXe!vz~pnd#HenPgW9z!cn}ykYagRSvBJ0 zRz%S?+oczZ8BynE>+#lOgDv{~qhasbtxbM>eF<2SpyxVymTGJ0$)OOsGrT+o@NbD& z2k;*GZ8x*cl&|Y{Q)sYA&LwvY6~!!PCp*JyZ?4%slG`$?Alzi@i)oUW`EiI~U2bmf zu4e=+Z=p^cm47Ivg`u1n?kG#QZkKhT&W@M7d$+ST=*RtoT?kyNSpTV!?kB?^_bd9O z85XbR)_Q&zvB%#jb*i>-POZg_n*Y$LXP3*&P;t)4XSuVUpA;o$Bg-YGk6#+=JJDaC zo{$#+$P9#V4F4*sHT1df6+g*rc9L^+bew8vnOnanqUj2qMC?6@sbeI737LI~kZ_qY z2BvnJ?$1=y)QqjwcN3481+J<}Gf^pfD1H)v=MDkWBzeruOy=~&CyXHRYfMb~lu$S7 zAn7k&%@W%(JK!KXm^bVf92}2x-;+PytYT)CNDaRK8%~gaq{>4HHHJR>T%!*U9u>Gu z$Db>IxN+~9n>sv!9c3Xg_?7PWJHl6Hl?JkrFo0Bj!rtD#V#vurvknzbMcTP=7j;17 zgbVp9F$&cli&oeoarWHdEl^5OPf9!U{x@#j990s2jf{+>rU8kykw9+k-MiOg@wZS> zyLf84_Rpl|syLO|M}k~ja>&qD*Um4xaD92pCU=@p8QCHlk*4zZ%`W4*h-l|pZAIm+ zt)Bx~?FH-)kx^8n+qmQnqhSGRfXW!fEh-4`$ehQq^~w;54sKr3cKFVE?w_@S2)@b< z6V4LDfc_zff?tFOZIP%}!%5DLkz|u7H zhMF^H&j#@p&g_jyQsCn_tW}QMf)9%oYf>3~7uc$(-#!FT`$6&MOS?~ndi|_X4)76O z&9d**^XJcxW55J{$p!Ls;IQ$I^4*}@A~gTUC`YaKu|#7y9oS|9asj({rOzUk$YcES z1_qDgP%?E_#@w3(%vKOteavJ!w{0{iD2Pdbx2pCl#$&MAb>eho(n(?8&`>i}$R;?O zOxVd<&kT-KSeH7L1-7eBi>>2QPuw#*HOg<1*}%re_JBt>=K+bTQ5oEhbF!C`6&zM- zy#2xi*t8emfA6kcyNbSDcz{~>!7i2P2YGpU5gF{$>1mzOZH&8nW71kH7>j6VwuO~F zFr71AvX#GRr?4=oz5+Z8R;b1x7aa2e=Gt5%N=f))mZ2=!ezcmI&)}-wrG7!|r!s2h zVyU*T>k|2op`gN17Tc`&BJ2!>;(Z#`@f_WKRM16lzo;dicp|;EiF@^npu3<~q!`|P z{J44|Uvx>U*vTfq#JOkEk<{i_8>P;CBQN#-l!`O0hw%#(!^o!2Vzd$3^kNi>lnLXK ze@0e?o|+!(2W3FB{ivKW!lm4%@M09f$+-i{PEI*E5~%2@Q-Qj<_9nmssMa1KvoN;A zEC=auSSX~7suFafYmLbDRm|(3w#Z2zUqY`1MvQHC{BCBMkqU5-nvRZ+X)bcbWJ9`1 zWzl!eaxprwAMOMx*>zPM03K0B8l~1m5U?03Vq^QBJ+SN3(JiZT1*4WT;Lzft5vcE)?c?L)hcX<8!1UeytyArR`UjJ% z`|SzmgE9yli(YnyO=Yw^c~!MSR~NiV7igPW;P&?6$&z#y8G_0P6GTcnyPm2~Y8tvx z{#+W1)A@_KE-%@vgej|zI6(WhxR@008+2{G^;|~P7}l>3xYXpI)NPxmmokt)t``*( zQ`&9IDK0MFrJlv^wOKqK&(MtxO^WfENBjMlm3Ql8DFK*j;Gl#m#C#O#WLd?sPYF4F zm9YZ~)?FAge#|?bLD_fZstu$4!k-t#q?>DE{mtc;w?=AXm!HCi{AGCThsVU(KN--lir z$nLkxuu!5mU%grI7?*{N%5<&&dy+ux7$)|Ri^utCGA zNg}-5lZn6R_e#^D(dvd{*P|OBP*uqTUzho?%N>jtMA;S@6LTZae1~?SYra)(69*5^ z$CaBztHdV0UWrDOl=fi~ce2e67_CxKWRi(SZt6ghENEEd$%jC+k7YHgHV^j=WI)FYU1vSn zDjywMVl(mMoBJ4hu@{@~!-p0`Z46TJtahe_ zdGp2AyUJVmf0eXt{WKRkSlvSpEM;99<0DK5D7qIhMh76|fH|3AeB(npIINmQ_n&_; z6Y}-;UL!Eu8SchYYt3njq$TasjoJa+<**|4`yF1-G9!Nc$#O?6vI5>`=8#^eVo;X& z1_hb01qJb+Q+H}A7atGxK0^?iimK{5fx@Rx_e5%Qt(8KV#jx)Aisj3X1DSZT@w?5< zfEuh+lw`_nvH(wc76G~~d=4Qv1U%IPq_-vJ<jAoQkX5a;fi`dv|trb_YNp|B}@#dx{t?mTq@%l8WTPr%ksWUO&XOPjF_R`)g z@8nM@n2OKtdVJ?N0zRqYk)?(3JyWFyd=*TFVcTC{4T#@@^(SjZI6{)LBF5M)uV$Jz z7?FsAqs&aQBiU?i?|n;0yRA-~@D4(THEGVvCiw@vUk9Dr#Fe_|XXWBvZr#59b?8Kt zl??X|>KP-WsfLF$zF}dTtX&?F^zVHJ(SMylN?TAX^%_Chag!6g&M(H9hII| zPd@zV1CrIhLDq+T}D3L&$RmRfX@jV2XT{tpLolbf_Z$7 zXtE=+n2vGJ3pe?rNGVk9t2DHWjo;i{GuN&IkU8g=e`!2mq-8~Hg2B@wRO#`U-X5Ug ziacx@SsyHcZGHQ0{Q{lI$;q6VpQTrL0u({JBWO_hG|VA(;i+42|XOi&mY6~bEUTwOb_fg|MK(z2`3=a zqufx>ICTV_8+o;YccJby4QtMx-$dP6ku%kRCIoCcj#HVt3GBqVshk*UJ)0Rg7lUZV zM3M_xl6*YYoISb+1b^erqqiQq9&6M2(I--lH(wQu*E~UDt>-ptch<8$?dc;dG8R+LXtkwQyiKz65=Yv`ga_gn+z#_wK6T791Oy z<=qA&K0@sGcA0A-JrS0}ZXml;-MEQ;!-0l=dtI#R6fpSgFrb3K=~oNIr~6W4lG67o zq=yNG$a8C_Rh0O1*^P9asE$3+npTR33s6>3xzZ6fkj?8T--rFF?>ZSp3T>27v5Mgm z?RBA?N!@Mjp%V{OxDyhEVpM)Q9g~&)40msS)@4-!JSNL7I{AX?E)6rjE3=wMBpe z2bUCB+Wr|h{6vov_V)?5iTjZVt#NMDxstN7RTouG2A~wt^%?nMcyEz&PQ%mFukRPq z#CZaZDl-e2DIvXbrHA@h-fXmRh#S`B(U8iG*HJ%GlkYI7C-XVYq_WLAdt|g$p9`Sz z&IVp}oN@v4dVze@O=PCxr$iFEtfP+yJqGsd!edr}tc#r&TAioDO!YU#)-HyZ76;^rz%Ws!OhV4KC(Ki;imedi>4 zD&x(U6wyn&Z#yI6hEQP(is3vu967UN4P5CDKNnbSlyuFbj=ej#z|hlKA{>Q56rJP@ zDb=ffwwI1#YfZN_9?kWsy;9y;DLFSpXV>@TgiqBo!=tF{E}^}2Em|==nKa}SV)#R& z7Q`BWiHIVxkf1kGa3UEep|obPT~&Mwy_cPap7sNcahPkrx&dsQIjUlakUWxFVNY#J z3WCPLyBh_S4<7Vj>n0Q;a=M(Zv`KhLfOD&I%>?@nAhFxGZtb$`yXoiWS1HjfyJ7>+ zN+$_^etyAIFDTSurJ9%uc0)nG(OqM=N^%o#C+4 zcYH^>U5=fAY1O+e60&SNb|m0zP61A!hjRVC;@ySxOaSI3`1#I!g!`P)nvO5~6dSsVKoo%%4?)~>jzx^KL-*VgXBPXt?6)uN95z8=M$_vb zNvO&OCoa;2I;(d`In_u$Dk{nZJu*%np4B<)TWvds!nJ74oO}~0|5G<7zCTyjXxN4Noes7ntx^oAH z3+ATIV^w!XcFIi+X830${uCSk?4~HZyLU0&qxkq>?F_RxJh5^2=O~&MZCPbKy@#ZG zif_dpxwD=jIsIg&1!;XD!qN^Tt3PhDLx0zIc?#`|pj(s$5y$Owb+XEh> zYovl+Fi0DLo-0Du%hYF>hfr%$(f%bblG);#fR5-?1B=*2B><#^=jJ=hxHB8K$vA)4jj1bHie`YhY3&Dp$gJ;yxvARZ<7cHWNyUzp2h}w4DM-8Fb zE&MI!bG#ZC=`XHWzqGTG-}$M@g3rvrij+k3~cok4#!2FXCi- zYg1}_Qwoz2YRr1@+({L2Acd_PbV6d)n13dR4C(G7p)g)xsW%fk zd-iNMN|O1h4?Ldv{YwS#i_ z){j*OJbd}+x4!Crb9w2ZN6L%0iCI#MclH$F=rl&rqlgGODxhM8m&vYfmAnU zHkhO7wB_d%qV`!*QW~b#eXy(5JvYyopmwA7K2E#5xiohGoxzZ{wlmw`>$r?ocL3q= zlg66&na`D#WtjX!;AT9p7NDilYM*=e^|w7paQr9>B1EV&!*|(y{rwrL3eHsIejaN_ z3kxGhoftAda&)^$k1;DND`HJG=|(W421w5OzMK?m^OJ@66ojCLqOI%GYZf$H4>qWN z3ig~FJU`uL*on1>Mv6fz5Fn`x8V9pvH2t@~Co&FW_k)IBTPnc?aq#n33K&NNtUjY##Da2RgI-sQdY>tgNCj&}aw=jF78no+NBox9&mAL#L87 z(5RA+Cy{#2Tie*kxm?lmr-?*&Nemk+8Vz*9A_39{NzQzuGXg2QW`h)38)fK^SptNf zL#;0(E4%l~;#HhB3rAFv+<-fcfa5vX+25knsYJ(*A1!6yz(9>hb}5Z>AzB%Zg<9FO z!c;^1zAvYxJsD2}Jjv_mgo<>A+I#>~Ga2ivTl-T;gTtNC#`*9FdX!{(Nm+!P@`3c_ zOy7yBQTU4H=`X^_actfCGONj=GDTl<7!h;{i92E0czk)FZ1nT&Jew?pLG^N=T*?DP z@!!0uV4EP5iamJ|EKbm}wHyy@K8h3p9!aTJpG~cW!^t-9JW=Zep)Zi)WjK=GH%C^(5151WFc2zT^q;RNN zMC|!$w%72zdV2@MF23gE#D`_^X4&kui&Wnl|GX)N3a|!o8ahrluYb^k)w)x*P7Hrt z&AD^z{Tex=B_&TRb5$9pJq-*wB@Bcv2t95&AYjOHpMPnqJN}%teoX=qoBdLk>Ci5? zdTKI&cFx8sS6FemgNW3diT2DVbLXW##+}^W*iKn<#dXOiPYQnPRl|9|)-siNE#lTbch<5ZCvOhjMeF+vN8he~f4-Fn#`UGz;3@m)~}=ep3{CX*lviAnoCmWUUq~ zrT56zr#@z}e5kBDWV=vGB(bG^sPNV{cgmwDn6p;&LGbZ!>F#jGuST3t&6(;ycDbj< z_G<1r*2e;gVG)Mc-pby*v&vzY)Zs^Xi&Q4V<5_oJSm~u`SY)0=%Hav*!i?iX%}eDe z`TT2{{tyA870tTv(A+pzzhr2NQ+lY=`Qw@7i98+DXXBqNIuifw>3OA2>2EwsZZeMS zzi9+IWMRYDmJ?pWirJ1wu>WrEyy3Ner*O)#MMDJ_0v8-!N2WsIB~cpwTl&M-Qdgyx z4h&R&mJH^1udp)@j`T1HXL;t_yvT3K?CQrsWsHWebQgLJJLRLt1-xpVt%Jeg-D0hs z+5Tofe|vL~b>XFaM@}K>XF?%9x-Gmx!6sAQq%{ab5)Nl)GGUmN$&=W(k$hVb7MQx+L{@_pl3Q0$nm2mPC)*ye1V zt0bY$QlgUDo5jy zulrJJxiTBjK-(U8XU!Ev5_*?^a@v!ZFFd%%s#(<0i{V|^*NV#8bh`QA^8JQ*2^Xh& zp168oSjcZ=+71+6F_xy#9DI7JRj>WxuwTz@I&wnlT)*D59=`3zsOUgDznPd~PLa^{ zZ%JTJpV^6BV{gn_{^?-$`8U_diAhqP44AZkmvKQk$XBk z8d;^}J>yxn$o$!Rzdq6>wUj3;L+Mifq^!M&Ahn=*e%({J86UG) z$r64+5_nd=Q>Z9``BEcs&UqdY`10PPEdgu6#rr%lIep@5k(BdJiVK z3{Hf}TSN9|N6prgZThUI^9twApYKoKJJC5J`fE)|h~*D3Q$dK0OTH+&Ac94Ga9@|( z+9TM}M={++q$~DsDzzDJ(l34KxJp+xVN*(Euonr~ep9y;s;%q&zux>$(}-4z%M;q8 z%l%XW&K%%q+);GxjhS6zu{}mW%OF) zbX`0`yEV(Ke%tSnrdGpu>S`_vt3lqgnRC=@Xbe-9&I#w{@0_dk#eUO`#CWFJHS;uO7VL=bN7;eh(_d_ zi~DI7?p*RG$KZcxLpZ4PnkhkBA=h-D;rtHyZeZBLPE@kN) zb!xZIZ6CS_DiR~c`YE+f93%dZUvcLzriM#dD=6DuZjosIBWjy`Rx_WUto771#mOTQ zBK>?l)$y*sLJ$bptrMrpc=GdqZg6>Oq(S0qiQ*;e(OHFiuJyjme~ExdHh8=LCf*^i zS-}LNM36LbkatC)WaW~S)Q1EKb+r=st7;Uq(CJ;xJx-Cj%8Fl?O*j6uO&k@f6H!zS zPoBwaKzjmTtba&8~V?Q->Or8bFD0}GF0 z^zlt7WCSc4_vM2&o2%F=bL7a8IU)7~k!{q$LTbU>Xo{N&Iy+7f?}GtklQH#CRdGD> z_I75mcHvg3g#^a_6O6fUMUr;9EMy6l;7~}fe4x0vs3;yP)u}dLMIs_Ijism1cV{i# zM1gW^q6^ySYp-vxF>Kh-`}O4&D0?cvpT}n%q(}*nN4EX?f(G4MMKntoR&QZPrRg6S z7y}xw8~SNA)vXj(ZL*(G>Ev>bmKDF3Em)Qfaw6f3BgMVzCCQ?5o!6+w`W6K}J48p_ zT6svO@h8f&j*np{+e^85cxsmP(iwm6E3YmvKi|}tZsngsdsF={Aa~k&*uS-Gg#**g z3zGfsS2-+;a_VTWWeESAR#Gs#&-;nRA(v+cNx%6rUvrs08O3(pZua-EwML5aVw=W{ zBXaRh-6=a+CM(@^ZrAWgs&1YdHTUBA^rY?U8e;S|)r`_oyjnN@Y31>+^R*R@-toNn zyIu_IxL&To9;AOM5mLd`$i7hIDb?Lc|MSVB2c}vD`3kgk2K~X4nT2tNrPr&UuV&r& ziNLPocB7)e>%UMJi64|u_T<7jCzl^Dm%#rJ|MM)mAEOX@L20Dm&&y1q4*l6)*>nQH;4pV5{Q*|J!BF(lhU*g59w?oWHI&;tk#oK1%SCF#K(JQX7;M)Dr|cD#Vr10<%vc93(n2Qls|}$ zp0OLeSfBq=JDNU26AAR^PF~&=<*jTO0_aWcyo=8Y#FbB?R+0701Eu@P9-RfU=;tcU=K#AK^#BAwjJHw;?Xs3xVdI-et zag~lD6@=w-r+`%;T`CA>%>b+aHhHiL4j8D2$pwp|+(~JWndp*gX z@*?Qo<)t)~C~STu%pd5ECud6oNT&zPj4#;vc3aVEG^)rTi6TQ;S^1SN4~6w0+4(Vk zK0c3enoXfCMIA<=U-Wko{Vzf9kIb>>w<)Hp-WBCK|EeS!7pFORgrH|j%2jvCIjOhw zqVBgzW%>8TYs+2Qtq)QSQ2VWmyZ$;kBv)u2$!U%!99{HQLd3wZs=#~yubK(P{?|!f z;a&4kPHYp6(rT`ZO@9-sMX>%N|{JlR?fYCX!Rve(|uhQ z?mr3U_$P6T@-J%Rcq!I};~#XBTD;c9TFBpcm>XwEQbSQ;ZGX+PR|f2F-u9G?nfwiK zIE+(M10wCboYNy zYxv7cEzOzzCii#9<%8z)YPYTC>g7hi9u0K{Ch8xkqW{t8udcrOwfxHd*!fWhZQ6OS zpkG;S9-+(^Pk&w$&POL?a?YcP#J~9~#a>v2)Yg7-^+fsG{${aV^OZqhi`P^NjYy2e z-M`^vmRY6{x&m0*MKDfregR{8ZT#k;O73$fp?RQ6cF2FSHh)ya&;A7gV~Ioij|9xK z8@UwL-)7qHg#R(3BK;c9`C=U$+B^lv{A8fa_ZJnm6ctp5>+ButJV#l(x0P!s?N40; zi>Vy9amKv^HX~dFNXD8TX}>UqbO^x;VnM=DSttWhf@{# zC(O^Cip%sXCtFg|s22))s;zsH_?qUQs99??;g1k}+hNoPAR^|s2aBk7 zL}T7IhBtpLYyWk;``2ibM2xIlMLDYRN6Nw4bQ7O>Lht9lSt9g}cEo*Qd|PiOYyb8J zLHqxuX0R2JiY4)_Yn3~_&VHA;-xsboLB?f%20C2x5B)Ve{o1(yWFA50{GVx{i2E`@&Czbb1lEMHIWF<#qO^~}S7 zeV;*f;i1>__3>R1Jq8BmIzw|)-;#9m-=Cgr+lO-(pZs;({s@HP@1rs2_L zv7;;6lhEr!z>q6Qd~e~ z@`pRY^JOdv%R?mCKAC(g8mb?OPxG1W+FJ=!)vB6(EB-=0qo~KnzelFAfrVCFC8p?j zP2z2_cirWmS!wdmZ#zqmF`gtf*Yf`b^ZUk>y!9_;opdn%5s4Vy6IT44URBoloeTa8 z)_^Cjt@@(f?^Nhne<>i$cQ>FadZ-%!ATAu03IQ`tnBXK4Q;GL32Z(gW({(JP}Dt4b9Y*{LeE`M&cVdFDz4hRGIA8|I2qRfDC!z#$?DQ1MlPqe~jm=D(tLhQ|n&oN*~?^8893V ztTLi##=g>7h94`Og*+6Fde9>`k1f2!?bg{}gwO36 zD-XKkV$)&J5?c2~@*IysVf;RxgQU0f3--}Ni3^?tns;l_FvOu9r~mlfu`=?fMuyZ- zypsPpe)e%!(hPDpErKrhw=cU23qiJ+)~Ch6^jZxs3`|IEe*GJ`wIhi(6EaP_SS2j| zEL9!)@GX24AJ-8HQwW2ug&3$45@upGs;AGPWIRxO6WuI5Jv}=MX;seh0vLHREuff# z$VVGuB}mYm;FVn#Hv9#m3JRIdj07u@C+*%Q5PUgd|kNH+>N7~BWLl9#y z%5)^86#P^?S>T-QeFh4fi}l5p^Hy^VVs&t!xA$piQXX<9j`gYNPIp44NyPr}TGvXN zgR$d)dfNHt`yFcPZUPDK3Sjr(5EQIF9wu5X$<51K4ow1aDow{&_4$=UwQCIh8}ptd zsB=5M-PppDJ`1;)F>3y`dtei{;K#ulrn=(6g28t!N`tE*Wq!xS_M{%Q>kEe#gDJB? zw>|x#c}cFNf@)36F0Zio6Pu>5w|0z7EPk^M-pfGvB_Y6=g>j;n16D!s3TjT1SdD1n zWrY&4dv1D=Zpv>%jJodhIWP{Ka2_&f=zI&WfmoZ!WYwOxlrP2(CRar$C@8!b90>+b z<1}m|2@qM5ostImX?%z=;$8EMr+^PTAOa)uT9*X{@Md|kvU_E3JPBEN04ya>*HbwI8nH`xsyH!v21C_!p2}p zf^j)ZeWoREN^Jt1V+!Iwz6?rcwd%C$DwewE)i;RhJ*;x zj74SqMSi0BV$hBCQ>lsFRb$a751B6G%x%c-- zP^c7-d6XvU=;Ro9>$%$KTz5@U2o|s-yakLf)H^c7xciXYzQH-2sI)1?hOB#a`S#+n z?ln@J-7q_e_Uqc?Yc+3&BRJKb@H zMfhdb;>dYBH3ky;a|hxa%s7F#+5<7O->nb6_qL&n@iTY3rbc_=lVto+)N95tFiYHm z(8DhZ{hSIFH?e}AbD_k2bWyR^uD(@%3C}^~^(CEQ80G34hoDhkEh^p*i4gCwNI#xU zX`0wKAyqx0qtm#nA+*2vs3RF|5T7(Grr#KM-MHNsqI988RnM+J#Mi3PZ`;ZZ1>xx! z#5v;GN_C#JCjTl6TrSy^3Dz!5Gil064}z$eIu6qP0l4fCSODK0+Y7O~AR>kkE&vfK zVoZe^mWZB)%Y<7Vz~>M|ehH%KBHO+%pVl!jXyv$gCyS2V<16xndxA(_orm6T=zyDD zkf_$Ozk00rBH6Cw?E>kRDg!IV?+QG!ff#Z1l0iyA(J9p;ICzFUM zA0W<`M*=B>3jQu%k=V?S*G5Qjb7Rm$3BtucFW!@!`EkW@v|58muCPZPX3TLTh^c|0 zAyJl99aPygeGc;24x|gdlNn}wSzC*Gwn^t zcBxLIrsN-4FdIB}2$>q>yy;GxKGnNDUxZnNV~$duRS-QDjyADH${ar~0PU3^7~qw# zZQ*i_QtEV~R;p)YL^y9&fgM58-$(wz-_iy zzdE1kL_+*{IhlLNQpwBV!G(!rR4cMd>lz(qiZYGlIAaxeP*_^qlUSKNV7ILM9atsaS@fMVuugu_9fk$%V zetWZuy!``NhtSoAUGZtbQ{NBpAkS;e{nb z1L6@PnCrLSeyf6f8`eS_no>r%S;@sd#QTgpqh#U7AeMQO!)i=Y>xk7FlGt?k`ia~X zkvtl%ie6l6G?KZ0Xk8+r3laU3P6I5afOxt+0y4zBL>%BaMe{Zwc*fBg=+YnPt4oEK z#@q!4BT>9N2>ww-sT(s{M2d_Ep@uFR%wduUTKi8;!{;A|T>T!7OI(FRcDLI@#7f+z zgDklldSzm(0T2>zA6`URiY}x(|C>Klgw#R)a~~nUeBx10G|#m-P!K%wnxI1$yyvtB z1{Muzwu}$X1^jc7ZZoZ0rVu%Z4+Q&MW~x|nZq3usMJv`D!#b_~^wecy_$5YlC>41e znxMtr2${dc#8+B$@RpQ?V;zw0l7JV_1AAdv^x`UIA6|))3pB-!m>S3(w0*rwI2Ppt z>20_Jf{H@y2*cx;?GQPQO% z-iXN7N92kob>x4Exd}tkek4f_cEJ$@Q2%KWTKCjo8p>5Q+|<}c(h zM1EL45w<5|$n^t8xc}fRk0Hze@QVkE4n_s)?e)Piy5z}Mbmq*N2Y~9ul2jYKA&h98`Y<3M8r6}k&)7gy0t{nu za63iSWS}LtNy2&GDMue?vQ;sagVPe*cEz4p&k#t*AZ;ZaRLhKi6o zHVh0nT}@6S`=IHai0_j-7pmv7*0OVOkUQ_Dfcx!W1z%V;SQY0Be2dD>iE6i90?KffI@3TF%`;jqXNOEUtBM1Nzp z3i_@+&H2+NhYlav;_w*vnZZcejr5#4P)Kzp=K|-*$9BdxiQE!(PweMS?7Aq_^~7jH ztRD#XQ5j5>k3vE!)(hqZx~lxR4*^N|zmN_jC;z>2_AgZGe~ZTbpYZno{-vEkR62c+ WjqzVDhCU)AmN}wuIQifykN*#x-k`+* literal 0 HcmV?d00001 diff --git a/_images/sphx_glr_example_05_misc_stats_thumb.png b/_images/sphx_glr_example_05_misc_stats_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..02f6d68f58e72e2e8cd1d683f07dda4d04b545c5 GIT binary patch literal 15299 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 literal 0 HcmV?d00001 diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..311bd4e --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,136 @@ + + + + + + + Overview: module code — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + +

    + +
    +
    + + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/io.html b/_modules/pymer4/io.html new file mode 100644 index 0000000..53fe97a --- /dev/null +++ b/_modules/pymer4/io.html @@ -0,0 +1,188 @@ + + + + + + + pymer4.io — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.io

    +__all__ = ["save_model", "load_model"]
    +
    +import os
    +from .models import Lmer
    +from rpy2.robjects.packages import importr
    +from joblib import dump, load
    +
    +base = importr("base")
    +
    +
    +
    [docs]def save_model(model, filepath, **kwargs): + """ + Function for saving pymer4 models. All models are saved using joblib.dump files so + filepath extensions should end with .joblib. For Lmer models an additional + filepath.robj file will be created to retain all R objects. + + Args: + model (pymer4.models): an instance of a pymer4 model + filepath (str): full filepath string ending .joblib + kwargs: optional keyword arguments to joblib.dump + """ + + filepath = str(filepath) + if not filepath.endswith(".joblib"): + raise IOError("filepath must end with .joblib") + + rds_file = filepath.replace(".joblib", ".rds") + + # Save the python object + dump(model, filepath, **kwargs) + assert os.path.exists(filepath) + # Now deal with model object in R if needed + if model.model_obj is not None: + base.saveRDS(model.model_obj, rds_file) + assert os.path.exists(rds_file)
    + + +
    [docs]def load_model(filepath): + """ + Function for loading pymer4 models. A file path ending in .joblib should be provided. For Lmer models an additional filepath.robj should be located in the same directory. + + Args: + model (pymer4.models): an instance of a pymer4 model + filepath (str): full filepath string ending with .joblib + """ + + filepath = str(filepath) + if not filepath.endswith(".joblib"): + raise IOError("filepath must end with .joblib") + + rds_file = filepath.replace(".joblib", ".rds") + + # Load python object + model = load(filepath) + + # Now deal with model object in R if needed + if isinstance(model, Lmer): + model.model_obj = base.readRDS(rds_file) + return model
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/models/Lm.html b/_modules/pymer4/models/Lm.html new file mode 100644 index 0000000..4f52671 --- /dev/null +++ b/_modules/pymer4/models/Lm.html @@ -0,0 +1,821 @@ + + + + + + + pymer4.models.Lm — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.models.Lm

    +"""
    +Pymer4 Lm Class
    +===============
    +
    +Main class for linear regression models
    +"""
    +
    +from copy import copy
    +import warnings
    +import numpy as np
    +import pandas as pd
    +from patsy import dmatrices
    +from scipy.stats import t as t_dist
    +from joblib import Parallel, delayed
    +from ..stats import rsquared, rsquared_adj
    +from ..utils import (
    +    _sig_stars,
    +    _chunk_boot_ols_coefs,
    +    _chunk_perm_ols,
    +    _ols,
    +    _perm_find,
    +    _welch_ingredients,
    +    _logregress,
    +)
    +
    +
    +
    [docs]class Lm(object): + + """ + Model class to perform OLS regression. Formula specification works just like in R based on columns of a dataframe. Formulae are parsed by patsy which makes it easy to utilize specifiy columns as factors. This is **different** from Lmer. See patsy for more information on the different use cases. + + Args: + formula (str): Complete lm-style model formula + data (pandas.core.frame.DataFrame): input data + family (string): what distribution family (i.e.) link function to use for the generalized model; default is gaussian (linear model) + + Attributes: + fitted (bool): whether model has been fit + formula (str): model formula + data (pd.DataFrame): model copy of input data + design_matrix (pd.DataFrame): model design matrix determined by patsy + AIC (float): model akaike information criterion + logLike (float): model Log-likelihood + family (string): model family + warnings (list): warnings output from Python + coefs (pd.DataFrame): model summary table of parameters + residuals (numpy.ndarray): model residuals + fits (numpy.ndarray): model fits/predictions + estimator (string): 'OLS' or 'WLS' + se_type (string): how standard errors are computed + sig_type (string): how inference is performed + + """ + + def __init__(self, formula, data, family="gaussian"): + + self.family = family + implemented_fams = ["gaussian", "binomial"] + if self.family not in implemented_fams: + raise NotImplementedError(f"family must be one of: {implemented_fams}") + self.fitted = False + self.formula = formula.replace(" ", "") + self.data = copy(data) + self.AIC = None + self.BIC = None + self.logLike = None + self.rsquared = None + self.rsquared_adj = None + self.warnings = [] + self.residuals = None + self.coefs = None + self.model_obj = None + self.ci_type = None + self.se_type = None + self.sig_type = None + self.ranked_data = False + self.estimator = None + self.design_matrix = None + + def __repr__(self): + out = "{}(fitted={}, formula={}, family={})".format( + self.__class__.__module__, + self.fitted, + self.formula, + self.family, + ) + return out + + def _handle_weights(self, weights): + """Handle weights if provided""" + + if isinstance(weights, str): + if weights not in self.data.columns: + raise ValueError( + "If weights is a string it must be a column that exists in the data" + ) + else: + dv = self.formula.split("~")[0] + weight_groups = self.data.groupby(weights) + weight_vals = 1 / weight_groups[dv].transform(np.var, ddof=1) + else: + weight_vals = weights + weight_groups = None + dv = self.formula.split("~")[0] + + if weights is None: + self.estimator = "OLS" + else: + self.estimator = "WLS" + return weight_vals, weight_groups, dv + + def _organize_results(self, stats, colnames, indexnames): + """Organize estimates into a results dataframe that's ultimately stored in model.coefs""" + + results = np.column_stack(stats) + results = pd.DataFrame(results, index=indexnames, columns=colnames) + numeric_cols = list(filter(lambda col: col != "Sig", colnames)) + results[numeric_cols] = results[numeric_cols].apply( + pd.to_numeric, args=("coerce",) + ) + return results + + def _calc_dof(self, cluster, wls_dof_correction, x, weights, weight_groups, dv): + """Calculate degrees of freedom and any required adjustment for WLS or + cluster correction""" + + if cluster is not None: + # Cluster corrected dof (num clusters - num coef) + # Differs from stats and statsmodels which do num cluster - 1 + # Ref: http://cameron.econ.ucdavis.edu/research/Cameron_Miller_JHR_2015_February.pdf + df = cluster.nunique() - np.linalg.matrix_rank(x) + else: + # Use dof calculation that accounts for square matrices to avoid 0 division error or pval lookup error + df = x.shape[0] - np.linalg.matrix_rank(x) + if isinstance(weights, str) and wls_dof_correction: + if weight_groups.ngroups != 2: + w = "Welch-Satterthwait DOF correction only supported for 2 groups in the data" + warnings.warn(w) + self.warnings.append(w) + else: + welch_ingredients = np.array( + self.data.groupby(weights)[dv] + .apply(_welch_ingredients) + .values.tolist() + ) + df = ( + np.power(welch_ingredients[:, 0].sum(), 2) + / welch_ingredients[:, 1].sum() + ) + return df + + def _calc_ols_pvals(self, df, t): + """Calculate p-vals given dofs and t stats""" + + p = 2 * (1 - t_dist.cdf(np.abs(t), df)) + df = np.array([df] * len(t)) + sig = np.array([_sig_stars(elem) for elem in p]) + return p, df, sig + +
    [docs] def fit( + self, + robust=False, + conf_int="standard", + permute=False, + rank=False, + verbose=False, + n_boot=500, + n_jobs=1, + n_lags=1, + cluster=None, + weights=None, + wls_dof_correction=True, + **kwargs, + ): + """ + Fit a variety of OLS models. By default will fit a model that makes parametric assumptions (under a t-distribution) replicating the output of software like R. 95% confidence intervals (CIs) are also estimated parametrically by default. However, empirical bootstrapping can also be used to compute CIs; this procedure resamples with replacement from the data themselves, not residuals or data generated from fitted parameters and will be used for inference unless permutation tests are requested. Permutation testing will shuffle observations to generate a null distribution of t-statistics to perform inference on each regressor (permuted t-test). + + Alternatively, OLS robust to heteroscedasticity can be fit by computing sandwich standard error estimates (good ref: https://bit.ly/2VRb7jK). This is similar to Stata's robust routine. Of the choices below, 'hc1' or 'hc3' are amongst the more popular. + Robust estimators include: + + - 'hc0': Huber (1967) original sandwich estimator + + - 'hc1': Hinkley (1977) DOF adjustment to 'hc0' to account for small sample sizes (default) + + - 'hc2': different kind of small-sample adjustment of 'hc0' by leverage values in hat matrix + + - 'hc3': MacKinnon and White (1985) HC3 sandwich estimator; provides more robustness in smaller samples than hc2, Long & Ervin (2000) + + - 'hac': Newey-West (1987) estimator for robustness to heteroscedasticity as well as serial auto-correlation at given lags. + + - 'cluster' : cluster-robust standard errors (see Cameron & Miller 2015 for review). Provides robustness to errors that cluster according to specific groupings (e.g. repeated observations within a person/school/site). This acts as post-modeling "correction" for what a multi-level model explicitly estimates and is popular in the econometrics literature. DOF correction differs slightly from stat/statsmodels which use num_clusters - 1, where as pymer4 uses num_clusters - num_coefs + + Finally, weighted-least-squares (WLS) can be computed as an alternative to to hetereoscedasticity robust standard errors. This can be estimated by providing an array or series of weights (1 / variance of each group) with the same length as the number of observations or a column to use to compute group variances (which can be the same as the predictor column). This is often useful if some predictor(s) is categorical (e.g. dummy-coded) and taking into account unequal group variances is desired (i.e. in the simplest case this would be equivalent to peforming Welch's t-test). + + + Args: + robust (bool/str): whether to use heteroscedasticity robust s.e. and optionally which estimator type to use ('hc0','hc1', 'hc2', hc3','hac','cluster'). If robust = True, default robust estimator is 'hc1'; default False + conf_int (str): whether confidence intervals should be computed through bootstrap ('boot') or assuming a t-distribution ('standard'); default 'standard' + permute (int): if non-zero, computes parameter significance tests by permuting t-stastics rather than parametrically; works with robust estimators + rank (bool): convert all predictors and dependent variable to ranks before estimating model; default False + summarize (bool): whether to print a model summary after fitting; default True + verbose (bool): whether to print which model, standard error, confidence interval, and inference type are being fitted + n_boot (int): how many bootstrap resamples to use for confidence intervals (ignored unless conf_int='boot') + n_jobs (int): number of cores for parallelizing bootstrapping or permutations; default 1 + n_lags (int): number of lags for robust estimator type 'hac' (ignored unless robust='hac'); default 1 + cluster (str): column name identifying clusters/groups for robust estimator type 'cluster' (ignored unless robust='cluster') + weights (string/pd.Series/np.ndarray): weights to perform WLS instead of OLS. Pass in a column name in data to use to compute group variances and automatically adjust dof. Otherwise provide an array or series containing 1 / variance of each observation, in which case dof correction will not occur. + wls_dof_correction (bool): whether to apply Welch-Satterthwaite approximate correction for dof when using weights based on an existing column in the data, ignored otherwise. Set to False to force standard dof calculation + + Returns: + pd.DataFrame: R/statsmodels style summary + + + Examples: + + Simple multiple regression model with parametric assumptions + + >>> model = Lm('DV ~ IV1 + IV2', data=df) + >>> model.fit() + + Same as above but with robust standard errors + + >>> model.fit(robust='hc1') + + Same as above but with cluster-robust standard errors. The cluster argument should refer to a column in the dataframe. + + >>> model.fit(robust='cluster', cluster='Group') + + Simple regression with categorical predictor, i.e. between groups t-test assuming equal variances + + >>> model = Lm('DV ~ Group', data=df) + >>> model.fit() + + Same as above but don't assume equal variances and have pymer4 compute the between group variances automatically, i.e. WLS (preferred). + + >>> model.fit(weights='Group') + + Manually compute the variance of each group and use the inverse of that as the weights. In this case WLS is estimated but dof correction won't be applied because it's not trivial to compute. + + >>> weights = 1 / df.groupby("Group")['DV'].transform(np.var,ddof=1) + model.fit(weights=weights) + + """ + + # Guard against lack of feature parity between log and lin regress + if self.family == "binomial" and ( + robust or permute or weights is not None or conf_int != "standard" + ): + raise ValueError( + "Logistic regression currently only supports standard parametric inference" + ) + + # Alllow summary or summarize for compatibility + if "summary" in kwargs and "summarize" in kwargs: + raise ValueError( + "You specified both summary and summarize, please prefer summarize" + ) + summarize = kwargs.pop("summarize", True) + summarize = kwargs.pop("summary", summarize) + + if permute and permute < 500: + w = "Permutation testing < 500 permutations is not recommended" + warnings.warn(w) + self.warnings.append(w) + elif permute is True: + raise TypeError( + "permute should 'False' or the number of permutations to perform" + ) + if robust: + if isinstance(robust, bool): + robust = "hc1" + self.se_type = "robust" + " (" + robust + ")" + if cluster: + if cluster not in self.data.columns: + raise ValueError( + "cluster identifier must be an existing column in data" + ) + else: + cluster = self.data[cluster] + else: + self.se_type = "non-robust" + + # PRINT INFO + if self.family in ["gaussian", "binomial"]: + if verbose: + if rank: + print_rank = "rank" + else: + print_rank = "linear" + if not robust: + print_robust = "non-robust" + else: + print_robust = "robust " + robust + + if conf_int == "boot": + print( + "Fitting " + + print_rank + + " model with " + + print_robust + + " standard errors and \n" + + str(n_boot) + + "bootstrapped 95% confidence intervals...\n" + ) + else: + print( + "Fitting " + + print_rank + + " model with " + + print_robust + + " standard errors\nand 95% confidence intervals...\n" + ) + + if permute: + print( + "Using {} permutations to determine significance...".format( + permute + ) + ) + + self.ci_type = ( + conf_int + " (" + str(n_boot) + ")" if conf_int == "boot" else conf_int + ) + if (conf_int == "boot") and (permute is None): + self.sig_type = "bootstrapped" + else: + if permute: + self.sig_type = "permutation" + " (" + str(permute) + ")" + else: + self.sig_type = "parametric" + + # Parse formula using patsy to make design matrix + if rank: + self.ranked_data = True + ddat = self.data.rank() + else: + self.ranked_data = False + ddat = self.data + + weight_vals, weight_groups, dv = self._handle_weights(weights) + + y, x = dmatrices(self.formula, ddat, 1, return_type="dataframe") + self.design_matrix = x + + # Logistic Regression + if self.family == "binomial": + ( + b, + ll, + ul, + se, + odds, + odds_ll, + odds_ul, + probs, + probs_ll, + probs_ul, + z, + p, + sig, + fits, + fit_probs, + fit_classes, + clf, + ) = _logregress(x, y, all_stats=True) + + # Save sklearn model and all fits + self.model_obj = clf + self.data["fits"] = fits + self.data["fit_probs"] = fit_probs + self.data["fit_classes"] = fit_classes + + # Build output df + results = self._organize_results( + [ + b, + ll, + ul, + se, + odds, + odds_ll, + odds_ul, + probs, + probs_ll, + probs_ul, + z, + p, + sig, + ], + [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "OR", + "OR_2.5_ci", + "OR_97.5_ci", + "Prob", + "Prob_2.5_ci", + "Prob_97.5_ci", + "Z-stat", + "P-val", + "Sig", + ], + x.columns, + ) + + # Linear Regression + else: + # Fit + b, se, t, res = _ols( + x, + y, + robust, + all_stats=True, + n_lags=n_lags, + cluster=cluster, + weights=weight_vals, + ) + + # DOF and pval calculation + df = self._calc_dof( + cluster, wls_dof_correction, x, weights, weight_groups, dv + ) + p, df, sig = self._calc_ols_pvals(df, t) + + if conf_int == "boot": + + # Parallelize bootstrap computation for CIs + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + + # To make sure that parallel processes don't use the same random-number generator pass in seed (sklearn trick) + seeds = np.random.randint(np.iinfo(np.int32).max, size=n_boot) + + # Since we're bootstrapping coefficients themselves we don't need the robust info anymore + boot_betas = par_for( + delayed(_chunk_boot_ols_coefs)( + dat=ddat, + formula=self.formula, + weights=weights, + seed=seeds[i], + ) + for i in range(n_boot) + ) + + boot_betas = np.array(boot_betas) + ci_u = np.percentile(boot_betas, 97.5, axis=0) + ci_l = np.percentile(boot_betas, 2.5, axis=0) + + else: + # Otherwise we're doing parametric CIs + ci_u = b + t_dist.ppf(0.975, df) * se + ci_l = b + t_dist.ppf(0.025, df) * se + + if permute: + # Permuting will change degrees of freedom to num_iter and p-values + # Parallelize computation + # Unfortunate monkey patch that robust estimation hangs with multiple processes; maybe because of function nesting level?? + # _chunk_perm_ols -> _ols -> _robust_estimator + if robust: + n_jobs = 1 + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + seeds = np.random.randint(np.iinfo(np.int32).max, size=permute) + perm_ts = par_for( + delayed(_chunk_perm_ols)( + x=x, + y=y, + robust=robust, + n_lags=n_lags, + cluster=cluster, + weights=weights, + seed=seeds[i], + ) + for i in range(permute) + ) + perm_ts = np.array(perm_ts) + + p = [] + for col, fit_t in zip(range(perm_ts.shape[1]), t): + p.append(_perm_find(perm_ts[:, col], fit_t)) + p = np.array(p) + df = np.array([permute] * len(p)) + sig = np.array([_sig_stars(elem) for elem in p]) + + # Make output df + results = self._organize_results( + [b, ci_l, ci_u, se, df, t, p, sig], + [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "DF", + "T-stat", + "P-val", + "Sig", + ], + x.columns, + ) + + if permute: + results = results.rename( + columns={"DF": "Num_perm", "P-val": "Perm-P-val"} + ) + + self._calc_fit_statistics(x, y, res) + + self.coefs = results + self.fitted = True + + if summarize: + return self.summary()
    + + def _calc_fit_statistics(self, x, y, residuals): + + if self.family != "gaussian": + raise TypeError( + "Currently only gaussian models can calculate fit statistics" + ) + + # Save residuals + self.residuals = residuals + self.fits = (y.squeeze() - residuals).values + self.data["fits"] = (y.squeeze() - residuals).values + self.data["residuals"] = residuals + + # Calculate fit statistics + if "Intercept" in self.design_matrix.columns: + center_tss = True + else: + center_tss = False + self.rsquared = rsquared(y.squeeze(), residuals, center_tss) + self.rsquared_adj = rsquared_adj( + self.rsquared, len(residuals), len(residuals) - x.shape[1], center_tss + ) + # self.rsquared_adj = np.nan + half_obs = len(residuals) / 2.0 + ssr = np.dot(residuals, residuals.T) + self.logLike = (-np.log(ssr) * half_obs) - ( + (1 + np.log(np.pi / half_obs)) * half_obs + ) + self.AIC = 2 * x.shape[1] - 2 * self.logLike + self.BIC = np.log((len(residuals))) * x.shape[1] - 2 * self.logLike + +
    [docs] def summary(self): + """ + Summarize the output of a fitted model. + + Returns: + pd.DataFrame: R/statsmodels style summary + + """ + + if not self.fitted: + raise RuntimeError("Model must be fit to generate summary!") + + print("Formula: {}\n".format(self.formula)) + print("Family: {}\t Estimator: {}\n".format(self.family, self.estimator)) + print( + "Std-errors: {}\tCIs: {} 95%\tInference: {} \n".format( + self.se_type, self.ci_type, self.sig_type + ) + ) + if self.rsquared is not None: + print( + "Number of observations: %s\t R^2: %.3f\t R^2_adj: %.3f\n" + % (self.data.shape[0], self.rsquared, self.rsquared_adj) + ) + else: + print("Number of observations: %s\t\n" % (self.data.shape[0])) + if self.AIC is not None: + print( + "Log-likelihood: %.3f \t AIC: %.3f\t BIC: %.3f\n" + % (self.logLike, self.AIC, self.BIC) + ) + print("Fixed effects:\n") + return self.coefs.round(3)
    + +
    [docs] def to_corrs(self, corr_type="semi", ztrans_corrs=False): + """ + Transform fitted model coefficients (excluding the intercept) to partial or semi-partial correlations with dependent variable. The is useful for rescaling coefficients to a correlation scale (-1 to 1) and does **not** change how inferences are performed. Semi-partial correlations are computed as the correlation between a DV and each predictor *after* the influence of all other predictors have been regressed out from that predictor. They are interpretable in the same way as the original coefficients. Partial correlations reflect the unique variance a predictor explains in the DV accounting for correlations between predictors *and* what is not explained by other predictors; this value is always >= the semi-partial correlation. They are *not* interpretable in the same way as the original coefficients. Partial correlations are computed as the correlations between a DV and each predictor *after* the influence of all other predictors have been regressed out from that predictor *and* the DV. Good ref: https://bit.ly/2GNwXh5 + + Args: + corr_type (string): 'semi' or 'partial' + ztrans_partial_corrs (bool): whether to fisher z-transform (arctan) partial correlations before reporting them; default False + + Returns: + pd.Series: partial or semi-partial correlations + + """ + + if not self.fitted: + raise RuntimeError( + "Model must be fit before partial correlations can be computed" + ) + if not self.family == "gaussian": + raise NotImplementedError( + ".to_corrs is only supported for family='gaussian'" + ) + + if corr_type not in ["semi", "partial"]: + raise ValueError("corr_type must be 'semi' or 'partial'") + from scipy.stats import pearsonr + + corrs = [] + corrs.append(np.nan) # don't compute for intercept + for c in self.design_matrix.columns[1:]: + dv = self.formula.split("~")[0] + other_preds = [e for e in self.design_matrix.columns[1:] if e != c] + right_side = "+".join(other_preds) + y, x = dmatrices( + c + "~" + right_side, self.data, 1, return_type="dataframe" + ) + pred_m_resid = _ols( + x, + y, + robust=False, + n_lags=1, + cluster=None, + all_stats=False, + resid_only=True, + ) + y, x = dmatrices( + dv + "~" + right_side, self.data, 1, return_type="dataframe" + ) + if corr_type == "semi": + dv_m_resid = y.values.squeeze() + elif corr_type == "partial": + dv_m_resid = _ols( + x, + y, + robust=False, + n_lags=1, + cluster=None, + all_stats=False, + resid_only=True, + ) + corrs.append(pearsonr(dv_m_resid, pred_m_resid)[0]) + if ztrans_corrs: + corrs = np.arctanh(corrs) + return pd.Series(corrs, index=self.coefs.index)
    + +
    [docs] def predict(self, data, pred_type="response"): + """ + Make predictions given new data. Input must be a dataframe that contains the same columns as the model.matrix excluding the intercept (i.e. all the predictor variables used to fit the model). Will automatically use/ignore intercept to make a prediction if it was/was not part of the original fitted model. + + Args: + data (pd.DataFrame): input data to make predictions on + pred_type (str): whether the prediction should be on the 'response' scale + (default) or on the 'link' scale of the predictors passed through the link + function (e.g. log-odds scale in a logit model instead of probability + values) or 'probs' if self.family == 'binomial' + + Returns: + np.ndarray: prediction values + + """ + + if self.family not in ["gaussian", "binomial"]: + raise NotImplementedError( + "Only gaussian and binomial Lm models support .predict()" + ) + + required_cols = self.design_matrix.columns[1:] + if not all([col in data.columns for col in required_cols]): + raise ValueError("Column names do not match all fixed effects model terms!") + + X = data[required_cols] + # Add intercept if needed + has_intercept = "Intercept" in self.coefs.index + if has_intercept: + cols = X.columns.tolist() + X["Intercept"] = np.ones(X.shape[0]) + # sort + X = X[["Intercept"] + cols] + + if self.family == "gaussian": + if pred_type == "link": + warnings.warn( + "pred_type='link' is ignored when family='gaussian' as link='identity'" + ) + coefs = self.coefs.loc[:, "Estimate"].values + preds = np.dot(X, coefs) + + elif self.family == "binomial": + if pred_type == "response": + # We only return probabilities for positive class + preds = self.model_obj.predict_proba(X)[:, 1] + elif pred_type == "link": + preds = self.model_obj.decision_function(X) + + return preds
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/models/Lm2.html b/_modules/pymer4/models/Lm2.html new file mode 100644 index 0000000..7ca3085 --- /dev/null +++ b/_modules/pymer4/models/Lm2.html @@ -0,0 +1,605 @@ + + + + + + + pymer4.models.Lm2 — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.models.Lm2

    +"""
    +Pymer4 Lm2 Class
    +================
    +
    +Main class for two-stage regression models
    +"""
    +
    +from copy import copy
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +import seaborn as sns
    +from patsy import dmatrices
    +from joblib import Parallel, delayed
    +from .Lm import Lm
    +from ..stats import rsquared, rsquared_adj
    +from ..utils import _sig_stars, _permute_sign, _ols_group, _corr_group, _perm_find
    +
    +
    +
    [docs]class Lm2(object): + + """ + Model class to perform two-stage OLS regression. Practically, this class fits a separate Lm() model to each cluster/group in the data and performs inference on the coefficients of each model (i.e. 1-sample t-test per coefficient). The results from this second level regression are reported. This is an alternative to using Lmer, as it implicitly allows intercept and slopes to vary by group, however with no prior/smoothing/regularization on the random effects. See https://bit.ly/2SwHhQU and Gelman (2005). This approach maybe less preferable to Lmer if the number of observations per group are few, but the number of groups is large, in which case the 1st-level estimates are much noisier and are not smoothed/regularized as in Lmer. It maybe preferable when a "maximal" rfx Lmer model is not estimable. Formula specification works just like in R based on columns of a dataframe. Formulae are parsed by patsy which makes it easy to utilize specific columns as factors. This is **different** from Lmer. See patsy for more information on the different use cases. + + Args: + formula (str): Complete lm-style model formula + data (pd.DataFrame): input data + family (string): what distribution family (i.e.) link function to use for the generalized model; default is gaussian (linear model) + group (list/string): the grouping variable to use to run the 1st-level regression; if a list is provided will run multiple levels feeding the coefficients from the previous level into the subsequent level + + Attributes: + fitted (bool): whether model has been fit + formula (str): model formula + data (pandas.core.frame.DataFrame): model copy of input data + grps (dict): groups and number of observations per groups recognized by lmer + AIC (float): model akaike information criterion + logLike (float): model Log-likelihood + family (string): model family + warnings (list): warnings output from Python + fixef (pd.DataFrame): cluster-level parameters + coefs (pd.DataFrame): model summary table of population parameters + residuals (numpy.ndarray): model residuals + fits (numpy.ndarray): model fits/predictions + se_type (string): how standard errors are computed + sig_type (string): how inference is performed + + + """ + + def __init__(self, formula, data, group, family="gaussian"): + + self.family = family + # implemented_fams = ['gaussian','binomial'] + if self.family != "gaussian": + raise NotImplementedError( + "Currently only linear (family ='gaussian') models supported! " + ) + if isinstance(group, str): + self.group = group + else: + raise TypeError("group must be a string or list") + self.fitted = False + self.formula = formula.replace(" ", "") + self.data = copy(data) + self.AIC = None + self.logLike = None + self.warnings = [] + self.residuals = None + self.fixef = None + self.coefs = None + self.model_obj = None + self.ci_type = None + self.se_type = None + self.sig_type = None + self.ranked_data = False + self.iscorrs = False + + def __repr__(self): + out = "{}(fitted={}, formula={}, family={}, group={})".format( + self.__class__.__module__, + self.fitted, + self.formula, + self.family, + self.group, + ) + return out + +
    [docs] def fit( + self, + robust=False, + conf_int="standard", + permute=False, + perm_on="t-stat", + rank=False, + verbose=False, + n_boot=500, + n_jobs=1, + n_lags=1, + to_corrs=False, + ztrans_corrs=True, + cluster=None, + **kwargs, + ): + """ + Fit a variety of second-level OLS models; all 1st-level models are standard OLS. By default will fit a model that makes parametric assumptions (under a t-distribution) replicating the output of software like R. 95% confidence intervals (CIs) are also estimated parametrically by default. However, empirical bootstrapping can also be used to compute CIs, which will resample with replacement from the first level regression estimates and uses these CIs to perform inference unless permutation tests are requested. Permutation testing will perform a one-sample sign-flipped permutation test on the estimates directly (perm_on='coef') or the t-statistic (perm_on='t-stat'). Permutation is a bit different than Lm which always permutes based on the t-stat. + + Heteroscedasticity robust standard errors can also be computed, but these are applied at the second-level, *not* at the first level. See the Lm() documentatation for more information about robust standard errors. + + Args: + robust (bool/str): whether to use heteroscedasticity robust s.e. and optionally which estimator type to use ('hc0','hc3','hac','cluster'). If robust = True, default robust estimator is 'hc0'; default False + conf_int (str): whether confidence intervals should be computed through bootstrap ('boot') or assuming a t-distribution ('standard'); default 'standard' + permute (int): if non-zero, computes parameter significance tests by permuting t-stastics rather than parametrically; works with robust estimators + perm_on (str): permute based on a null distribution of the 'coef' of first-level estimates or the 't-stat' of first-level estimates; default 't-stat' + rank (bool): convert all predictors and dependent variable to ranks before estimating model; default False + to_corrs (bool/string): for each first level model estimate a semi-partial or partial correlations instead of betas and perform inference over these partial correlation coefficients. *note* this is different than Lm(); default False + ztrans_corrs (bool): whether to fisher-z transform (arcsin) first-level correlations before running second-level model. Ignored if to_corrs is False; default True + summarize (bool): whether to print a model summary after fitting; default True + verbose (bool): whether to print which model, standard error, confidence interval, and inference type are being fitted + n_boot (int): how many bootstrap resamples to use for confidence intervals (ignored unless conf_int='boot') + n_jobs (int): number of cores for parallelizing bootstrapping or permutations; default 1 + n_lags (int): number of lags for robust estimator type 'hac' (ignored unless robust='hac'); default 1 + cluster (str): column name identifying clusters/groups for robust estimator type 'cluster' (ignored unless robust='cluster') + + Returns: + DataFrame: R style summary() table + + """ + + # Alllow summary or summarize for compatibility + if "summary" in kwargs and "summarize" in kwargs: + raise ValueError( + "You specified both summary and summarize, please prefer summarize" + ) + summarize = kwargs.pop("summarize", True) + summarize = kwargs.pop("summary", summarize) + + if robust: + if isinstance(robust, bool): + robust = "hc0" + self.se_type = "robust" + " (" + robust + ")" + if cluster: + if cluster not in self.data.columns: + raise ValueError( + "cluster identifier must be an existing column in data" + ) + else: + cluster = self.data[cluster] + else: + self.se_type = "non-robust" + self.ci_type = ( + conf_int + " (" + str(n_boot) + ")" if conf_int == "boot" else conf_int + ) + if isinstance(to_corrs, str): + if to_corrs not in ["semi", "partial"]: + raise ValueError("to_corrs must be 'semi' or 'partial'") + + if (conf_int == "boot") and (permute is None): + self.sig_type = "bootstrapped" + else: + if permute: + if perm_on not in ["coef", "t-stat"]: + raise ValueError("perm_on must be 't-stat' or 'coef'") + self.sig_type = "permutation" + " (" + str(permute) + ")" + if permute is True: + raise TypeError( + "permute should 'False' or the number of permutations to perform" + ) + else: + self.sig_type = "parametric" + + # Parallelize regression computation for 1st-level models + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + + if rank: + self.ranked_data = True + else: + self.ranked_data = False + + if to_corrs: + # Loop over each group and get semi/partial correlation estimates + # Reminder len(betas) == len(betas) - 1, from normal OLS, since corr of intercept is not computed + # TODO: Update _corr_group like _ols_group below + betas = par_for( + delayed(_corr_group)( + self.data, + self.formula, + self.group, + self.data[self.group].unique()[i], + self.ranked_data, + to_corrs, + ) + for i in range(self.data[self.group].nunique()) + ) + if ztrans_corrs: + betas = np.arctanh(betas) + else: + betas = np.array(betas) + else: + # Loop over each group and fit a separate regression + out = par_for( + delayed(_ols_group)( + self.data, + self.formula, + self.group, + self.data[self.group].unique()[i], + self.ranked_data, + ) + for i in range(self.data[self.group].nunique()) + ) + betas = np.array([e["betas"] for e in out]) + fits = np.concatenate([e["pred"] for e in out], axis=0) + residuals = np.concatenate([e["res"] for e in out], axis=0) + self.residuals = residuals + self.data["residuals"] = residuals + self.fits = fits + self.data["fits"] = fits + + # Get the model matrix formula from patsy to make it more reliable to set the results dataframe index like Lmer + _, x = dmatrices(self.formula, self.data, 1, return_type="dataframe") + self.design_matrix = x + # Perform an intercept only regression for each beta + results = [] + perm_ps = [] + for i in range(betas.shape[1]): + df = pd.DataFrame({"X": np.ones_like(betas[:, i]), "Y": betas[:, i]}) + lm = Lm("Y ~ 1", data=df) + lm.fit( + robust=robust, + conf_int=conf_int, + summarize=False, + n_boot=n_boot, + n_jobs=n_jobs, + n_lags=n_lags, + ) + results.append(lm.coefs) + if permute: + # sign-flip permutation test for each beta instead to replace p-values + if perm_on == "coef": + return_stat = "mean" + else: + return_stat = "t-stat" + seeds = np.random.randint(np.iinfo(np.int32).max, size=permute) + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + perm_est = par_for( + delayed(_permute_sign)( + data=betas[:, i], seed=seeds[j], return_stat=return_stat + ) + for j in range(permute) + ) + perm_est = np.array(perm_est) + if perm_on == "coef": + perm_ps.append(_perm_find(perm_est, betas[:, i].mean())) + else: + perm_ps.append(_perm_find(perm_est, lm.coefs["T-stat"].values)) + + results = pd.concat(results, axis=0) + ivs = self.formula.split("~")[-1].strip().split("+") + ivs = [e.strip() for e in ivs] + if to_corrs: + intercept_pd = dict() + for c in results.columns: + intercept_pd[c] = np.nan + intercept_pd = pd.DataFrame(intercept_pd, index=[0]) + results = pd.concat([intercept_pd, results], ignore_index=True) + results.index = x.columns + self.coefs = results + if to_corrs: + self.fixef = pd.DataFrame(betas, columns=ivs) + else: + self.fixef = pd.DataFrame(betas, columns=x.columns) + self.fixef.index = self.data[self.group].unique() + self.fixef.index.name = self.group + if permute: + # get signifance stars + sig = [_sig_stars(elem) for elem in perm_ps] + # Replace dof and p-vales with permutation results + if conf_int != "boot": + self.coefs = self.coefs.drop(columns=["DF", "P-val"]) + if to_corrs: + self.coefs["Num_perm"] = [np.nan] + [permute] * ( + self.coefs.shape[0] - 1 + ) + self.coefs["Sig"] = [np.nan] + sig + self.coefs["Perm-P-val"] = [np.nan] + perm_ps + else: + self.coefs["Num_perm"] = [permute] * self.coefs.shape[0] + self.coefs["Sig"] = sig + self.coefs["Perm-P-val"] = perm_ps + self.coefs = self.coefs[ + [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "Num_perm", + "T-stat", + "Perm-P-val", + "Sig", + ] + ] + self.fitted = True + self.iscorrs = to_corrs + + # Fit statistics + if "Intercept" in self.design_matrix.columns: + center_tss = True + else: + center_tss = False + # NOTE: This are rudimentary calculations because there are a variety of ways + # to compute R^2 metrics for LMM models. Most however use intermediate + # calculations from running a "true" MLM like Lmer rather than a two-stage + # regression like Lm2. Here we compute the "naive" R^2 over the whole dataset, + # and the same metrics on a per-group basis to give the user flexibilty. We + # don't compute anything from the second-level fits or residuals since those + # are just univariate mean tests. + + if not self.iscorrs: + # Method 1: "naive" over the whole dataset + self.rsquared = rsquared(fits, residuals, center_tss) + self.rsquared_adj = rsquared_adj( + self.rsquared, len(residuals), len(residuals) - x.shape[1], center_tss + ) + + # Method 2: calculated separately group. Potentially useful for inspecting 1st + # level model fits + separate_results = [(e["pred"], e["res"]) for e in out] + self.rsquared_per_group = np.array( + [rsquared(e[0], e[1], center_tss) for e in separate_results] + ) + self.rsquared_adj_per_group = np.array( + [ + rsquared_adj( + self.rsquared_per_group[i], + len(separate_results[i][0]), + len(separate_results[i][0]) - x.shape[1], + center_tss, + ) + for i in range(len(self.rsquared_per_group)) + ] + ) + + if summarize: + return self.summary()
    + +
    [docs] def summary(self): + """ + Summarize the output of a fitted model. + + Returns: + pd.DataFrame: R/statsmodels style summary + + """ + + if not self.fitted: + raise RuntimeError("Model must be fitted to generate summary!") + + print("Formula: {}\n".format(self.formula)) + print("Family: {}\n".format(self.family)) + print( + "Std-errors: {}\tCIs: {} 95%\tInference: {} \n".format( + self.se_type, self.ci_type, self.sig_type + ) + ) + print( + "Number of observations: %s\t Groups: %s\n" + % (self.data.shape[0], {str(self.group): self.data[self.group].nunique()}) + ) + print("Fixed effects:\n") + if self.iscorrs: + if self.iscorrs == "semi": + corr = "semi-partial" + else: + corr = self.iscorrs + print("Note: {} correlations reported".format(corr)) + return self.coefs.round(3)
    + +
    [docs] def plot_summary( + self, + figsize=(12, 6), + error_bars="ci", + ranef=True, + axlim=None, + ranef_alpha=0.5, + coef_fmt="o", + orient="v", + **kwargs, + ): + """ + Create a forestplot overlaying estimated coefficients with first-level effects. By default display the 95% confidence intervals computed during fitting. + + Args: + error_bars (str): one of 'ci' or 'se' to change which error bars are plotted; default 'ci' + ranef (bool): overlay BLUP estimates on figure; default True + axlim (tuple): lower and upper limit of plot; default min and max of BLUPs + ranef_alpha (float): opacity of random effect points; default .5 + coef_fmt (str): matplotlib marker style for population coefficients + + Returns: + plt.axis: matplotlib axis handle + """ + + if not self.fitted: + raise RuntimeError("Model must be fit before plotting!") + if orient not in ["h", "v"]: + raise ValueError("orientation must be 'h' or 'v'") + + m_ranef = self.fixef + m_fixef = self.coefs.drop("Intercept", axis=0) + + if error_bars == "ci": + col_lb = (m_fixef["Estimate"] - m_fixef["2.5_ci"]).values + col_ub = (m_fixef["97.5_ci"] - m_fixef["Estimate"]).values + elif error_bars == "se": + col_lb, col_ub = m_fixef["SE"], m_fixef["SE"] + + # For seaborn + m = pd.melt(m_ranef) + + _, ax = plt.subplots(1, 1, figsize=figsize) + + if ranef: + alpha_plot = ranef_alpha + else: + alpha_plot = 0 + + if orient == "v": + x_strip = "value" + x_err = m_fixef["Estimate"] + y_strip = "variable" + y_err = range(m_fixef.shape[0]) + xerr = [col_lb, col_ub] + yerr = None + ax.vlines( + x=0, ymin=-1, ymax=self.coefs.shape[0], linestyles="--", color="grey" + ) + if not axlim: + xlim = (m["value"].min() - 1, m["value"].max() + 1) + else: + xlim = axlim + ylim = None + else: + y_strip = "value" + y_err = m_fixef["Estimate"] + x_strip = "variable" + x_err = range(m_fixef.shape[0]) + yerr = [col_lb, col_ub] + xerr = None + ax.hlines( + y=0, xmin=-1, xmax=self.coefs.shape[0], linestyles="--", color="grey" + ) + if not axlim: + ylim = (m["value"].min() - 1, m["value"].max() + 1) + else: + ylim = axlim + xlim = None + + sns.stripplot( + x=x_strip, y=y_strip, data=m, ax=ax, size=6, alpha=alpha_plot, color="grey" + ) + + ax.errorbar( + x=x_err, + y=y_err, + xerr=xerr, + yerr=yerr, + fmt=coef_fmt, + capsize=0, + elinewidth=4, + color="black", + ms=12, + zorder=9999999999, + ) + + ax.set(ylabel="", xlabel="Estimate", xlim=xlim, ylim=ylim) + sns.despine(top=True, right=True, left=True) + return ax
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/models/Lmer.html b/_modules/pymer4/models/Lmer.html new file mode 100644 index 0000000..d8c70a3 --- /dev/null +++ b/_modules/pymer4/models/Lmer.html @@ -0,0 +1,1810 @@ + + + + + + + pymer4.models.Lmer — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.models.Lmer

    +"""
    +Pymer4 Lmer Class
    +=================
    +
    +Main class to wrap R's lme4 library
    +"""
    +
    +
    +from copy import copy
    +from rpy2.robjects.packages import importr
    +import rpy2.robjects as robjects
    +from rpy2.rinterface_lib import callbacks
    +import rpy2.rinterface as rinterface
    +from rpy2.robjects.conversion import localconverter
    +from rpy2.robjects import numpy2ri
    +import warnings
    +import traceback
    +import numpy as np
    +import pandas as pd
    +import matplotlib.pyplot as plt
    +import seaborn as sns
    +from ..utils import (
    +    _sig_stars,
    +    _perm_find,
    +    _return_t,
    +    _to_ranks_by_group,
    +)
    +from ..bridge import con2R, pandas2R, R2pandas, R2numpy
    +from pandas.api.types import CategoricalDtype
    +
    +# Import R libraries we need
    +base = importr("base")
    +stats = importr("stats")
    +
    +# Make a reference to the default R console writer from rpy2
    +consolewrite_warning_backup = callbacks.consolewrite_warnerror
    +consolewrite_print_backup = callbacks.consolewrite_print
    +
    +
    +
    [docs]class Lmer(object): + + """ + Model class to hold data outputted from fitting lmer in R and converting to Python object. This class stores as much information as it can about a merMod object computed using lmer and lmerTest in R. Most attributes will not be computed until the fit method is called. + + Args: + formula (str): Complete lmer-style model formula + data (pandas.core.frame.DataFrame): input data + family (string): what distribution family (i.e.) link function to use for the generalized model; default is gaussian (linear model) + + Attributes: + fitted (bool): whether model has been fit + formula (str): model formula + data (pd.DataFrame): model copy of input data + grps (dict): groups and number of observations per groups recognized by lmer + design_matrix (pd.DataFrame): model design matrix determined by lmer + AIC (float): model Akaike information criterion + BIC (float): model Bayesian information criterion + logLike (float): model Log-likelihood + family (string): model family + warnings (list): warnings output from R or Python + ranef (pd.DataFrame/list): cluster-level differences from population parameters, i.e. difference between coefs and fixefs; returns list if multiple cluster variables are used to specify random effects (e.g. subjects and items) + fixef (pd.DataFrame/list): cluster-level parameters; returns list if multiple cluster variables are used to specify random effects (e.g. subjects and items) + coefs (pandas.core.frame.DataFrame/list): model summary table of population parameters + ranef_var (pd.DataFrame): random effects variances + ranef_corr(pd.DataFrame): random effects correlations + residuals (numpy.ndarray): model residuals + fits (numpy.ndarray): model fits/predictions + model_obj (lmer model): rpy2 lmer model object + factors (dict): factors used to fit the model if any + + """ + + def __init__(self, formula, data, family="gaussian"): + + self.family = family + implemented_fams = [ + "gaussian", + "binomial", + "gamma", + "inverse_gaussian", + "poisson", + ] + if self.family not in implemented_fams: + raise ValueError( + "Family must be one of: gaussian, binomial, gamma, inverse_gaussian or poisson!" + ) + self.fitted = False + self.formula = formula.replace(" ", "") + self.data = copy(data) + self.grps = None + self.AIC = None + self.BIC = None + self.logLike = None + self.warnings = [] + self.ranef_var = None + self.ranef_corr = None + self.ranef = None + self.fixef = None + self.design_matrix = None + self.residuals = None + self.coefs = None + self.model_obj = None + self.factors = None + self.contrast_codes = None + self.ranked_data = False + self.marginal_estimates = None + self.marginal_contrasts = None + self.sig_type = None + self.factors_prev_ = None + self.contrasts = None + + def __repr__(self): + out = "{}(fitted = {}, formula = {}, family = {})".format( + self.__class__.__module__, self.fitted, self.formula, self.family + ) + return out + + def _make_factors(self, factor_dict, ordered=False): + """ + Covert specific columns to R-style factors. Default scheme is dummy coding where reference is 1st level provided. Alternative is orthogonal polynomial contrasts. User can also specific custom contrasts. + + Args: + factor_dict: (dict) dictionary with column names specified as keys and values as a list for dummy/treatment/polynomial contrast; a dict with keys as factor leves and values as desired comparisons in human readable format + ordered: (bool) whether to interpret factor_dict values as dummy-coded (1st list item is reference level) or as polynomial contrasts (linear contrast specified by ordered of list items); ignored if factor_dict values are not a list + + Returns: + pandas.core.frame.DataFrame: copy of original data with factorized columns + + Examples: + + Dummy/treatment contrasts with 'A' as the reference level and other contrasts as 'B'-'A' and 'C'-'A' + + >>> _make_factors(factor_dict={'factor': ['A','B','C']}) + + Same as above but a linear contrast (and automatically computed quadratic contrast) of A < B < C + + >>> _make_factors(factor_dict={'factor': ['A','B','C']}, ordered=True) + + Custom contrast of 'A' - mean('B', 'C') + + >>> _make_factors(factor_dict={'factor': {'A': 1, 'B': -0.5, 'C': -0.5}}) + """ + + errormsg = "factors should be specified as a dictionary with values as one of:\n1) a list with factor levels in the desired order for dummy/treatment/polynomial contrasts\n2) a dict with keys as factor levels and values as desired comparisons in human readable format" + # We create a copy of data because we need to convert dtypes to categories and then pass them to R. However, resetting categories on the *same* dataframe and passing to R repeatedly (e.g. multiple calls to .fit with different contrasats) does not work as R only uses the 1st category spec. So instead we create a copy and return that copy to get used by .fit + out = {} + df = self.data.copy() + if not isinstance(factor_dict, dict): + raise TypeError(errormsg) + for factor, contrasts in factor_dict.items(): + # First convert to a string type because R needs string based categories + df[factor] = df[factor].apply(str) + + # Treatment/poly contrasts + if isinstance(contrasts, list): + # Ensure that all factor levels are accounted for + if not all([e in contrasts for e in df[factor].unique()]): + raise ValueError( + "Not all factor levels are specified in the desired contrast" + ) + # Define and apply a pandas categorical type in the same order as requested, which will get converted to the right factor levels in R + cat = CategoricalDtype(contrasts) + df[factor] = df[factor].astype(cat) + + if ordered: + # Polynomial contrasts + con_codes = np.array(stats.contr_poly(len(contrasts))) + else: + # Treatment/dummy contrasts + con_codes = np.array(stats.contr_treatment(len(contrasts))) + + out[factor] = con_codes + + # Custom contrasts (human readable) + elif isinstance(contrasts, dict): + factor_levels = list(contrasts.keys()) + cons = list(contrasts.values()) + # Ensure that all factor levels are accounted for + if not all([e in factor_levels for e in df[factor].unique()]): + raise ValueError( + "Not all factor levels are specified in the desired contrast" + ) + # Define and apply categorical type in the same order as requested + cat = CategoricalDtype(factor_levels) + df[factor] = df[factor].astype(cat) + # Compute desired contrasts in R format along with addition k - 1 contrasts not specified + con_codes = con2R(cons) + out[factor] = con_codes + + else: + raise TypeError(errormsg) + self.factors = factor_dict + self.contrast_codes = out + # have to do local convertion because dict values are numpy arrays :( + with localconverter(robjects.default_converter + numpy2ri.converter): + out = robjects.ListVector(out) + return out, df + + def _refit_orthogonal(self): + """ + Refit a model with factors organized as polynomial contrasts to ensure valid type-3 SS calculations with using `.anova()`. Previous factor specifications are stored in `model.factors_prev_`. + """ + + self.factors_prev_ = copy(self.factors) + self.contrast_codes_prev_ = copy(self.contrast_codes) + # Create orthogonal polynomial contrasts for all factors, by creating a list of unique + # factor levels as self._make_factors will handle the rest + new_factors = {} + for factor in self.factors.keys(): + new_factors[factor] = sorted(list(map(str, self.data[factor].unique()))) + + self.fit( + factors=new_factors, + ordered=True, + summarize=False, + permute=self._permute, + conf_int=self._conf_int, + REML=self._REML, + ) + +
    [docs] def anova(self, force_orthogonal=False): + """ + Return a type-3 ANOVA table from a fitted model. Like R, this method does not ensure that contrasts are orthogonal to ensure correct type-3 SS computation. However, the force_orthogonal flag can refit the regression model with orthogonal polynomial contrasts automatically guaranteeing valid SS type 3 inferences. Note that this will overwrite factors specified in the last call to `.fit()` + + Args: + force_orthogonal (bool): whether factors in the model should be recoded using polynomial contrasts to ensure valid type-3 SS calculations. If set to True, previous factor specifications will be saved in `model.factors_prev_`; default False + + Returns: + pd.DataFrame: Type 3 ANOVA results + """ + + if self.factors: + # Model can only have factors if it's been fit + if force_orthogonal: + self._refit_orthogonal() + elif not self.fitted: + raise ValueError("Model must be fit before ANOVA table can be generated!") + + rstring = """ + function(model){ + df<- anova(model) + df + } + """ + anova = robjects.r(rstring) + self.anova_results = R2pandas(anova(self.model_obj)) + if self.anova_results.shape[1] == 6: + self.anova_results.columns = [ + "SS", + "MS", + "NumDF", + "DenomDF", + "F-stat", + "P-val", + ] + self.anova_results["Sig"] = self.anova_results["P-val"].apply( + lambda x: _sig_stars(x) + ) + elif self.anova_results.shape[1] == 4: + warnings.warn( + "MODELING FIT WARNING! Check model.warnings!! P-value computation did not occur because lmerTest choked. Possible issue(s): ranefx have too many parameters or too little variance..." + ) + self.anova_results.columns = ["DF", "SS", "MS", "F-stat"] + if force_orthogonal: + print( + "SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom:\n(NOTE: Model refit with orthogonal polynomial contrasts)" + ) + else: + print( + "SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom:\n(NOTE: Using original model contrasts, orthogonality not guaranteed)" + ) + return self.anova_results
    + + def _get_ngrps(self, unsum, base): + """Get the groups information from the model as a dictionary""" + # This works for 2 grouping factors + ns = unsum.rx2("ngrps") + names = base.names(self.model_obj.slots["flist"]) + self.grps = dict(zip(names, ns)) + + def _set_R_stdout(self, verbose): + """Adjust whether R prints to the console (often as a duplicate) based on the verbose flag of a method call. Reference to rpy2 interface here: https://bit.ly/2MsrufO""" + + if verbose: + # use the default logging in R + callbacks.consolewrite_warnerror = consolewrite_warning_backup + else: + # Create a list buffer to catch messages and discard them + buf = [] + + def _f(x): + buf.append(x) + + callbacks.consolewrite_warnerror = _f + +
    [docs] def fit( + self, + conf_int="Wald", + n_boot=500, + factors=None, + permute=False, + ordered=False, + verbose=False, + REML=True, + rank=False, + rank_group="", + rank_exclude_cols=[], + no_warnings=False, + control="", + old_optimizer=False, + **kwargs, + ): + """ + Main method for fitting model object. Will modify the model's data attribute to add columns for residuals and fits for convenience. Factors should be specified as a dictionary with values as a list or themselves a dictionary of *human readable* contrasts *not* R-style contrast codes as these will be auto-converted for you. See the factors docstring and examples below. After fitting, the .factors attribute will store a reference to the user-specified dictionary. The .contrast_codes model attributes will store the requested comparisons in converted R format. Note that Lmer estimate naming conventions differs a bit from R: Lmer.coefs = summary(model); Lmer.fixefs = coefs(model); Lmer.ranef = ranef(model) + + Args: + conf_int (str): which method to compute confidence intervals; 'profile', 'Wald' (default), or 'boot' (parametric bootstrap) + n_boot (int): number of bootstrap intervals if bootstrapped confidence intervals are requests; default 500 + factors (dict): dictionary with column names specified as keys and values as a list for dummy/treatment/polynomial contrast or a dict with keys as factor leves and values as desired comparisons in human readable format See examples below + permute (int): if non-zero, computes parameter significance tests by permuting test stastics rather than parametrically. Permutation is done by shuffling observations within clusters to respect random effects structure of data. + ordered (bool): whether factors should be treated as ordered polynomial contrasts; this will parameterize a model with K-1 orthogonal polynomial regressors beginning with a linear contrast based on the factor order provided. Ordering applies to **all** contrasts!; default is False + summarize/summary (bool): whether to print a model summary after fitting; default is True + verbose (bool): whether to print when and which model and confidence interval are being fitted + REML (bool): whether to fit using restricted maximum likelihood estimation instead of maximum likelihood estimation; default True + rank (bool): covert predictors in model formula to ranks by group prior to estimation. Model object will still contain original data not ranked data; default False + rank_group (str): column name to group data on prior to rank conversion + rank_exclude_cols (list/str): columns in model formula to not apply rank conversion to + no_warnings (bool): turn off auto-printing warnings messages; warnings are always stored in the .warnings attribute; default False + control (str): string containing options to be passed to (g)lmer control. See https://bit.ly/2OQONTH for options + old_optimizer (bool): use the old bobyqa optimizer that was the default in lmer4 <= 1.1_20, i.e. prior to 02/04/2019. This is not compatible with the control setting as it's meant to be a quick shorthand (e.g. to reproduce previous model results). However, the same setting can be manually requested using the control option if preferred. (For optimizer change discussions see: https://bit.ly/2MrP9Nq and https://bit.ly/2Vx5jte ) + + Returns: + pd.DataFrame: R/statsmodels style summary + + Examples: + The following examples demonstrate how to treat variables as categorical factors. + + Dummy-Coding: Treat Col1 as a factor which 3 levels: A, B, C. Use dummy-coding with A as the reference level. Model intercept will be mean of A, and parameters will be B-A, and C-A. + + >>> model.fit(factors = {"Col1": ['A','B','C']}) + + Orthogonal Polynomials: Treat Col1 as a factor which 3 levels: A, B, C. Estimate a linear contrast of C > B > A. Model intercept will be grand-mean of all levels, and parameters will be linear contrast, and orthogonal polynomial contrast (auto-computed). + + >>> model.fit(factors = {"Col1": ['A','B','C']}, ordered=True) + + Custom-contrast: Treat Col1 as a factor which 3 levels: A, B, C. Compare A to the mean of B and C. Model intercept will be the grand-mean of all levels, and parameters will be the desired contrast, a well as an automatically determined orthogonal contrast. + + >>> model.fit(factors = {"Col1": {'A': 1, 'B': -.5, 'C': -.5}})) + + Here is an example specifying stricter deviance and paramter values stopping criteria. + + >>> model.fit(control="optCtrl = list(ftol_abs=1e-8, xtol_abs=1e-8)") + + Here is an example specifying a different optimizer in addition to stricter deviance and paramter values stopping criteria. + + >>> model.fit(control="optimizer='Nelder_Mead', optCtrl = list(FtolAbs=1e-8, XtolRel=1e-8)") + + Here is an example using the default optimization in previous versions of lme4 prior to the 2019 update. + + >>> model.fit(old_optimizer=True) + + """ + + # Alllow summary or summarize for compatibility + if "summary" in kwargs and "summarize" in kwargs: + raise ValueError( + "You specified both summary and summarize, please prefer summarize" + ) + summarize = kwargs.pop("summarize", True) + summarize = kwargs.pop("summary", summarize) + # Save params for future calls + self._permute = permute + self._conf_int = conf_int + self._REML = REML if self.family == "gaussian" else False + self._set_R_stdout(verbose) + + if permute is True: + raise TypeError( + "permute should 'False' or the number of permutations to perform" + ) + + if old_optimizer: + if control: + raise ValueError( + "Must specify EITHER control OR old_optimizer not both" + ) + else: + control = "optimizer='bobyqa'" + if factors: + contrasts, dat = self._make_factors(factors, ordered) + else: + contrasts = rinterface.NULL + dat = self.data + + if rank: + if not rank_group: + raise ValueError("rank_group must be provided if rank is True") + dat = _to_ranks_by_group( + self.data, rank_group, self.formula, rank_exclude_cols + ) + if factors and (set(factors.keys()) != set(rank_exclude_cols)): + w = "Factors and ranks requested, but factors are not excluded from rank conversion. Are you sure you wanted to do this?" + warnings.warn(w) + self.warnings.append(w) + if conf_int == "boot": + self.sig_type = "bootstrapped" + else: + if permute: + self.sig_type = "permutation" + " (" + str(permute) + ")" + else: + self.sig_type = "parametric" + + data = pandas2R(dat) + + if self.family == "gaussian": + _fam = "gaussian" + if verbose: + print( + f"Fitting linear model using lmer with {conf_int} confidence intervals...\n" + ) + + lmer = importr("lmerTest") + lmc = robjects.r(f"lmerControl({control})") + self.model_obj = lmer.lmer( + self.formula, data=data, REML=REML, control=lmc, contrasts=contrasts + ) + else: + if verbose: + print( + f"Fitting generalized linear model using glmer (family {self.family}) with {conf_int} confidence intervals...\n" + ) + lmer = importr("lme4") + if self.family == "inverse_gaussian": + _fam = "inverse.gaussian" + elif self.family == "gamma": + _fam = "Gamma" + else: + _fam = self.family + lmc = robjects.r(f"glmerControl({control})") + self.model_obj = lmer.glmer( + self.formula, + data=data, + family=_fam, + control=lmc, + contrasts=contrasts, + ) + + # Store design matrix and get number of IVs for inference + design_matrix = stats.model_matrix(self.model_obj) + # rpy2 > 3.4 returns a numpy array that can be empty but has shape (obs x IVs) + if isinstance(design_matrix, np.ndarray): + if design_matrix.shape[1] > 0: + self.design_matrix = pd.DataFrame(design_matrix) + num_IV = self.design_matrix.shape[1] + else: + num_IV = 0 + # rpy2 < 3.4 returns an R matrix object with a length + elif len(design_matrix): + self.design_matrix = R2pandas(base.data_frame(design_matrix)) + num_IV = self.design_matrix.shape[1] + else: + num_IV = 0 + + if permute and verbose: + print("Using {} permutations to determine significance...".format(permute)) + + summary = base.summary(self.model_obj) + unsum = base.unclass(summary) + + # Do scalars first cause they're easier + + # Get group names separately cause rpy2 > 2.9 is weird and doesnt return them above + try: + self._get_ngrps(unsum, base) + except Exception as _: + print(traceback.format_exc()) + raise Exception( + "The rpy2, lme4, or lmerTest API appears to have changed again. Please file a bug report at https://github.com/ejolly/pymer4/issues with your R, Python, rpy2, lme4, and lmerTest versions and the OS you're running pymer4 on. Apologies." + ) + + # self.AIC = unsum.rx2("AICtab")[0] + # the above is incorrect. The AICtab of summary.lmerMod gives the deviance (which in this context is really + # -2 LogLik, NOT the AIC + self.AIC = R2numpy(stats.AIC(self.model_obj))[0] + self.BIC = R2numpy(stats.BIC(self.model_obj))[0] + self.logLike = R2numpy(unsum.rx2("logLik"))[0] + + # First check for lme4 printed messages (e.g. convergence info is usually here instead of in warnings) + fit_messages = unsum.rx2("optinfo").rx2("conv").rx2("lme4").rx2("messages") + # Then check warnings for additional stuff + fit_warnings = unsum.rx2("optinfo").rx2("warnings") + + try: + fit_warnings = [fw for fw in fit_warnings] + except TypeError: + fit_warnings = [] + try: + fit_messages = [fm for fm in fit_messages] + except TypeError: + fit_messages = [] + + fit_messages_warnings = fit_warnings + fit_messages + if fit_messages_warnings: + self.warnings.extend(fit_messages_warnings) + if not no_warnings: + for warning in self.warnings: + if isinstance(warning, list) | isinstance(warning, np.ndarray): + for w in warning: + print(w + " \n") + else: + print(warning + " \n") + else: + self.warnings = [] + + # Coefficients, and inference statistics + if num_IV != 0: + if self.family in ["gaussian", "gamma", "inverse_gaussian", "poisson"]: + + rstring = ( + """ + function(model){ + out.coef <- data.frame(unclass(summary(model))$coefficients) + out.ci <- data.frame(confint(model,method='""" + + conf_int + + """',nsim=""" + + str(n_boot) + + """)) + n <- c(rownames(out.ci)) + idx <- max(grep('sig',n)) + out.ci <- out.ci[-seq(1:idx),] + out <- cbind(out.coef,out.ci) + list(out,rownames(out)) + } + """ + ) + estimates_func = robjects.r(rstring) + out_summary, out_rownames = estimates_func(self.model_obj) + df = R2pandas(out_summary) + dfshape = df.shape[1] + df.index = list(out_rownames) + + # gaussian + if dfshape == 7: + df.columns = [ + "Estimate", + "SE", + "DF", + "T-stat", + "P-val", + "2.5_ci", + "97.5_ci", + ] + df = df[ + ["Estimate", "2.5_ci", "97.5_ci", "SE", "DF", "T-stat", "P-val"] + ] + + # gamma, inverse_gaussian + elif dfshape == 6: + if self.family in ["gamma", "inverse_gaussian"]: + df.columns = [ + "Estimate", + "SE", + "T-stat", + "P-val", + "2.5_ci", + "97.5_ci", + ] + df = df[ + ["Estimate", "2.5_ci", "97.5_ci", "SE", "T-stat", "P-val"] + ] + else: + # poisson + df.columns = [ + "Estimate", + "SE", + "Z-stat", + "P-val", + "2.5_ci", + "97.5_ci", + ] + df = df[ + ["Estimate", "2.5_ci", "97.5_ci", "SE", "Z-stat", "P-val"] + ] + + # Incase lmerTest chokes it won't return p-values + elif dfshape == 5 and self.family == "gaussian": + if not permute: + warnings.warn( + "MODELING FIT WARNING! Check model.warnings!! P-value computation did not occur because lmerTest choked. Possible issue(s): ranefx have too many parameters or too little variance..." + ) + df.columns = ["Estimate", "SE", "T-stat", "2.5_ci", "97.5_ci"] + df = df[["Estimate", "2.5_ci", "97.5_ci", "SE", "T-stat"]] + + elif self.family == "binomial": + + rstring = ( + """ + function(model){ + out.coef <- data.frame(unclass(summary(model))$coefficients) + out.ci <- data.frame(confint(model,method='""" + + conf_int + + """',nsim=""" + + str(n_boot) + + """)) + n <- c(rownames(out.ci)) + idx <- max(grep('sig',n)) + out.ci <- out.ci[-seq(1:idx),] + out <- cbind(out.coef,out.ci) + odds <- exp(out.coef[1]) + colnames(odds) <- "OR" + probs <- odds / (1 + odds) + colnames(probs) <- "Prob" + odds.ci <- exp(out.ci) + colnames(odds.ci) <- c("OR_2.5_ci","OR_97.5_ci") + probs.ci <- odds.ci / (1 + odds.ci) + if(ncol(probs.ci) == 1){ + probs.ci = t(probs.ci) + } + colnames(probs.ci) <- c("Prob_2.5_ci","Prob_97.5_ci") + out <- cbind(out,odds,odds.ci,probs,probs.ci) + list(out,rownames(out)) + } + """ + ) + + estimates_func = robjects.r(rstring) + out_summary, out_rownames = estimates_func(self.model_obj) + df = R2pandas(out_summary) + df.index = list(out_rownames) + df.columns = [ + "Estimate", + "SE", + "Z-stat", + "P-val", + "2.5_ci", + "97.5_ci", + "OR", + "OR_2.5_ci", + "OR_97.5_ci", + "Prob", + "Prob_2.5_ci", + "Prob_97.5_ci", + ] + df = df[ + [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "OR", + "OR_2.5_ci", + "OR_97.5_ci", + "Prob", + "Prob_2.5_ci", + "Prob_97.5_ci", + "Z-stat", + "P-val", + ] + ] + + if permute: + perm_dat = dat.copy() + dv_var = self.formula.split("~")[0].strip() + grp_vars = list(self.grps.keys()) + perms = [] + for _ in range(permute): + perm_dat[dv_var] = perm_dat.groupby(grp_vars)[dv_var].transform( + lambda x: x.sample(frac=1) + ) + if self.family == "gaussian": + perm_obj = lmer.lmer(self.formula, data=perm_dat, REML=REML) + else: + perm_obj = lmer.glmer(self.formula, data=perm_dat, family=_fam) + perms.append(_return_t(perm_obj)) + perms = np.array(perms) + pvals = [] + for c in range(df.shape[0]): + if self.family in ["gaussian", "gamma", "inverse_gaussian"]: + pvals.append(_perm_find(perms[:, c], df["T-stat"][c])) + else: + pvals.append(_perm_find(perms[:, c], df["Z-stat"][c])) + df["P-val"] = pvals + if "DF" in df.columns: + df["DF"] = [permute] * df.shape[0] + df = df.rename(columns={"DF": "Num_perm", "P-val": "Perm-P-val"}) + else: + df["Num_perm"] = [permute] * df.shape[0] + df = df.rename(columns={"P-val": "Perm-P-val"}) + + if "P-val" in df.columns: + df = df.assign(Sig=df["P-val"].apply(lambda x: _sig_stars(x))) + elif "Perm-P-val" in df.columns: + df = df.assign(Sig=df["Perm-P-val"].apply(lambda x: _sig_stars(x))) + + if (conf_int == "boot") and (permute is None): + # We're computing parametrically bootstrapped ci's so it doesn't make sense to use approximation for p-values. Instead remove those from the output and make significant inferences based on whether the bootstrapped ci's cross 0. + df = df.drop(columns=["P-val", "Sig"]) + if "DF" in df.columns: + df = df.drop(columns="DF") + df["Sig"] = df.apply( + lambda row: "*" if row["2.5_ci"] * row["97.5_ci"] > 0 else "", + axis=1, + ) + + # Because all models except lmm have no DF column make sure Num_perm gets put in the right place + if permute: + if self.family != "gaussian": + cols = list(df.columns) + col_order = cols[:-4] + ["Num_perm"] + cols[-4:-2] + [cols[-1]] + df = df[col_order] + + self.coefs = df + # Make sure the design matrix column names match population coefficients + self.design_matrix.columns = self.coefs.index[:] + else: + self.coefs = None + if permute or conf_int == "boot": + print( + "**NOTE**: Non-parametric inference only applies to fixed effects and none were estimated\n" + ) + + self.fitted = True + + # Random effect variances and correlations + varcor_NAs = ["NA", "N", robjects.NA_Character] # NOQA + df = R2pandas(base.data_frame(unsum.rx2("varcor"))) + ran_vars = df.query("var2 in @varcor_NAs").drop("var2", axis=1) + ran_vars.index = ran_vars["grp"] + ran_vars.drop("grp", axis=1, inplace=True) + ran_vars.columns = ["Name", "Var", "Std"] + ran_vars.index.name = None + ran_vars.replace("NA", "", inplace=True) + ran_vars = ran_vars.applymap( + lambda x: np.nan if x == robjects.NA_Character else x + ) + ran_vars.replace(np.nan, "", inplace=True) + + ran_corrs = df.query("var2 not in @varcor_NAs").drop("vcov", axis=1) + if ran_corrs.shape[0] != 0: + ran_corrs.index = ran_corrs["grp"] + ran_corrs.drop("grp", axis=1, inplace=True) + ran_corrs.columns = ["IV1", "IV2", "Corr"] + ran_corrs.index.name = None + ran_corrs = ran_corrs.applymap( + lambda x: np.nan if x == robjects.NA_Character else x + ) + ran_corrs.replace(np.nan, "", inplace=True) + else: + ran_corrs = None + + self.ranef_var = ran_vars + self.ranef_corr = ran_corrs + + # Cluster (e.g subject) level coefficients + rstring = """ + function(model){ + getIndex <- function(df){ + orignames <- names(df) + df <- transform(df, index=row.names(df)) + names(df) <- append(orignames, c("index")) + df + } + out <- coef(model) + out <- lapply(out, getIndex) + out + } + """ + fixef_func = robjects.r(rstring) + fixefs = fixef_func(self.model_obj) + fixefs = [R2pandas(e).drop(columns=["index"]) for e in fixefs] + if len(fixefs) > 1: + if self.coefs is not None: + f_corrected_order = [] + for f in fixefs: + f_corrected_order.append( + pd.DataFrame( + f[ + list(self.coefs.index) + + [ + elem + for elem in f.columns + if elem not in self.coefs.index + ] + ] + ) + ) + self.fixef = f_corrected_order + else: + self.fixef = list(fixefs) + else: + self.fixef = fixefs[0] + if self.coefs is not None: + self.fixef = self.fixef[ + list(self.coefs.index) + + [ + elem + for elem in self.fixef.columns + if elem not in self.coefs.index + ] + ] + + # Sort column order to match population coefs + # This also handles cases in which random slope terms exist in the model without corresponding fixed effects terms, which generates extra columns in this dataframe. By default put those columns *after* the fixed effect columns of interest (i.e. population coefs) + + # Cluster (e.g subject) level random deviations + rstring = """ + function(model){ + uniquify <- function(df){ + colnames(df) <- make.unique(colnames(df)) + df + } + getIndex <- function(df){ + df <- transform(df, index=row.names(df)) + df + } + out <- lapply(ranef(model),uniquify) + out <- lapply(out, getIndex) + out + } + """ + ranef_func = robjects.r(rstring) + ranefs = ranef_func(self.model_obj) + if len(ranefs) > 1: + self.ranef = [R2pandas(e).drop(columns=["index"]) for e in ranefs] + else: + self.ranef = R2pandas(ranefs[0]).drop(columns=["index"]) + + # Model residuals + rstring = """ + function(model){ + out <- resid(model) + out + } + """ + resid_func = robjects.r(rstring) + self.residuals = np.array(resid_func(self.model_obj)) + try: + self.data["residuals"] = copy(self.residuals) + except ValueError as _: # NOQA + print( + "**NOTE**: Column for 'residuals' not created in model.data, but saved in model.resid only. This is because you have rows with NaNs in your data.\n" + ) + + # Model fits + rstring = """ + function(model){ + out <- fitted(model) + out + } + """ + fit_func = robjects.r(rstring) + self.fits = fit_func(self.model_obj) + try: + self.data["fits"] = copy(self.fits) + except ValueError as _: # NOQA + print( + "**NOTE** Column for 'fits' not created in model.data, but saved in model.fits only. This is because you have rows with NaNs in your data.\n" + ) + + if summarize: + return self.summary()
    + +
    [docs] def simulate(self, num_datasets, use_rfx=True, verbose=False): + """ + Simulate new responses based upon estimates from a fitted model. By default group/cluster means for simulated data will match those of the original data. Unlike predict, this is a non-deterministic operation because lmer will sample random-efects values for all groups/cluster and then sample data points from their respective conditional distributions. + + Args: + num_datasets (int): number of simulated datasets to generate. Each simulation always generates a dataset that matches the size of the original data + use_rfx (bool): wehther to match group/cluster means in simulated data + verbose (bool): whether to print R messages to console + + Returns: + np.ndarray: simulated data values + """ + + self._set_R_stdout(verbose) + + if isinstance(num_datasets, float): + num_datasets = int(num_datasets) + if not isinstance(num_datasets, int): + raise ValueError("num_datasets must be an integer") + + if use_rfx: + re_form = "NULL" + else: + re_form = "NA" + + rstring = ( + """ + function(model){ + out <- simulate(model,""" + + str(num_datasets) + + """,allow.new.levels=TRUE,re.form=""" + + re_form + + """) + out + } + """ + ) + simulate_func = robjects.r(rstring) + sims = simulate_func(self.model_obj) + out = R2pandas(sims) + return out
    + +
    [docs] def predict( + self, + data, + use_rfx=True, + pred_type="response", + skip_data_checks=False, + verify_predictions=True, + verbose=False, + ): + """ + Make predictions given new data. Input must be a dataframe that contains the + same columns as the model.matrix excluding the intercept (i.e. all the predictor + variables used to fit the model). If using random effects to make predictions, + input data must also contain a column for the group identifier that were used to + fit the model random effects terms. Using random effects to make predictions + only makes sense if predictions are being made about the same groups/clusters. + If any predictors are categorical, you can skip verifying column names by + setting `skip_data_checks=True`. + + Args: + data (pandas.core.frame.DataFrame): input data to make predictions on + use_rfx (bool): whether to condition on random effects when making + predictions; Default True + pred_type (str): whether the prediction should be on the 'response' scale + (default); or on the 'link' scale of the predictors passed through the link + function (e.g. log-odds scale in a logit model instead of probability + values) + skip_data_checks (bool): whether to skip checks that input data have the + same columns as the original data the model were trained on. If predicting + using a model trained with categorical variables it can be helpful to set + this to False. Default True + verify_predictions (bool): whether to ensure that the predicted data are not + identical to original model fits. Only useful to set this to False when + making predictions on the same data the model was fit on, but its faster to + access these directly from model.fits or model.data['fits']. Default True + verbose (bool): whether to print R messages to console + + Returns: + np.ndarray: prediction values + + """ + self._set_R_stdout(verbose) + if self.design_matrix is None: + raise ValueError( + "No fixed effects were estimated so prediction is not possible!" + ) + if not skip_data_checks: + required_cols = self.design_matrix.columns[1:] + if not all([col in data.columns for col in required_cols]): + raise ValueError( + "Column names do not match all fixed effects model terms!\nThis may be a false error if some predictors are categorical, in which case you can bypass this check by setting skip_data_checks=True." + ) + + if use_rfx: + if not skip_data_checks: + required_cols = set(list(required_cols) + list(self.grps.keys())) + if not all([col in data.columns for col in required_cols]): + raise ValueError( + "Column names are missing random effects model grouping terms!" + ) + + re_form = "NULL" + else: + re_form = "NA" + + rstring = ( + """ + function(model,new){ + out <- predict(model,new,allow.new.levels=TRUE,re.form=""" + + re_form + + """,type='""" + + pred_type + + """') + out + } + """ + ) + + predict_func = robjects.r(rstring) + preds = predict_func(self.model_obj, pandas2R(data)) + if verify_predictions: + self._verify_preds(preds, use_rfx) + return preds
    + + def _verify_preds(self, preds, use_rfx): + """ + Verify that the output of .predict given new data is not identitical to the + model's fits from the data it was trained on. This is necessary because + `predict()` in R will silently fallback to return the same predicted values when + given input data with no matching columns, but with `use_rfx=False` + + Args: + preds (np.array): output of self.predict() + use_rfx (bool): same input parameter as self.predict + + Raises: + ValueError: If predictions match model fits from original data + """ + training_preds = self.predict( + self.data, use_rfx=use_rfx, skip_data_checks=True, verify_predictions=False + ) + mess = "(using rfx)" if use_rfx else "(without rfx)" + + if np.allclose(training_preds, preds): + raise ValueError( + f"Predictions are identitical to fitted values {mess}!!\nYou can ignore this error if you intended to predict using the same data the model was trained on by setting verify_predictions=False. If you didn't, then its likely that some or all of the column names in your test data don't match the column names from the data the model was trained on and you set skip_data_checks=True." + ) + +
    [docs] def summary(self): + """ + Summarize the output of a fitted model. + + Returns: + pd.DataFrame: R/statsmodels style summary + + """ + + if not self.fitted: + raise RuntimeError("Model must be fitted to generate summary!") + if self._REML: + print("Linear mixed model fit by REML [’lmerMod’]") + else: + print("Linear mixed model fit by maximum likelihood ['lmerMod']") + + print("Formula: {}\n".format(self.formula)) + print("Family: {}\t Inference: {}\n".format(self.family, self.sig_type)) + print( + "Number of observations: %s\t Groups: %s\n" + % (self.data.shape[0], self.grps) + ) + print("Log-likelihood: %.3f \t AIC: %.3f\n" % (self.logLike, self.AIC)) + print("Random effects:\n") + print("%s\n" % (self.ranef_var.round(3))) + if self.ranef_corr is not None: + print("%s\n" % (self.ranef_corr.round(3))) + else: + print("No random effect correlations specified\n") + if self.coefs is None: + print("No fixed effects estimated\n") + return + else: + print("Fixed effects:\n") + return self.coefs.round(3)
    + +
    [docs] def post_hoc( + self, + marginal_vars, + grouping_vars=None, + p_adjust="tukey", + summarize=True, + dof_asymptotic_at=99999, + verbose=False, + ): + """ + Post-hoc pair-wise tests corrected for multiple comparisons (Tukey method) implemented using the emmeans package. This method provide both marginal means/trends along with marginal pairwise differences. More info can be found at: https://cran.r-project.org/web/packages/emmeans/emmeans.pdf + + Args: + marginal_var (str/list): what variable(s) to compute marginal means/trends for; unique combinations of factor levels of these variable(s) will determine family-wise error correction + grouping_vars (str/list): what variable(s) to group on. Trends/means/comparisons of other variable(s), will be computed at each level of these variable(s) + p_adjust (str): multiple comparisons adjustment method. One of: tukey, bonf, fdr, hochberg, hommel, holm, dunnet, mvt (monte-carlo multi-variate T, aka exact tukey/dunnet). Default tukey + summarize (bool): output effects and contrasts or don't (always stored in + model object as model.marginal_estimates and model.marginal_contrasts); + default True + dof_asymptotic_at (int, optional): at what number of observations to + assuming a normal distribution and return z-stats instead of t-stats; + Default 100000 which differs from emmeans default of 3000 + verbose (bool): whether to print R messages to the console + + Returns: + Multiple: + - **marginal_estimates** (*pd.Dataframe*): unique factor level effects (e.g. means/coefs) + + - **marginal_contrasts** (*pd.DataFrame*): contrasts between factor levels + + Examples: + + Pairwise comparison of means of A at each level of B + + >>> model.post_hoc(marginal_vars='A',grouping_vars='B') + + Pairwise differences of slopes of C between levels of A at each level of B + + >>> model.post_hoc(marginal_vars='C',grouping_vars=['A','B']) + + Pairwise differences of each unique A,B cell + + >>> model.post_hoc(marginal_vars=['A','B']) + + """ + + self._set_R_stdout(verbose) + + if not marginal_vars: + raise ValueError("Must provide marginal_vars") + + if not self.fitted: + raise RuntimeError("Model must be fitted to generate post-hoc comparisons") + + if verbose and self.data.shape[0] >= dof_asymptotic_at: + warnings.warn( + f"Number of observations {self.data.shape[0]} exceeds dof_symptotic_at={dof_asymptotic_at}. Returning z-stats" + ) + + if not isinstance(marginal_vars, list): + marginal_vars = [marginal_vars] + + if p_adjust is None: + p_adjust = "none" + + if grouping_vars and not isinstance(grouping_vars, list): + grouping_vars = [grouping_vars] + # Conditional vars can only be factor types + if not all([elem in self.factors.keys() for elem in grouping_vars]): + raise ValueError( + "All grouping_vars must be existing categorical variables (i.e. factors)" + ) + + # Need to figure out if marginal_vars is continuous or not to determine lstrends or emmeans call + cont, factor = [], [] + for var in marginal_vars: + if not self.factors or var not in self.factors.keys(): + cont.append(var) + else: + factor.append(var) + + if cont: + if factor: + raise ValueError( + "With more than one marginal variable, all variables must be categorical factors. Mixing continuous and categorical variables is not supported. Try passing additional categorical factors to grouping_vars" + "" + ) + else: + if len(cont) > 1: + raise ValueError( + "Marginal variables can only contain one continuous variable" + ) + elif len(cont) == 1: + if grouping_vars: + # Emtrends; there's a bug for trends where options don't get set by default so an empty list is passed to R, see: https://bit.ly/2VJ9QZM + cont = cont[0] + if len(grouping_vars) > 1: + g1 = grouping_vars[0] + _conditional = "+".join(grouping_vars[1:]) + + rstring = ( + """ + function(model){ + suppressMessages(library(emmeans)) + out <- emtrends(model,pairwise ~ """ + + g1 + + """|""" + + _conditional + + """,var='""" + + cont + + """',adjust='""" + + p_adjust + + """',options=list(),lmer.df='satterthwaite',lmerTest.limit='""" + + str(dof_asymptotic_at) + + """') + out + }""" + ) + else: + rstring = ( + """ + function(model){ + suppressMessages(library(emmeans)) + out <- emtrends(model,pairwise ~ """ + + grouping_vars[0] + + """,var='""" + + cont + + """',adjust='""" + + p_adjust + + """',options=list(),lmer.df='satterthwaite',lmerTest.limit='""" + + str(dof_asymptotic_at) + + """') + out + }""" + ) + + else: + raise ValueError( + "grouping_vars are required with a continuous marginal_vars" + ) + else: + if factor: + _marginal = "+".join(factor) + if grouping_vars: + # emmeans with pipe + _conditional = "+".join(grouping_vars) + rstring = ( + """ + function(model){ + suppressMessages(library(emmeans)) + out <- emmeans(model,pairwise ~ """ + + _marginal + + """|""" + + _conditional + + """, adjust='""" + + p_adjust + + """',lmer.df='satterthwaite',lmerTest.limit='""" + + str(dof_asymptotic_at) + + """') + out + }""" + ) + else: + # emmeans without pipe + rstring = ( + """ + function(model){ + suppressMessages(library(emmeans)) + out <- emmeans(model,pairwise ~ """ + + _marginal + + """,adjust='""" + + p_adjust + + """',lmer.df='satterthwaite',lmerTest.limit='""" + + str(dof_asymptotic_at) + + """') + out + }""" + ) + else: + raise ValueError("marginal_vars are not in model!") + + func = robjects.r(rstring) + res = func(self.model_obj) + emmeans = importr("emmeans") + + # Marginal estimates + self.marginal_estimates = R2pandas(base.summary(res)[0]) + # Resort columns + effect_names = list(self.marginal_estimates.columns[:-4]) + # this column name changes depending on whether we're doing post-hoc trends or means + effname = effect_names[-1] + sortme = effect_names[:-1] + ["Estimate", "2.5_ci", "97.5_ci", "SE", "DF"] + + # In emmeans (compared to lsmeans) the CI column names change too depending on how many factor variabls are in the model + if "asymp.LCL" in self.marginal_estimates.columns: + self.marginal_estimates = self.marginal_estimates.rename( + columns={ + effname: "Estimate", + "df": "DF", + "asymp.LCL": "2.5_ci", + "asymp.UCL": "97.5_ci", + } + )[sortme] + elif "lower.CL" in self.marginal_estimates.columns: + self.marginal_estimates = self.marginal_estimates.rename( + columns={ + effname: "Estimate", + "df": "DF", + "lower.CL": "2.5_ci", + "upper.CL": "97.5_ci", + } + )[sortme] + else: + raise ValueError( + f"Cannot figure out what emmeans is naming marginal CI columns. Expected 'lower.CL' or 'asymp.LCL', but columns are {self.marginal_estimates.columns}" + ) + + # Marginal Contrasts + self.marginal_contrasts = R2pandas(base.summary(res)[1]) + if "t.ratio" in self.marginal_contrasts.columns: + rename_dict = { + "t.ratio": "T-stat", + "p.value": "P-val", + "estimate": "Estimate", + "df": "DF", + "contrast": "Contrast", + } + sorted_names = [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "DF", + "T-stat", + "P-val", + ] + elif "z.ratio" in self.marginal_contrasts.columns: + rename_dict = { + "z.ratio": "Z-stat", + "p.value": "P-val", + "estimate": "Estimate", + "df": "DF", + "contrast": "Contrast", + } + sorted_names = [ + "Estimate", + "2.5_ci", + "97.5_ci", + "SE", + "DF", + "Z-stat", + "P-val", + ] + else: + raise ValueError( + f"Cannot figure out what emmeans is naming contrast means columns. Expected 't.ratio' or 'z.ratio', but columns are: {self.marginal_contrasts.columns}" + ) + + self.marginal_contrasts = self.marginal_contrasts.rename(columns=rename_dict) + + # Need to make another call to emmeans to get confidence intervals on contrasts + confs = R2pandas(base.unclass(emmeans.confint_emmGrid(res))[1]) + confs = confs.iloc[:, -2:] + # Deal with changing column names again + if "asymp.LCL" in confs.columns: + confs = confs.rename( + columns={"asymp.LCL": "2.5_ci", "asymp.UCL": "97.5_ci"} + ) + elif "lower.CL" in confs.columns: + confs = confs.rename(columns={"lower.CL": "2.5_ci", "upper.CL": "97.5_ci"}) + else: + raise ValueError( + f"Cannot figure out what emmeans is naming contrast CI columns. Expected 'lower.CL' or 'asymp.LCL', but columns are {self.marginal_estimates.columns}" + ) + + self.marginal_contrasts = pd.concat([self.marginal_contrasts, confs], axis=1) + # Resort columns + effect_names = list(self.marginal_contrasts.columns[:-7]) + sortme = effect_names + sorted_names + self.marginal_contrasts = self.marginal_contrasts[sortme] + self.marginal_contrasts["Sig"] = self.marginal_contrasts["P-val"].apply( + _sig_stars + ) + + if summarize: + if ( + p_adjust == "tukey" + and self.marginal_contrasts.shape[0] >= self.marginal_estimates.shape[0] + ): + print( + "P-values adjusted by tukey method for family of {} estimates".format( + self.marginal_contrasts["Contrast"].nunique() + ) + ) + elif p_adjust != "tukey": + print( + "P-values adjusted by {} method for {} comparisons".format( + p_adjust, self.marginal_contrasts["Contrast"].nunique() + ) + ) + return self.marginal_estimates.round(3), self.marginal_contrasts.round(3)
    + +
    [docs] def plot_summary( + self, + figsize=(12, 6), + error_bars="ci", + ranef=True, + axlim=None, + plot_intercept=True, + ranef_alpha=0.5, + coef_fmt="o", + orient="v", + ranef_idx=0, + ): + """ + Create a forestplot overlaying estimated coefficients with random effects (i.e. BLUPs). By default display the 95% confidence intervals computed during fitting. + + Args: + error_bars (str): one of 'ci' or 'se' to change which error bars are plotted; default 'ci' + ranef (bool): overlay BLUP estimates on figure; default True + axlim (tuple): lower and upper limit of plot; default min and max of BLUPs + plot_intercept (bool): plot the intercept estimate; default True + ranef_alpha (float): opacity of random effect points; default .5 + coef_fmt (str): matplotlib marker style for population coefficients + ranef_idx (int): if multiple random effects clusters were specified this value indicates which one should be plotted; uses 0-based indexing; default 0 (first) + + Returns: + plt.axis: matplotlib axis handle + """ + + if not self.fitted: + raise RuntimeError("Model must be fit before plotting!") + if orient not in ["h", "v"]: + raise ValueError("orientation must be 'h' or 'v'") + + if isinstance(self.fixef, list): + m_ranef = self.fixef[ranef_idx] + else: + m_ranef = self.fixef + m_fixef = self.coefs + + if not plot_intercept: + m_ranef = m_ranef.drop("(Intercept)", axis=1) + m_fixef = m_fixef.drop("(Intercept)", axis=0) + + if error_bars == "ci": + col_lb = (m_fixef["Estimate"] - m_fixef["2.5_ci"]).values + col_ub = (m_fixef["97.5_ci"] - m_fixef["Estimate"]).values + elif error_bars == "se": + col_lb, col_ub = m_fixef["SE"], m_fixef["SE"] + + # For seaborn + m = pd.melt(m_ranef) + + _, ax = plt.subplots(1, 1, figsize=figsize) + + if ranef: + alpha_plot = ranef_alpha + else: + alpha_plot = 0 + + if orient == "v": + x_strip = "value" + x_err = m_fixef["Estimate"] + y_strip = "variable" + y_err = range(m_fixef.shape[0]) + xerr = [col_lb, col_ub] + yerr = None + ax.vlines( + x=0, ymin=-1, ymax=self.coefs.shape[0], linestyles="--", color="grey" + ) + if not axlim: + xlim = (m["value"].min() - 1, m["value"].max() + 1) + else: + xlim = axlim + ylim = None + else: + y_strip = "value" + y_err = m_fixef["Estimate"] + x_strip = "variable" + x_err = range(m_fixef.shape[0]) + yerr = [col_lb, col_ub] + xerr = None + ax.hlines( + y=0, xmin=-1, xmax=self.coefs.shape[0], linestyles="--", color="grey" + ) + if not axlim: + ylim = (m["value"].min() - 1, m["value"].max() + 1) + else: + ylim = axlim + xlim = None + + sns.stripplot( + x=x_strip, y=y_strip, data=m, ax=ax, size=6, alpha=alpha_plot, color="grey" + ) + + ax.errorbar( + x=x_err, + y=y_err, + xerr=xerr, + yerr=yerr, + fmt=coef_fmt, + capsize=0, + elinewidth=4, + color="black", + ms=12, + zorder=9999999999, + ) + + ax.set(ylabel="", xlabel="Estimate", xlim=xlim, ylim=ylim) + sns.despine(top=True, right=True, left=True) + return ax
    + +
    [docs] def plot( + self, + param, + figsize=(8, 6), + xlabel="", + ylabel="", + plot_fixef=True, + plot_ci=True, + grps=[], + ax=None, + ): + """ + Plot random and group level parameters from a fitted model + + Args: + param (str): model parameter (column name) to plot + figsize (tup): matplotlib desired figsize + xlabel (str): x-axis label + ylabel (str): y-axis label + plot_fixef (bool): plot population effect fit of param?; default True + plot_ci (bool): plot computed ci's of population effect?; default True + grps (list): plot specific group fits only; must correspond to index values in model.fixef + ax (matplotlib.axes.Axes): axis handle for an existing plot; if provided will ensure that random parameter plots appear *behind* all other plot objects. + + Returns: + plt.axis: matplotlib axis handle + + """ + + if not self.fitted: + raise RuntimeError("Model must be fit before plotting!") + if self.factors: + raise NotImplementedError( + "Plotting can currently only handle models with continuous predictors!" + ) + if isinstance(self.fixef, list) or isinstance(self.ranef, list): + raise NotImplementedError( + "Plotting can currently only handle models with 1 random effect grouping variable!" + ) + if self.design_matrix is None: + raise ValueError( + "No fixed effects were estimated so prediction is not possible!" + ) + if not ax: + _, ax = plt.subplots(1, 1, figsize=figsize) + + # Get range of unique values for desired parameter + x_vals = self.design_matrix[param].unique() + # Sort order to handle bug in matplotlib plotting + idx = np.argsort(x_vals) + + # Get desired parameter part of the prediction + fixef_pred = ( + self.coefs.loc["(Intercept)", "Estimate"] + + self.coefs.loc[param, "Estimate"] * x_vals + ) + fixef_pred_upper = ( + self.coefs.loc["(Intercept)", "97.5_ci"] + + self.coefs.loc[param, "97.5_ci"] * x_vals + ) + fixef_pred_lower = ( + self.coefs.loc["(Intercept)", "2.5_ci"] + + self.coefs.loc[param, "2.5_ci"] * x_vals + ) + + if grps: + if all(isinstance(x, int) for x in grps): + ran_dat = self.fixef.iloc[grps, :] + elif all(isinstance(x, str) for x in grps): + ran_dat = self.fixef.loc[grps, :] + else: + raise TypeError( + "grps must be integer list for integer-indexing (.iloc) of fixed effects, or label list for label-indexing (.loc) of fixed effects" + ) + else: + ran_dat = self.fixef + + # Now generate random effects predictions + for _, row in ran_dat.iterrows(): + + ranef_desired = row["(Intercept)"] + row[param] * x_vals + # ranef_other = np.dot(other_vals_means, row.loc[other_vals]) + pred = ranef_desired # + ranef_other + + ax.plot(x_vals[idx], pred[idx], "-", linewidth=2) + + if plot_fixef: + ax.plot( + x_vals[idx], + fixef_pred[idx], + "--", + color="black", + linewidth=3, + zorder=9999999, + ) + + if plot_ci: + ax.fill_between( + x_vals[idx], + fixef_pred_lower[idx], + fixef_pred_upper[idx], + facecolor="black", + alpha=0.25, + zorder=9999998, + ) + + ax.set( + ylim=(self.data.fits.min(), self.data.fits.max()), + xlim=(x_vals.min(), x_vals.max()), + xlabel=param, + ylabel=self.formula.split("~")[0].strip(), + ) + if xlabel: + ax.set_xlabel(xlabel) + if ylabel: + ax.set_ylabel(ylabel) + return ax
    + +
    [docs] def confint( + self, + parm=None, + level=0.95, + method="Wald", + zeta=None, + nsim=500, + boot_type="perc", + quiet=False, + oldnames=False, + seed=None, + ): + """ + Compute confidence intervals on the parameters of a Lmer object (this is a wrapper for confint.merMod in lme4). + Args: + self (Lmer): the Lmer object for which confidence intervals should be computed + parm (list of str): parameter names for which intervals are sought. Specified by an integer vector of positions + (leave blank to compute ci for all parameters) + level (float): confidence level <1, typically above 0.90 + method (str): which method to compute confidence intervals; 'profile', 'Wald' (default), or 'boot' + (parametric bootstrap) + zeta (float): (for method = "profile" only:) likelihood cutoff (if not specified, as by default, computed + from level in R). + nsim (int): number of bootstrap intervals if bootstrapped confidence intervals are requests; default 500 + boot_type (str): bootstrap confidence interval type (one of "perc","basic","norm", as defined in boot_ci in R) + quiet (bool): (logical) suppress messages about computationally intensive profiling? + oldnames: (logical) use old-style names for variance-covariance parameters, e.g. ".sig01", rather than newer + (more informative) names such as "sd_(Intercept)|Subject"? + seed (int): seed to be passed to bootMer for repeatability. + + Returns: + pd.DataFrame: confidence intervals for the parameters of interest + + Examples: + The following examples demonstrate how to get different types of confidence intervals. + + The default Wald estimates for all parameters + + >>> model.confint() + + Boostrap estimate for the variance component of the random intercept from factor "Group" and the error + variance. You will need more than 100 repeats for a real application + + >>> model.confint(method="boot", nsim=100, parm=["sd_(Intercept)|Group","sigma"]) + + Same as above but using oldnames for those variances, which is still the devault in lme4 + + >>> model.confint(method="boot", nsim=100, oldnames=True, parm=[".sig01",".sigma"]) + + """ + + # record messages going to screen + r_console = [] + + def _f(x): + r_console.append(x) + + callbacks.consolewrite_warnerror = _f + # create string for parm + parm_string = "" + if parm is not None: + parm_string = """,parm=c('""" + for i, this_parm in enumerate(parm): + if i != 0: + parm_string = parm_string + """,'""" + parm_string = parm_string + this_parm + """'""" + parm_string = parm_string + """)""" + # create string of command + rstring = ( + """ + function(model){ + out_ci <- as.data.frame(confint(model""" + + parm_string + + """,level=""" + + str(level) + + """,method='""" + + method + + """'""" + + ((""",zeta=""" + str(zeta)) if zeta is not None else """""") + + ((""",seed=""" + str(seed)) if seed is not None else """""") + + """,nsim=""" + + str(nsim) + + """,boot.type='""" + + boot_type + + """'""" + + """,quiet=""" + + ("""TRUE""" if quiet else """FALSE""") + + """,oldNames=""" + + ("""TRUE""" if oldnames else """FALSE""") + + """)) + out_ci + }""" + ) + confint_func = robjects.r(rstring) + out_summary = confint_func(self.model_obj) + out_summary = R2pandas(out_summary) + + # restore outputs + callbacks.consolewrite_warnerror = consolewrite_warning_backup + for message in r_console: + print(message) + return out_summary
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/simulate.html b/_modules/pymer4/simulate.html new file mode 100644 index 0000000..ba15da2 --- /dev/null +++ b/_modules/pymer4/simulate.html @@ -0,0 +1,433 @@ + + + + + + + pymer4.simulate — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.simulate

    +from __future__ import division
    +import numpy as np
    +import pandas as pd
    +from scipy.spatial.distance import squareform
    +from pymer4.utils import isPSD, nearestPSD
    +from pymer4.stats import discrete_inverse_logit
    +
    +__all__ = ["easy_multivariate_normal", "simulate_lm", "simulate_lmm"]
    +
    +__author__ = ["Eshin Jolly"]
    +__license__ = "MIT"
    +
    +
    +
    [docs]def simulate_lm( + num_obs, + num_coef, + coef_vals=None, + corrs=None, + mus=0.0, + sigmas=1.0, + noise_params=(0, 1), + family="gaussian", + seed=None, +): + """ + Function to quickly simulate a regression model dataset, with continuous predictors. + Provided a number of observations, number of coefficients, and optionally correlations between predictors, means, and standard deviations of predictors, returns a pandas dataframe with simulated data that can be used to estimate a linear regression using Lm(). Using the family='binomial' argument can generate discrete dependent variable values for use with logistic regression. + + Defaults to returning standard normal (mu = 0; sigma = 1) predictors with no explicit correlations. + + Args: + num_obs (int): number of total observations, i.e. rows of data + num_coef (int): number of coefficients/regressors, i.e. columns of data + coef_vals (list,optional): "true" values of coefficients to generate data. If not provided will be randomly generated. Must include a coefficient for the intercept as well (i.e. mean of data) + corrs (ndarray,list,float): correlations between coefficients provided as 2d num_coef x num_coef, 1d flattend numpy array/list of length (num_features * (num_features-1)) / 2, or a float to be treated as the same correlation between all coefficients + mus (float/list/ndarray): means of columns of predictors + sigmas (float/list/ndarray): stds of columns of predictors + noise_params (tup, optional): mean and std of noise added to simulated data + family (str): distribution family for the dependent variable. Currently only 'gaussian' (continuous DV) or 'binomial' (discrete DV) are available. + seed (int): seed for reproducible random number generation + + Returns: + Multiple: + + - **data** (*pd.DataFrame*): dataframe organized as num_obs x num_coef + + - **coefs** (*np.array*): ground-truth coefficient values + + """ + + if seed is not None: + np.random.seed(seed) + + if coef_vals is not None: + if len(coef_vals) - num_coef == 0: + raise ValueError( + "Missing one coefficient value. Did you provide a value for the intercept term?" + ) + else: + assert ( + len(coef_vals) == num_coef + 1 + ), "Number of coefficient values should be num_coef + 1 (for intercept)" + + b = coef_vals + else: + b = np.random.rand(num_coef + 1) + + if isinstance(mus, list) or isinstance(mus, np.ndarray): + assert len(mus) == len(b) - 1, "mus must match number of num_coef" + if isinstance(sigmas, list) or isinstance(sigmas, np.ndarray): + assert len(sigmas) == len(b) - 1, "sigmas must match number of num_coef" + assert ( + isinstance(noise_params, tuple) and len(noise_params) == 2 + ), "noise_params should be a tuple of (mean,std)" + + # Generate random design matrix + if corrs is not None: + X = easy_multivariate_normal(num_obs, num_coef, corrs, mus, sigmas, seed) + else: + X = np.random.normal(mus, sigmas, size=(num_obs, num_coef)) + # Add intercept + X = np.column_stack([np.ones((num_obs, 1)), X]) + # Generate data + Y = np.dot(X, b) + np.random.normal(*noise_params, size=num_obs) + # Apply transform if not linear model + if family == "binomial": + Y = discrete_inverse_logit(Y) + dat = pd.DataFrame( + np.column_stack([Y, X[:, 1:]]), + columns=["DV"] + ["IV" + str(elem + 1) for elem in range(X.shape[1] - 1)], + ) + + return dat, b
    + + +
    [docs]def simulate_lmm( + num_obs, + num_coef, + num_grps, + coef_vals=None, + corrs=None, + grp_sigmas=0.25, + mus=0.0, + sigmas=1.0, + noise_params=(0, 1), + family="gaussian", + seed=None, +): + """ + Function to quickly simulate a multi-level regression model dataset, with continuous predictors. + Provided a number of observations, number of coefficients, number of groups/clusters, + and optionally correlations between predictors, means, and standard deviations of predictors, + returns a pandas dataframe with simulated data that can be used to estimate a multi-level model using Lmer(). Using the family='binomial' argument can generate discrete dependent variable values for use with logistic multi-level models. + + Defaults to returning standard normal (mu = 0; sigma = 1) predictors with no explicit correlations and low variance between + groups (sigma = .25). + + Args: + num_obs (int): number of observations per cluster/stratum/group + num_coef (int): number of coefficients/regressors, i.e. columns of data + num_grps (int): number of cluster/stratums/groups + coef_vals (list,optional): "true" values of coefficients to generate data. If not provided will be randomly generated. Must include a coefficient for the intercept as well (i.e. mean of data) + corrs (ndarray,list,float): correlations between coefficients provided as 2d num_coef x num_coef, 1d flattend numpy array/list of length (num_features * (num_features-1)) / 2, or a float to be treated + as the same correlation between all coefficients + grp_sigmas (int or list): grp level std around population coefficient values; can be a single value in which case same std is applied around all coefficients or a list for different std; default .25 + mus (float/list/ndarray): means of columns of predictors + sigmas (float/list/ndarray): stds of columns of predictors + noise_params (tup, optional): mean and std of noise added to each group's simulated data + family (str): distribution family for the dependent variable. Currently only 'gaussian' (continuous DV) or 'binomial' (discrete DV) are available. + seed (int): seed for reproducible random number generation + + Returns: + Multiple: + + - **data** (*pd.DataFrame*): dataframe organized as num_obs x num_coef + + - **blups** (*pd.DataFrame*): ground-truth group/cluster level coefficients, organized as num_grps x num_coef (i.e. BLUPs) + + - **coefs** (*np.array*): ground-truth population-level coefficients + + """ + + if seed is not None: + np.random.seed(seed) + + if coef_vals: + if len(coef_vals) - num_coef == -1: + raise ValueError( + "Missing one coefficient value. Did you provide a value for the intercept term?" + ) + else: + assert len(coef_vals) == num_coef + 1 + + b = coef_vals + else: + b = np.random.rand(num_coef + 1) + + assert ( + isinstance(noise_params, tuple) and len(noise_params) == 2 + ), "noise_params should be a tuple of (mean,std)" + assert ( + isinstance(grp_sigmas, int) + or isinstance(grp_sigmas, list) + or isinstance(grp_sigmas, float) + ), "grp_sigmas should be scalar value or list" + if not isinstance(grp_sigmas, list): + grp_sigmas = [grp_sigmas] * (num_coef + 1) + else: + assert len(grp_sigmas) == len( + b + ), "The length of a list of grp_sigmas must match the num_coef plus intercept!" + + if isinstance(mus, list) or isinstance(mus, np.ndarray): + assert len(mus) == len(b) - 1, "mus must match number of num_coef" + if isinstance(sigmas, list) or isinstance(sigmas, np.ndarray): + assert len(sigmas) == len(b) - 1, "sigmas must match number of num_coef" + + # Generate group paramaters (BLUPs) + blups = np.array( + [np.random.normal(est, sigma, num_grps) for est, sigma in zip(b, grp_sigmas)] + ).T + + # Generate data + for grp in range(blups.shape[0]): + # Create a random design matrix per group + if corrs: + x = easy_multivariate_normal(num_obs, num_coef, corrs, mus, sigmas, seed) + else: + x = np.random.normal(mus, sigmas, size=(num_obs, num_coef)) + x = np.column_stack([np.ones((num_obs, 1)), x]) + # Use blups to generate group data + y = np.dot(x, blups[grp, :]) + np.random.normal(*noise_params, size=num_obs) + if family == "binomial": + y = discrete_inverse_logit(y) + if grp == 0: + x_all, y_all = x, y + else: + y_all = np.append(y_all, y, axis=0) + x_all = np.append(x_all, x, axis=0) + + grp_ids = np.array([[elem] * num_obs for elem in range(1, num_grps + 1)]).ravel() + + data = pd.DataFrame( + np.column_stack([y_all, x_all[:, 1:], grp_ids]), + columns=["DV"] + + ["IV" + str(elem + 1) for elem in range(x_all.shape[1] - 1)] + + ["Group"], + ) + blups = pd.DataFrame( + blups, + columns=["Intercept"] + + ["IV" + str(elem + 1) for elem in range(x_all.shape[1] - 1)], + index=["Grp" + str(elem + 1) for elem in range(num_grps)], + ) + return data, blups, b
    + + +
    [docs]def easy_multivariate_normal( + num_obs, + num_features, + corrs, + mu=0.0, + sigma=1.0, + seed=None, + forcePSD=True, + return_new_corrs=False, + nit=100, +): + """ + Function to more easily generate multivariate normal samples provided a correlation matrix or list of correlations (upper triangle of correlation matrix) instead of a covariance matrix. Defaults to returning approximately standard normal (mu = 0; sigma = 1) variates. Unlike numpy, if the desired correlation matrix is not positive-semi-definite, will by default issue a warning and find the nearest PSD correlation matrix and generate data with this matrix. This new matrix can optionally be returned used the return_new_corrs argument. + + Args: + num_obs (int): number of observations/samples to generate (rows) + corrs (ndarray/list/float): num_features x num_features 2d array, flattend numpy array of length (num_features * (num_features-1)) / 2, or scalar for same correlation on all off-diagonals + num_features (int): number of features/variables/dimensions to generate (columns) + mu (float/list): mean of each feature across observations; default 0.0 + sigma (float/list): sd of each feature across observations; default 1.0 + forcePD (bool): whether to find and use a new correlation matrix if the requested one is not positive semi-definite; default False + return_new_corrs (bool): return the nearest correlation matrix that is positive semi-definite used to generate data; default False + nit (int): number of iterations to search for the nearest positive-semi-definite correlation matrix is the requested correlation matrix is not PSD; default 100 + + Returns: + np.ndarray: 2d numpy array of correlated data organized as num_obs x num_features + """ + + if seed is not None: + np.random.seed(seed) + + if isinstance(mu, list): + assert len(mu) == num_features, "Number of means must match number of features" + else: + mu = [mu] * num_features + if isinstance(sigma, list): + assert len(sigma) == num_features, "Number of sds must match number of features" + else: + sigma = [sigma] * num_features + + if isinstance(corrs, np.ndarray) and corrs.ndim == 2: + assert ( + corrs.shape[0] == corrs.shape[1] + and np.allclose(corrs, corrs.T) + and np.allclose(np.diagonal(corrs), np.ones_like(np.diagonal(corrs))) + ), "Correlation matrix must be square symmetric" + elif (isinstance(corrs, np.ndarray) and corrs.ndim == 1) or isinstance(corrs, list): + assert ( + len(corrs) == (num_features * (num_features - 1)) / 2 + ), "(num_features * (num_features - 1) / 2) correlation values are required for a flattened array or list" + corrs = squareform(corrs) + np.fill_diagonal(corrs, 1.0) + elif isinstance(corrs, float): + corrs = np.array([corrs] * int(((num_features * (num_features - 1)) / 2))) + corrs = squareform(corrs) + np.fill_diagonal(corrs, 1.0) + else: + raise ValueError( + "Correlations must be num_features x num_feature, flattend numpy array/list or scalar" + ) + + if not isPSD(corrs): + if forcePSD: + # Tell user their correlations are being recomputed if they didnt ask to save them as they might not realize + if not return_new_corrs: + print( + "Correlation matrix is not positive semi-definite. Solved for new correlation matrix." + ) + _corrs = np.array(nearestPSD(corrs, nit)) + + else: + raise ValueError( + "Correlation matrix is not positive semi-definite. Pymer4 will not generate inaccurate multivariate data. Use the forcePD argument to automatically solve for the closest desired correlation matrix." + ) + else: + _corrs = corrs + + # Rescale correlation matrix by variances, given standard deviations of features + sd = np.diag(sigma) + # R * Vars = R * SD * SD + cov = _corrs.dot(sd.dot(sd)) + X = np.random.multivariate_normal(mu, cov, size=num_obs) + + if return_new_corrs: + return X, _corrs + else: + return X
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/stats.html b/_modules/pymer4/stats.html new file mode 100644 index 0000000..80a2972 --- /dev/null +++ b/_modules/pymer4/stats.html @@ -0,0 +1,847 @@ + + + + + + + pymer4.stats — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.stats

    +"""User-facing statistics functions and tests."""
    +
    +__all__ = [
    +    "discrete_inverse_logit",
    +    "cohens_d",
    +    "perm_test",
    +    "boot_func",
    +    "tost_equivalence",
    +    "welch_dof",
    +    "vif",
    +    "correct_pvals",
    +]
    +
    +import numpy as np
    +import pandas as pd
    +import copy
    +from scipy.special import expit
    +from scipy.stats import pearsonr, spearmanr, ttest_ind, ttest_rel, ttest_1samp
    +from functools import partial
    +from pymer4.models import Lmer
    +
    +from pymer4.utils import (
    +    _check_random_state,
    +    _welch_ingredients,
    +    _mean_diff,
    +    _get_params,
    +    _lrt,
    +    _sig_stars,
    +)
    +from joblib import Parallel, delayed
    +
    +MAX_INT = np.iinfo(np.int32).max
    +
    +
    +
    [docs]def vif(df, has_intercept=True, exclude_intercept=True, tol=5.0, check_only=False): + """ + Compute variance inflation factor amongst columns of a dataframe to be used as a design matrix. Uses the same method as Matlab and R (diagonal elements) of the inverted correlation matrix. Prints a warning if any vifs are >= to tol. If check_only is true it will only return a 1 if any vifs are higher than tol. + + Args: + df (pandas.DataFrame): dataframe of design matrix output from patsy + has_intercept (bool): whether the first column of the dataframe is the intercept + exclude_intercept (bool): exclude intercept from computation and assumed intercept is the first column; default True + tol (float): tolerance check to print warning if any vifs exceed this value + check_only (bool): restrict return to a dictionary of vifs that exceed tol only rather than all; default False + + Returns: + dict: dictionary with keys as column names and values as vifs + """ + + if not isinstance(df, pd.DataFrame): + raise TypeError("input needs to be a pandas dataframe") + if has_intercept: + if df.iloc[:, 0].sum() != df.shape[0]: + raise ValueError( + "has_intercept is true, but first column does not appear to be a constant" + ) + if exclude_intercept: + corr_mat = df.iloc[:, 1:].corr() + keys = np.array(df.iloc[:, 1:].columns) + else: + corr_mat = df.corr() + keys = np.array(df.columns) + + try: + vifs = np.diag(np.linalg.inv(corr_mat), 0) + mask = np.where(vifs >= tol) + if mask: + high_vifs = dict(zip(keys[mask], vifs[mask])) + else: + high_vifs = {} + if check_only: + return high_vifs + else: + return high_vifs, dict(zip(keys, vifs)) + except np.linalg.LinAlgError: + print("ERROR: Cannot compute vifs! Design Matrix is strictly singular.")
    + + +
    [docs]def discrete_inverse_logit(arr): + """Apply a discretized inverse logit transform to an array of values. Useful for converting normally distributed values to binomial classes. + + Args: + arr (np.array): 1d numpy array + + Returns: + np.array: transformed values + """ + probabilities = expit(arr) + out = np.random.binomial(1, probabilities) + return out
    + + +
    [docs]def cohens_d( + x, y=None, paired=False, n_boot=1000, equal_var=False, value=0, n_jobs=1, seed=None +): + """ + Compute Cohen's d for one or two samples (paired or independent). For paired samples Cohen's Dz is computed (ref: https://bit.ly/2J54P61). If x and y are not the same size this will use the same pooled SD calculation in Welch's ttest to account for unequal variances. Unequal variance calculation will almost always produce a *smaller* estimate than the standard formula, except as the variance of the group with fewer observations increases. In that case, this estimate can be *larger* than the standard formula. This can be turned off with the equal_var=True argument. Percentile boot-strapped confidence intervals can also be returned + + Args: + x (list-like): array or list of observations from first group + y (list-like): array or list of observations from second group or second set of observations from the same group; optional + paired (bool): whether to treat x any y (if provided) as paired or independent + n_boot (int): number of bootstrap samples to run; set to 0 to skip computing + equal_var (bool): should we pool standard deviation as in Welch's t-test + value (float): a value to see if the effect size is bigger than; `eff size - value` will be computed; default 0 + n_jobs (int): number of parallel cores to use for bootstraping; default 1 + seed (int or None): numerical seed for reproducibility of bootstrapping + + Returns: + Multiple: + + - **effect_size** (*float*): cohen's d + + - **ci** (*np.array*): lower and upper bounds of 95% bootstrapped confidence intervals; optional + + """ + + if y is None: + eff = x.mean() / x.std(ddof=1) + else: + if paired: + # Cohen's Dz + if (y is None) or (len(x) != len(y)): + raise ValueError( + "with paired=True, both and x and y must be provided and must have the same number of observations" + ) + numerator = np.subtract(x, y).mean() - value + denominator = x.std(ddof=1) - y.std(ddof=1) + eff = numerator / denominator + + else: + # Cohen's D + m1, s1, ss1, m2, s2, ss2 = ( + x.mean(), + x.var(ddof=1), + x.size, + y.mean(), + y.var(ddof=1), + y.size, + ) + + if equal_var: + pooled_sd = np.sqrt(np.mean([s1, s2])) + else: + pooled_sd = np.sqrt( + (((ss1 - 1) * s1 + ((ss2 - 1) * s2))) / (ss1 + ss2 - 2) + ) + + numerator = m1 - m2 - value + eff = numerator / pooled_sd + + if n_boot: + random_state = _check_random_state(seed) + seeds = random_state.randint(MAX_INT, size=n_boot) + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + boots = par_for( + delayed(_cohens_d)(x, y, paired, equal_var, value, random_state=seeds[i]) + for i in range(n_boot) + ) + ci_u = np.percentile(boots, 97.5, axis=0) + ci_l = np.percentile(boots, 2.5, axis=0) + return eff, (ci_l, ci_u) + else: + return eff
    + + +def _cohens_d(x, y, paired, equal_var, value, random_state): + """For use in parallel cohens_d""" + random_state = _check_random_state(random_state) + if paired: + idx = np.random.choice(np.arange(len(x)), size=x.size, replace=True) + x, y = x[idx], y[idx] + else: + x = random_state.choice(x, size=x.size, replace=True) + if y is not None: + y = random_state.choice(y, size=y.size, replace=True) + return cohens_d(x, y, 0, equal_var, value) + + +
    [docs]def perm_test( + x, + y=None, + stat="tstat", + n_perm=1000, + equal_var=False, + tails=2, + return_dist=False, + n_jobs=1, + seed=None, +): + """ + General purpose permutation test between two samples. Can handle a wide varierty of permutation tests including ttest, paired ttest, mean diff test, cohens d, pearson r, spearman r. + + Args: + x (list-like): array or list of observations from first group + y (list-like): array or list of observations from second group + stat (string): one of ['tstat', 'tstat-paired', 'mean', 'cohensd', 'pearsonr', 'spearmanr']; 'mean' will just compute permutations on the difference between the mean of x and mean of y. Useful if statistics are precomputed (e.g. x and y contain correlation values, or t-stats). + n_perm (int): number of permutations; set to 0 to return parametric results + equal_var (bool): should assume equal variances for tstat and cohensd + tails (int): perform one or two-tailed p-value computations; default 2 + return_dists (bool): return permutation distribution + n_jobs (int): number of parallel cores to use for bootstraping; default 1 + seed (int): for reproducing results + + Returns: + Multiple: + + - **original_stat** (*float*): the original statistic + + - **perm_p_val** (*float*): the permuted p-value + + - **perm_dist** (*np.array*): array of permuted statistic; optional + + """ + + if ((y is None) or isinstance(y, (float, int))) and ( + stat in ["pearsonr", "spearmanr"] + ): + raise ValueError("y must be provided for 'pearsonr' or 'spearmanr'") + + if stat == "tstat": + if isinstance(y, (list, np.ndarray)): + func = partial(ttest_ind, equal_var=equal_var) + else: + if y is None: + y = 0 + func = partial(ttest_1samp) + multi_return = True + elif stat == "tstat-paired": + func = ttest_rel + multi_return = True + if len(x) != len(y): + raise ValueError("x and y must be the same length") + elif stat == "mean": + + def func(x, y): + if y is not None: + if isinstance(y, (list, np.ndarray)): + return x.mean() - y.mean() + elif isinstance(y, (float, int)): + raise NotImplementedError( + "One-sample mean test with a scalar y is not currently supported" + ) + else: + return x.mean() + + multi_return = False + elif stat == "cohensd": + func = partial(cohens_d, equal_var=equal_var, n_boot=0) + multi_return = False + elif stat == "pearsonr": + func = pearsonr + multi_return = True + if len(x) != len(y): + raise ValueError("x and y must be the same length") + elif stat == "spearmanr": + func = spearmanr + multi_return = True + if len(x) != len(y): + raise ValueError("x and y must be the same length") + else: + raise ValueError( + "stat must be in ['tstat', 'tstat-paired', 'mean', 'cohensd', 'pearsonr', 'spearmanr']" + ) + + # Get original statistic + original_stat = func(x, y) + if multi_return: + original_stat = original_stat[0] + + # Permute + if n_perm == 0: + return func(x, y) + else: + random_state = _check_random_state(seed) + seeds = random_state.randint(MAX_INT, size=n_perm) + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + perms = par_for( + delayed(_perm_test)(x, y, stat, equal_var, random_state=seeds[i]) + for i in range(n_perm) + ) + if multi_return: + perms = [elem[0] for elem in perms] + + denom = float(len(perms)) + 1 + + if tails == 2: + numer = np.sum(np.abs(perms) >= np.abs(original_stat)) + 1 + elif tails == 1: + if original_stat >= 0: + numer = np.sum(perms >= original_stat) + 1 + else: + numer = np.sum(perms <= original_stat) + 1 + else: + raise ValueError("tails must be 1 or 2") + p = numer / denom + if return_dist: + return original_stat, p, perms + else: + return original_stat, p
    + + +def _perm_test(x, y, stat, equal_var, random_state): + """For use in parallel perm_test""" + random_state = _check_random_state(random_state) + if stat in ["pearsonr", "spearmanr"]: + y = random_state.permutation(y) + elif stat in ["tstat", "cohensd", "mean"]: + if y is None: + x = x * random_state.choice([1, -1], len(x)) + elif isinstance(y, (float, int)): + x -= y + x = x * random_state.choice([1, -1], len(x)) + else: + shuffled_combined = random_state.permutation(np.hstack([x, y])) + x, y = shuffled_combined[: x.size], shuffled_combined[x.size :] + elif (stat == "tstat-paired") or (y is None): + x = x * random_state.choice([1, -1], len(x)) + + return perm_test(x, y, stat, equal_var=equal_var, n_perm=0) + + +
    [docs]def boot_func( + x, y=None, func=None, func_args={}, paired=False, n_boot=500, n_jobs=1, seed=None +): + """ + Bootstrap an arbitrary function by resampling from x and y independently or jointly. + + Args: + x (list-like): list of values for first group + y (list-like): list of values for second group; optional + function (callable): function that accepts x or y + paired (bool): whether to resample x and y jointly or independently + n_boot (int): number of bootstrap iterations + n_jobs (int): number of parallel cores; default 1 + + Returns: + Multiple: + + - **original_stat** (*float*): function result with given data + + - **ci** (*np.array*): lower and upper bounds of 95% confidence intervals + + """ + + if not callable(func): + raise TypeError("func must be a valid callable function") + + orig_result = func(x, y, **func_args) + if n_boot: + random_state = _check_random_state(seed) + seeds = random_state.randint(MAX_INT, size=n_boot) + par_for = Parallel(n_jobs=n_jobs, backend="multiprocessing") + boots = par_for( + delayed(_boot_func)( + x, y, func, func_args, paired, **func_args, random_state=seeds[i] + ) + for i in range(n_boot) + ) + ci_u = np.percentile(boots, 97.5, axis=0) + ci_l = np.percentile(boots, 2.5, axis=0) + return orig_result, (ci_l, ci_u) + else: + return orig_result
    + + +def _boot_func(x, y, func, func_args, paired, random_state): + """For use in parallel boot_func""" + random_state = _check_random_state(random_state) + if paired: + idx = np.random.choice(np.arange(len(x)), size=x.size, replace=True) + x, y = x[idx], y[idx] + else: + x = random_state.choice(x, size=x.size, replace=True) + if y is not None: + y = random_state.choice(y, size=y.size, replace=True) + return boot_func(x, y, func, func_args, paired=paired, n_boot=0) + + +
    [docs]def tost_equivalence( + x, + y, + lower, + upper, + paired=False, + equal_var=False, + n_perm=1000, + n_boot=5000, + plot=False, + seed=None, +): + """ + Function to perform equivalence testing using TOST: two-one-sided-tests (Lakens et al, 2018). This works by defining a lower and upper bound of an "equivalence" range for the mean difference between x and y. This is a user-defined range that one might not feel is a particularly meangingful mean difference; conceptually similar to the Bayesian "region of practical equivalence (rope)." Specifically this uses, two one-sided t-tests against and lower and upper seperately to find out whether lower < mean diff < higher. n_perm only controls the permutation for the original two-sided test. + + Args: + x (list-like): array or list of observations from first group + y (list-like): array or list of observations from second group + lower (float): lower bound of equivalence region + upper (float): upper bound of equivalence region + equal_var (bool): should assume equal variances for t-stat and effect size calcs + n_perm (int): number of times to permute groups; set to 0 to turn off + n_boot (int): number of bootstrap samples for confidence intervals + plot (bool): return an equivalence plot depicting where the mean difference and 95% CIs fall relative to the equivalence range + return_dists (bool): optionally return the permuted distributions + + Returns: + dict: a dictionary of TOST results + + """ + + from scipy.stats import t as t_dist + import matplotlib.pyplot as plt + import seaborn as sns + + def _calc_stats(x, y, val, equal_var): + n1, m1, v1, n2, m2, v2 = ( + x.size, + x.mean(), + x.var(ddof=1), + y.size, + y.mean(), + y.var(ddof=1), + ) + + numerator = m1 - m2 - val + if equal_var: + # From scipy + df = n1 + n2 - 2.0 + svar = ((n1 - 1) * v1 + (n2 - 1) * v2) / df + denom = np.sqrt(svar * (1.0 / n1 + 1.0 / n2)) + else: + vn1 = v1 / n1 + vn2 = v2 / n2 + with np.errstate(divide="ignore", invalid="ignore"): + df = (vn1 + vn2) ** 2 / (vn1**2 / (n1 - 1) + vn2**2 / (n2 - 1)) + denom = np.sqrt(vn1 + vn2) + return numerator / denom, df + + # Just get df calculation from sub-function + _, df = _calc_stats(x, y, 0, equal_var) + tstat_orig, pval_orig = perm_test( + x, y, stat="tstat", n_perm=n_perm, equal_var=equal_var, seed=seed + ) + tstat_lower, df = _calc_stats(x, y, lower, equal_var) + tstat_upper, df = _calc_stats(x, y, upper, equal_var) + mdiff = x.mean() - y.mean() + + # Parametric assumptions for each one-sided test + pval_lower = t_dist.sf(tstat_lower, df) + pval_upper = t_dist.cdf(tstat_upper, df) + + # Attempted one-side permutation tests, but computing p-values is non-trivial due to how signs can flip based on the equivalence range and test statistic. Revisit at some point in the future. + # else: + # perm_t_origs, perm_t_lowers, perm_t_uppers = [], [], [] + # for i in range(n_perm): + # shuffled_combined = np.random.permutation(np.hstack([x, y])) + # new_x, new_y = shuffled_combined[: + # x.size], shuffled_combined[x.size:] + # perm_t_orig, _ = _calc_stats(new_x, new_y, 0, equal_var) + # perm_t_lower, _ = _calc_stats(new_x, new_y, upper, equal_var) + # perm_t_upper, _ = _calc_stats(new_x, new_y, lower, equal_var) + # perm_t_origs.append(perm_t_orig) + # perm_t_lowers.append(perm_t_lower) + # perm_t_uppers.append(perm_t_upper) + + # if lower < mdiff < upper: + # # upper = orange line is right of orange dist + # pval_upper = np.mean(tstat_upper >= perm_t_upper) + # # lower = blue line is left of blue dist + # pval_lower = np.mean(tstat_lower <= perm_t_lower) + # else: + # # upper = prob orange line, right of blue dist + # pval_upper = np.mean(tstat_upper >= perm_t_lower) + # # lower = prob blue line, left of orange dist + # pval_lower = np.mean(tstat_lower <= perm_t_upper) + + # p_orig = np.mean(np.abs(perm_t_origs) >= np.abs(tstat_orig)) + # res = [] # just to be consistent with above + # res.append(tstat_orig) + # res.append(p_orig) + + result = {} + result["original"] = {"m": mdiff, "t": tstat_orig, "p": pval_orig} + result["lower"] = {"m": lower, "t": tstat_lower, "p": pval_lower} + result["upper"] = {"m": upper, "t": tstat_upper, "p": pval_upper} + + # Effect size bootstrapped + d, (dlb, dub) = cohens_d(x, y, n_boot=n_boot, equal_var=equal_var, seed=seed) + result["cohens_d"] = {"m": d, "CI_lb": dlb, "CI_ub": dub} + + # Some results text for interpretation + if pval_lower < 0.05 and pval_upper < 0.05: + result["In_Equivalence_Range"] = True + else: + result["In_Equivalence_Range"] = False + if pval_orig < 0.05: + result["Means_Are_Different"] = True + else: + result["Means_Are_Different"] = False + + if plot: + # Get mean diff + m, (lb, ub) = boot_func(x, y, _mean_diff, n_boot=n_boot) + _, ax = plt.subplots(1, 1, figsize=(8, 6)) + ax.plot(m, 0, "o", markersize=18, color="black") + ax.hlines(y=0, xmin=m, xmax=ub, linestyle="-", linewidth=6) + ax.hlines(y=0, xmin=lb, xmax=m, linestyle="-", linewidth=6) + ax.vlines(x=lower, ymin=-1, ymax=1, linestyles="--", linewidth=2) + ax.vlines(x=upper, ymin=-1, ymax=1, linestyles="--", linewidth=2) + ax.vlines(x=0, ymin=-1, ymax=1, linestyles="--", linewidth=2, alpha=0.5) + min_plot = np.min([lb, lower]) + min_plot -= np.abs(min_plot / 2) + max_plot = np.max([ub, upper]) + max_plot += np.abs(max_plot / 2) + _ = ax.set(xlim=(min_plot, max_plot), xlabel="Mean Difference", yticks=[]) + ax.text( + 0, + 1, + f"Equivalence bounds: [{lower} {upper}]\nMean diff: {np.round(m,3)} [{np.round(lb,3)} {np.round(ub,3)}]", + horizontalalignment="center", + fontsize=14, + ) + sns.despine() + + return result
    + + +
    [docs]def welch_dof(x, y): + """ + Compute adjusted dof via Welch-Satterthwaite equation + + Args: + x (np.ndarray): 1d numpy array + y (np.ndarray): 1d numpy array + + Returns: + float: degrees of freedom + """ + + if isinstance(x, np.ndarray) and isinstance(y, np.ndarray): + + x_numerator, x_denominator = _welch_ingredients(x) + y_numerator, y_denominator = _welch_ingredients(y) + + return np.power(x_numerator + y_numerator, 2) / (x_denominator + y_denominator) + else: + raise TypeError("Both x and y must be 1d numpy arrays")
    + + +
    [docs]def lrt(models, refit=True): + """ + Compute a likelihood ratio test between two Lmer models. This produces identical results to R's anova() function when comparing models. Will automatically determine the the model order based on comparing all models to the one that has the fewest parameters. + # Possible additions: + # 1) Generalize function to perform LRT, or vuong test + # 2) Offer nested and non-nested vuong test, as well as AIC/BIC correction + # 3) Given a single model expand out to all separate term tests + Args: + models (list): a list of two Lmer models to be compared + refit (bool): should REML models be refitted as ML before comparison (defaults to True) + + Returns: + df (pandas.DataFrame): dataframe of the anova results + + """ + models_list = copy.deepcopy(models) + if not isinstance(models_list, list): + models_list = [models_list] + if len(models_list) < 2: + raise ValueError("Must have 2 models to perform comparison") + if not all(list(map(lambda m: isinstance(m, Lmer), models_list))): + raise TypeError("All models are not Lmer") + + # refit models if needed + refitted = False + if refit: + for i, m in enumerate(models_list): + if m._REML: + refitted = True + m.fit(REML=False, summarize=False) + models_list[i] = m + + # Get number of coefs for each model + all_params = [] + for m in models_list: + all_params.append(_get_params(m)) + all_params = np.array(all_params) + idx = np.argsort(all_params) + all_params = all_params[idx] + models_list = np.array(models_list)[idx] + out = pd.DataFrame() + for i, m in enumerate(models_list): + df = _get_params(m) - (_get_params(models_list[i - 1])) if i > 0 else np.nan + chisq = ( + ((-2 * models_list[i - 1].logLike) - (-2 * m.logLike)) if i > 0 else np.nan + ) + pval = _lrt([models_list[index] for index in [i - 1, i]]) if i > 0 else np.nan + out = pd.concat( + [ + out, + pd.DataFrame( + { + "model": m.formula, + "npar": _get_params(m), + "AIC": m.AIC, + "BIC": m.BIC, + "deviance": -2 * m.logLike, + "log-likelihood": m.logLike, + "Chisq": chisq, + "Df": df, + "P-val": pval, + }, + index=[0], + ), + ], + ignore_index=True, + ) + out["Sig"] = out["P-val"].apply(lambda x: _sig_stars(x)) + out = out[ + [ + "model", + "npar", + "AIC", + "BIC", + "log-likelihood", + "deviance", + "Chisq", + "Df", + "P-val", + "Sig", + ] + ] + + if refitted: + print("refitting model(s) with ML (instead of REML)") + return out.fillna("")
    + + +
    [docs]def rsquared(y, res, has_constant=True): + """ + Compute the R^2, coefficient of determination. This statistic is a ratio of "explained variance" to "total variance" + + Args: + y (np.ndarray): 1d array of dependent variable + res (np.ndarray): 1d array of residuals + has_constant (bool): whether the fitted model included a constant (intercept) + + Returns: + float: coefficient of determination + """ + + y_mean = y.mean() + rss = np.sum(res**2) + if has_constant: + tss = np.sum((y - y_mean) ** 2) + else: + tss = np.sum(y**2) + return 1 - (rss / tss)
    + + +
    [docs]def rsquared_adj(r, nobs, df_res, has_constant=True): + """ + Compute the adjusted R^2, coefficient of determination. + + Args: + r (float): rsquared value + nobs (int): number of observations the model was fit on + df_res (int): degrees of freedom of the residuals (nobs - number of model params) + has_constant (bool): whether the fitted model included a constant (intercept) + + Returns: + float: adjusted coefficient of determination + """ + + # Skip calculation if Dof is not a positive number to avoid 0 division error or calculating negative R^2 values + if df_res <= 0: + return np.nan + if has_constant: + return 1.0 - (nobs - 1) / df_res * (1.0 - r) + else: + return 1.0 - nobs / df_res * (1.0 - r)
    + + +
    [docs]def correct_pvals(ps, method="holm"): + """ + Provided a list of p-values return a corrected list according to specified method. + You can use this list to then compare against a chosen alpha (e.g. .05). Closely + follows the implementats in statsmodels.stats.multitest.multipletests + + Args: + ps (list/np.ndarray): list of p-values + method (str, optional): correction method. Default to 'holm' for holm-bonferroni + step-down procedure + + Returns: + np.ndarray: adjusted p-values + """ + + if method == "holm-bonf": + method = "holm" + supported_methods = ["holm", "bonf"] + if method not in supported_methods: + raise ValueError(f"method must be one of {supported_methods}") + + pvals = np.asarray(ps) + + # pval * number of tests + if method == "bonf": + return pvals * float(len(pvals)) + + # sorted pval * cumulative number of tests + elif method == "holm": + idx = np.argsort(pvals) + idx_r = np.argsort(idx) + sorted_pvals = pvals[idx] + corrected = sorted_pvals * np.arange(len(sorted_pvals), 0, -1) + # Set maximum p-val as the same for all tests above it + out = np.maximum.accumulate(corrected) + return out[idx_r]
    +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_modules/pymer4/utils.html b/_modules/pymer4/utils.html new file mode 100644 index 0000000..b4e4941 --- /dev/null +++ b/_modules/pymer4/utils.html @@ -0,0 +1,796 @@ + + + + + + + pymer4.utils — pymer4 0.8.2 documentation + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Source code for pymer4.utils

    +"""Utility functions"""
    +__all__ = [
    +    "get_resource_path",
    +    "result_to_table",
    +    "isPSD",
    +    "nearestPSD",
    +    "upper",
    +    "_mean_diff",
    +    "_check_random_state",
    +    "_sig_stars",
    +    "_robust_estimator",
    +    "_whiten_wls",
    +    "_ols",
    +    "_logregress",
    +    "_chunk_perm_ols",
    +    "_permute_sign",
    +    "_chunk_boot_ols_coefs",
    +    "_ols_group",
    +    "_corr_group",
    +    "_to_ranks_by_group",
    +    "_perm_find",
    +    "_return_t",
    +    "_get_params",
    +    "_lrt",
    +    "_welch_ingredients",
    +    "_df_meta_to_arr",
    +    "_logit2prob",
    +]
    +
    +import os
    +import numpy as np
    +import pandas as pd
    +from patsy import dmatrices
    +from scipy.stats import chi2, norm
    +from rpy2.robjects.packages import importr
    +from sklearn.linear_model import LogisticRegression
    +
    +base = importr("base")
    +MAX_INT = np.iinfo(np.int32).max
    +
    +
    +
    [docs]def get_resource_path(): + """Get path sample data directory.""" + return os.path.join(os.path.dirname(__file__), "resources") + os.path.sep
    + + +
    [docs]def result_to_table( + to_format, + drop_intercept=True, + iv_name="Predictor", + comparison_name="b", + ci_name="ci", + round=True, + pval_text="< .001", + pval_thresh=0.001, + fetch_name_col="index", +): + """ + Nicely format the `.coefs` attribute of a fitted model. The intended use of this function is to nicely format the `.coefs` of a fitted model such that the resultant dataframe can be copied outside of python/jupyter or saved to another file (e.g. googlesheet). It's particularly well suited for use with `gspread_pandas`. + + Args: + model (pymer.model): pymer4 model object that's already been fit + drop_intercept (bool, optional): remove the model intercept results from the table; Default True + iv_name (str, optional): column name of the model's independent variables. Defaults to "Predictor". + round (bool, optional): round all numeric values to 3 decimal places. Defaults to True. + pval_text (str, optional): what to replace p-values with when they are < pval_thres. Defaults to "< .001". + pval_thresh (float, optional): threshold to replace p-values with. Primarily intended to be used for very small p-values (e.g. .0001), where the tradition is to display '< .001' instead of the exact p-values. Defaults to 0.001. + + Returns: + pd.DataFrame: formatted dataframe of results + + Example: + + Send model results to a google sheet, assuming `model.fit()` has already been called: + + >>> from gspread_pandas import Spread + >>> spread = Spread('My_Results_Sheet') + >>> formatted_results = result_to_table(model) + >>> spread.df_to_sheet(formatted_results, replace=True, index=False) + + Now 'My_Results_Sheet' will have a copy of `formatted_results` which can be copy and pasted into a google doc as a nice auto-updating table. On new model fits, simple repeat the steps above to replace the values in the google sheet, thus triggering an update of the linked table in a google doc. + + """ + + if isinstance(to_format, pd.DataFrame): + results = to_format.copy() + else: + if not to_format.fitted: + raise ValueError("model must be fit to format results") + + results = to_format.coefs.copy() + if round: + results = results.round(3) + if drop_intercept: + if "(Intercept)" in results.index: + results = results.drop(index=["(Intercept)"]) + elif "Intercept" in results.index: + results = results.drop(index=["Intercept"]) + + results = results.drop(columns=["Sig"]) + if fetch_name_col == "index": + results.reset_index() + + results = ( + results.assign( + ci=lambda df: df[["2.5_ci", "97.5_ci"]].apply( + lambda row: f"({' '.join(row.values.astype(str))})", axis=1 + ), + p=lambda df: df["P-val"].apply( + lambda val: pval_text if val < pval_thresh else str(val) + ), + ) + .drop(columns=["2.5_ci", "97.5_ci", "SE", "P-val"]) + .rename( + columns={ + fetch_name_col: iv_name, + "Estimate": comparison_name, + "T-stat": "t", + "ci": ci_name, + "DF": "df", + } + ) + .reindex(columns=[iv_name, comparison_name, ci_name, "t", "df", "p"]) + ) + return results
    + + +
    [docs]def isPSD(mat, tol=1e-8): + """ + Check if matrix is positive-semi-definite by virtue of all its eigenvalues being >= 0. The cholesky decomposition does not work for edge cases because np.linalg.cholesky fails on matrices with exactly 0 valued eigenvalues, whereas in Matlab this is not true, so that method appropriate. Ref: https://goo.gl/qKWWzJ + + Args: + mat (np.ndarray): 2d numpy array + + Returns: + bool: whether matrix is postive-semi-definite + """ + + # We dont assume matrix is Hermitian, i.e. real-valued and symmetric + # Could swap this out with np.linalg.eigvalsh(), which is faster but less general + e = np.linalg.eigvals(mat) + return np.all(e > -tol)
    + + +
    [docs]def nearestPSD(mat, nit=100): + """ + Higham (2000) algorithm to find the nearest positive semi-definite matrix that minimizes the Frobenius distance/norm. Statsmodels using something very similar in corr_nearest(), but with spectral SGD to search for a local minima. Reference: https://goo.gl/Eut7UU + + Args: + mat (np.ndarray): 2d numpy array + nit (int): number of iterations to run algorithm; more iterations improves accuracy but increases computation time. + Returns: + np.ndarray: closest positive-semi-definite 2d numpy array + """ + + n = mat.shape[0] + W = np.identity(n) + + def _getAplus(mat): + eigval, eigvec = np.linalg.eig(mat) + Q = np.matrix(eigvec) + xdiag = np.matrix(np.diag(np.maximum(eigval, 0))) + return Q * xdiag * Q.T + + def _getPs(mat, W=None): + W05 = np.matrix(W**0.5) + return W05.I * _getAplus(W05 * mat * W05) * W05.I + + def _getPu(mat, W=None): + Aret = np.array(mat.copy()) + Aret[W > 0] = np.array(W)[W > 0] + return np.matrix(Aret) + + # W is the matrix used for the norm (assumed to be Identity matrix here) + # the algorithm should work for any diagonal W + deltaS = 0 + Yk = mat.copy() + for _ in range(nit): + Rk = Yk - deltaS + Xk = _getPs(Rk, W=W) + deltaS = Xk - Rk + Yk = _getPu(Xk, W=W) + # Double check returned matrix is PSD + if isPSD(Yk): + return Yk + else: + nearestPSD(Yk)
    + + +
    [docs]def upper(mat): + """ + Return upper triangle of matrix. Useful for grabbing unique values from a symmetric matrix. + + Args: + mat (np.ndarray): 2d numpy array + + Returns: + np.array: 1d numpy array of values + + """ + idx = np.triu_indices_from(mat, k=1) + return mat[idx]
    + + +def _mean_diff(x, y): + """For use in plotting of tost_equivalence""" + return np.mean(x) - np.mean(y) + + +def _check_random_state(seed): + """Turn seed into a np.random.RandomState instance. Note: credit for this code goes entirely to sklearn.utils.check_random_state. Using the source here simply avoids an unecessary dependency. + + Args: + seed (None, int, np.RandomState): iff seed is None, return the RandomState singleton used by np.random. If seed is an int, return a new RandomState instance seeded with seed. If seed is already a RandomState instance, return it. Otherwise raise ValueError. + """ + + import numbers + + if seed is None or seed is np.random: + return np.random.mtrand._rand + if isinstance(seed, (numbers.Integral, np.integer)): + return np.random.RandomState(seed) + if isinstance(seed, np.random.RandomState): + return seed + raise ValueError( + "%r cannot be used to seed a numpy.random.RandomState" " instance" % seed + ) + + +def _sig_stars(val): + """Adds sig stars to coef table prettier output.""" + star = "" + if 0 <= val < 0.001: + star = "***" + elif 0.001 <= val < 0.01: + star = "**" + elif 0.01 <= val < 0.05: + star = "*" + elif 0.05 <= val < 0.1: + star = "." + return star + + +def _robust_estimator(vals, X, robust_estimator="hc1", n_lags=1, cluster=None): + """ + Computes robust sandwich estimators for standard errors used in OLS computation. Types include: + 'hc0': Huber (1980) sandwich estimator to return robust standard error estimates. + 'hc1': small sample dof correction to 'hc0' + 'hc2': alternate small sample weighting correction to 'hc0' + 'hc3': MacKinnon and White (1985) HC3 sandwich estimator. Provides more robustness in smaller samples than HC0 and HC1 Long & Ervin (2000) + 'hac': Newey-West (1987) estimator for robustness to heteroscedasticity as well as serial auto-correlation at given lags. + Good reference: https://bit.ly/2VRb7jK + + Args: + vals (np.ndarray): 1d array of residuals + X (np.ndarray): design matrix used in OLS + robust_estimator (str): estimator type, 'hc0' (default), 'hc3', 'hac', or 'cluster' + n_lags (int): number of lags, only used with 'hac' estimator, default is 1 + cluster (np.ndarry): array of cluster ids + + Returns: + stderr (np.ndarray): 1d array of standard errors with length == X.shape[1] + + """ + + assert robust_estimator in [ + "hc0", + "hc1", + "hc2", + "hc3", + "hac", + "cluster", + ], "robust_estimator must be one of hc0, hc1, hc2, hc3, hac, or cluster" + + # Make a sandwich! + # First we need bread + bread = np.linalg.pinv(np.dot(X.T, X)) + + # Then we need meat + # First deal with estimators that have more complicated formulations + + # Cluster robust + if robust_estimator == "cluster": + # Good ref: http://projects.iq.harvard.edu/files/gov2001/files/sesection_5.pdf + if cluster is None: + raise ValueError("data column identifying clusters must be provided") + else: + u = vals[:, np.newaxis] * X + u = pd.DataFrame(u) + # Use pandas groupby to get cluster-specific residuals + u["Group"] = cluster + u_clust = u.groupby("Group").sum() + num_grps = u["Group"].nunique() + meat = ( + (num_grps / (num_grps - 1)) + * (X.shape[0] / (X.shape[0] - X.shape[1])) + * u_clust.T.dot(u_clust) + ) + + # Auto-correlation robust + elif robust_estimator == "hac": + weights = 1 - np.arange(n_lags + 1.0) / (n_lags + 1.0) + + # First compute lag 0 + V = np.diag(vals**2) + meat = weights[0] * np.dot(np.dot(X.T, V), X) + + # Now loop over additional lags + for j in range(1, n_lags + 1): + + V = np.diag(vals[j:] * vals[:-j]) + meat_1 = np.dot(np.dot(X[j:].T, V), X[:-j]) + meat_2 = np.dot(np.dot(X[:-j].T, V), X[j:]) + + meat += weights[j] * (meat_1 + meat_2) + + else: + # Otherwise deal with estimators that modify the same essential operation + V = np.diag(vals**2) + + if robust_estimator == "hc0": + # No modification of residuals + pass + + elif robust_estimator == "hc1": + # Degrees of freedom adjustment to HC0 + V = V * X.shape[0] / (X.shape[0] - X.shape[1]) + + elif robust_estimator == "hc2": + # Rather than dof correction, weight residuals by reciprocal of "leverage values" in the hat-matrix + V = V / (1 - np.diag(np.dot(X, np.dot(bread, X.T)))) + + elif robust_estimator == "hc3": + # Same as hc2 but more aggressive weighting due to squaring + V = V / (1 - np.diag(np.dot(X, np.dot(bread, X.T)))) ** 2 + + meat = np.dot(np.dot(X.T, V), X) + # Finally we make a sandwich + vcv = np.dot(np.dot(bread, meat), bread) + + return np.sqrt(np.diag(vcv)) + + +def _whiten_wls(mat, weights): + """ + Whiten a matrix for a WLS regression. Just multiply each column of mat by sqrt(weights) if mat is 2d. Similar to statsmodels + + Args: + x (np.ndarray): design matrix to be passed to _ols + weights (np.ndarray): 1d array of weights, most often variance of each group if some columns in x refer to categorical predictors + """ + + if weights.shape[0] != mat.shape[0]: + raise ValueError( + "The number of weights must be the same as the number of observations" + ) + if mat.ndim == 1: + return mat * np.sqrt(weights) + elif mat.ndim == 2: + # return np.column_stack([x[:,0], np.sqrt(weights)[:, None]*x[:,1:]]) + return np.sqrt(weights)[:, None] * mat + + +def _ols(x, y, robust, n_lags, cluster, all_stats=True, resid_only=False, weights=None): + """ + Compute OLS on data. Useful for single computation and within permutation schemes. + """ + + if all_stats and resid_only: + raise ValueError("_ols must be called with EITHER all_stats OR resid_only") + # Expects as input pandas series and dataframe + Y, X = y.values.squeeze(), x.values + + # Whiten if required + if weights is not None: + if isinstance(weights, (pd.DataFrame, pd.Series)): + weights = weights.values + X = _whiten_wls(X, weights) + Y = _whiten_wls(Y, weights) + + # The good stuff + b = np.dot(np.linalg.pinv(X), Y) + + if all_stats: + + res = Y - np.dot(X, b) + + if robust: + se = _robust_estimator( + res, X, robust_estimator=robust, n_lags=n_lags, cluster=cluster + ) + else: + # Use dof calculation in the denominator that accounts for square matrices to avoid 0 division error + sigma = np.sqrt(res.T.dot(res) / (X.shape[0] - np.linalg.matrix_rank(X))) + se = np.sqrt(np.diag(np.linalg.pinv(np.dot(X.T, X)))) * sigma + + t = b / se + + return b, se, t, res + + elif resid_only: + return Y - np.dot(X, b) + else: + return b + + +def _logregress(x, y, all_stats=True): + # Design matrix already has intercept. We want no regularization and the newton + # solver to match as closely with R + + model = LogisticRegression(penalty=None, solver="newton-cg", fit_intercept=False) + _ = model.fit(x, y) + b = model.coef_ + fits = model.decision_function(x) + # We only return probs for positive class + fit_probs = model.predict_proba(x)[:, 1] + fit_classes = model.predict(x) + + # Inference implementation from: Vallat, R. (2018). Pingouin: statistics in Python. Journal of Open Source Software, 3(31), 1026, https://doi.org/10.21105/joss.01026 + # Compute the fisher information matrix + num_feat = x.shape[1] + denom = 2 * (1 + np.cosh(model.decision_function(x))) + denom = np.tile(denom, (num_feat, 1)).T + fim = (x / denom).T @ x + crao = np.linalg.pinv(fim) + + # Standard error and Z-scores + se = np.sqrt(np.diag(crao)) + z = b / se + + # Two-tailed p-values + p = 2 * norm.sf(np.fabs(z)) + sig = np.array([_sig_stars(elem) for elem in p.squeeze()]) + + # Wald Confidence intervals + # In R: this is equivalent to confint.default(model) + # Note that confint(model) will however return the profile CI + crit = norm.ppf(1 - 0.05 / 2) + ll = b - crit * se + ul = b + crit * se + + # equivalent to calling exp() then plogis() in R + odds, odds_ll, odds_ul, probs, probs_ll, probs_ul = _convert_odds_probs(b, ll, ul) + + if all_stats: + return ( + b.squeeze(), + ll.squeeze(), + ul.squeeze(), + se.squeeze(), + odds.squeeze(), + odds_ll.squeeze(), + odds_ul.squeeze(), + probs.squeeze(), + probs_ll.squeeze(), + probs_ul.squeeze(), + z.squeeze(), + p.squeeze(), + sig.squeeze(), + fits.squeeze(), + fit_probs.squeeze(), + fit_classes.squeeze(), + model, + ) + + +def _logit2prob(logit): + """ + Convert logits (outputs or coefs from logistic regression) to probabilities. + Sources: + https://yury-zablotski.netlify.app/post/from-odds-to-probability/#odds + https://sebastiansauer.github.io/convert_logit2prob/#:~:text=Conversion%20rule,%2F%20(1%20%2B%20odds)%20. + """ + + return np.exp(logit) / (1 + np.exp(logit)) + + +def _convert_odds_probs(b, ll, ul): + """converts coefficiens from a logistic regression model to odds ratios and + probabilities""" + + odds, odds_ll, odds_ul = np.exp(b), np.exp(ll), np.exp(ul) + probs, probs_ll, probs_ul = _logit2prob(b), _logit2prob(ll), _logit2prob(ul) + + return odds, odds_ll, odds_ul, probs, probs_ll, probs_ul + + +def _chunk_perm_ols(x, y, robust, n_lags, cluster, weights, seed): + """ + Permuted OLS chunk. + """ + # Shuffle y labels + y = y.sample(frac=1, replace=False, random_state=seed) + _, _, t, _ = _ols(x, y, robust, n_lags, cluster, weights=weights, all_stats=True) + + return list(t) + + +def _permute_sign(data, seed, return_stat="mean"): + """Given a list/array of data, randomly sign flip the values and compute a new mean. For use in one-sample permutation test. Returns a 'mean' or 't-stat'.""" + + random_state = np.random.RandomState(seed) + new_dat = data * random_state.choice([1, -1], len(data)) + if return_stat == "ceof": + return np.mean(new_dat) + elif return_stat == "t-stat": + return np.mean(new_dat) / (np.std(new_dat, ddof=1) / np.sqrt(len(new_dat))) + + +def _chunk_boot_ols_coefs(dat, formula, weights, seed): + """ + OLS computation of coefficients to be used in a parallelization context. + """ + # Random sample with replacement from all data + dat = dat.sample(frac=1, replace=True, random_state=seed) + y, x = dmatrices(formula, dat, 1, return_type="dataframe") + b = _ols( + x, y, robust=None, n_lags=1, cluster=None, all_stats=False, weights=weights + ) + return list(b) + + +def _ols_group(dat, formula, group_col, group, rank): + """Compute OLS on data given a formula. Used by Lm2""" + dat = dat[dat[group_col] == group].reset_index(drop=True) + if rank: + dat = dat.rank() + y, x = dmatrices(formula, dat, 1, return_type="dataframe") + b = _ols(x, y, robust=None, n_lags=1, cluster=None, all_stats=False) + Y, X = y.to_numpy().squeeze(), x.to_numpy() + pred = np.dot(X, b) + res = Y - pred + return dict(betas=list(b), pred=pred, res=res) + + +def _corr_group(dat, formula, group_col, group, rank, corr_type): + """Compute partial correlations via OLS. Used by Lm2""" + + from scipy.stats import pearsonr + + dat = dat[dat[group_col] == group].reset_index(drop=True) + if rank: + dat = dat.rank() + y, x = dmatrices(formula, dat, 1, return_type="dataframe") + corrs = [] + for c in x.columns[1:]: + other_preds = [e for e in x.columns if e != c] + other_preds = x[other_preds] + cc = x[c] + pred_m_resid = _ols( + other_preds, + cc, + robust=None, + n_lags=1, + cluster=None, + all_stats=False, + resid_only=True, + ) + if corr_type == "semi": + dv_m_resid = y.values.squeeze() + elif corr_type == "partial": + dv_m_resid = _ols( + other_preds, + y, + robust=None, + n_lags=1, + cluster=None, + all_stats=False, + resid_only=True, + ) + corrs.append(pearsonr(dv_m_resid, pred_m_resid)[0]) + return corrs + + +def _to_ranks_by_group(dat, group, formula, exclude_cols=[]): + """ + Covert predictors to ranks separately for each group for use in rank Lmer. Any columns not in the model formula or in exclude_cols will not be converted to ranks. Used by models.Lmer + + Args: + dat (pd.DataFrame): dataframe of data + group (string): string name of column to group data on + formula (string): Lmer flavored model formula with random effects + exclude_cols (list): optional columns that are part of the formula to exclude from rank conversion. + + Returns: + pandas.core.frame.DataFrame: ranked data + + """ + + if (not isinstance(group, str)) and (group not in dat.columns): + raise TypeError( + "group must be a valid column name in the dataframe. Currently only 1 grouping variable is supported." + ) + if isinstance(exclude_cols, str): + exclude_cols = [exclude_cols] + original_col_order = list(dat.columns) + formula = formula.replace(" ", "") + to_rank = formula.split("~")[-1].split("(")[0].split("+")[:-1] + # add dv to be ranked + to_rank.append(formula.split("~")[0]) + to_rank = [c for c in to_rank if c not in exclude_cols] + other_cols = [c for c in dat.columns if c not in to_rank] + dat = pd.concat( + [dat[other_cols], dat.groupby(group).apply(lambda g: g[to_rank].rank())], axis=1 + ) + return dat[original_col_order] + + +def _perm_find(arr, x): + """ + Find permutation cutoff in array. Two-tailed only + """ + return (np.sum(np.abs(arr) >= np.abs(x)) + 1) / (float(len(arr)) + 1) + + +def _return_t(model): + """Return t or z stat from R model summary.""" + summary = base.summary(model) + unsum = base.unclass(summary) + return unsum.rx2("coefficients")[:, -1] + + +def _get_params(model): + """Get number of params in a model.""" + return ( + model.coefs.shape[0] + + model.ranef_var.shape[0] + + (model.ranef_corr.shape[0] if (model.ranef_corr is not None) else 0) + ) + + +def _lrt(tup): + """Likelihood ratio test between 2 models. Used by stats.lrt""" + d = np.abs(2 * (tup[0].logLike - tup[1].logLike)) + return chi2.sf(d, np.abs(tup[0].coefs.shape[0] - tup[1].coefs.shape[0])) + + +def _welch_ingredients(x): + """ + Helper function to compute the numerator and denominator for a single group/array for use in Welch's degrees of freedom calculation. Used by stats.welch_dof + """ + + numerator = x.var(ddof=1) / x.size + denominator = np.power(x.var(ddof=1) / x.size, 2) / (x.size - 1) + return [numerator, denominator] + + +def _df_meta_to_arr(df): + """Check what kind of data exists in pandas columns or index. If string return as numpy array 'S' type, otherwise regular numpy array.""" + + if len(df.columns): + if isinstance(df.columns[0], str): + columns = df.columns.values.astype("S") + else: + columns = df.columns.values + else: + columns = [] + + if len(df.index): + if isinstance(df.index[0], str): + index = df.index.values.astype("S") + else: + index = df.index.values + else: + index = [] + + return columns, index +
    + +
    + +
    +
    +
    +
    +

    + Back to top + +

    +

    + © Copyright 2017-2024, Eshin Jolly.
    + Created using Sphinx 7.1.2.
    +

    +
    +
    + + \ No newline at end of file diff --git a/_sources/api.rst.txt b/_sources/api.rst.txt new file mode 100644 index 0000000..a7265f8 --- /dev/null +++ b/_sources/api.rst.txt @@ -0,0 +1,59 @@ +API Reference +============= + +:class:`pymer4.models.Lmer`: Lmer +--------------------------------- +Model class for estimating :code:`lme4` multi-level models in python + +.. autoclass:: pymer4.models.Lmer + :members: + +:class:`pymer4.models.Lm`: Lm +----------------------------- +Model class for estimating standard regression models + +.. autoclass:: pymer4.models.Lm + :members: + +:class:`pymer4.models.Lm2`: Lm2 +------------------------------- +Model class for estimating multi-level models in python using the summary-statistics approach + +.. autoclass:: pymer4.models.Lm2 + :members: + +:mod:`pymer4.simulate`: Simulation Functions +-------------------------------------------- +Functions for generating data for use with various model types + +.. automodule:: pymer4.simulate + :members: + :undoc-members: + :show-inheritance: + +:mod:`pymer4.stats`: Statistics Functions +----------------------------------------- +General purpose functions for various parametric and non-parametric statistical routines + +.. automodule:: pymer4.stats + :members: + :undoc-members: + :show-inheritance: + +:mod:`pymer4.utils`: Utility Functions +-------------------------------------- +Miscellaneous helper functions + +.. automodule:: pymer4.utils + :members: + :undoc-members: + :show-inheritance: + +:mod:`pymer4.io`: Save/Load Functions +------------------------------------- +Functions for persisting models to disk + +.. automodule:: pymer4.io + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/auto_examples/example_01_basic_usage.rst.txt b/_sources/auto_examples/example_01_basic_usage.rst.txt new file mode 100644 index 0000000..35a5c39 --- /dev/null +++ b/_sources/auto_examples/example_01_basic_usage.rst.txt @@ -0,0 +1,681 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_01_basic_usage.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_01_basic_usage.py: + + +1. Basic Usage Guide +==================== + +.. GENERATED FROM PYTHON SOURCE LINES 7-15 + +:code:`pymer4` comes with sample data for testing purposes which we'll utilize for most of the tutorials. +This sample data has: + +- Two kinds of dependent variables: *DV* (continuous), *DV_l* (dichotomous) +- Three kinds of independent variables: *IV1* (continuous), *IV2* (continuous), *IV3* (categorical) +- One grouping variable for multi-level modeling: *Group*. + +Let's check it out below: + +.. GENERATED FROM PYTHON SOURCE LINES 15-27 + +.. code-block:: Python + + + # import some basic libraries + import os + import pandas as pd + + # import utility function for sample data path + from pymer4.utils import get_resource_path + + # Load and checkout sample data + df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) + print(df.head()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Group IV1 DV_l DV IV2 IV3 + 0 1 20.0 0 7.936508 4.563492 0.5 + 1 1 20.0 0 15.277778 0.000000 1.0 + 2 1 20.0 1 0.000000 0.000000 1.5 + 3 1 20.0 1 9.523810 0.000000 0.5 + 4 1 12.5 0 0.000000 0.000000 1.0 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 28-33 + +Standard regression models +------------------------------------ +Fitting a standard regression model is accomplished using the :code:`Lm` model class in :code:`pymer4`. All we need to do is initialize a model with a formula, some data, and call its :code:`.fit()` method. + +By default the output of :code:`.fit()` has been formated to be a blend of :code:`summary()` in R and :code:`.summary()` from `statsmodels `_. This includes metadata about the model, data, and overall fit as well as estimates and inference results of model terms. + +.. GENERATED FROM PYTHON SOURCE LINES 33-43 + +.. code-block:: Python + + + # Import the linear regression model class + from pymer4.models import Lm + + # Initialize model using 2 predictors and sample data + model = Lm("DV ~ IV1 + IV2", data=df) + + # Fit it + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~IV1+IV2 + + Family: gaussian Estimator: OLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.512 R^2_adj: 0.510 + + Log-likelihood: -2527.681 AIC: 5061.363 BIC: 5074.368 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + Intercept 1.657 -4.107 7.422 2.935 561 0.565 0.573 + IV1 0.334 -0.023 0.690 0.181 561 1.839 0.066 . + IV2 0.747 0.686 0.807 0.031 561 24.158 0.000 *** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 44-45 + +All information about the model as well as data, residuals, estimated coefficients, etc are saved as attributes and can be accessed like this: + +.. GENERATED FROM PYTHON SOURCE LINES 45-49 + +.. code-block:: Python + + + # Print model AIC + print(model.AIC) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + 5061.3629635837815 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 50-54 + +.. code-block:: Python + + + # Look at residuals (just the first 10) + print(model.residuals[:10]) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + [-3.79994762 6.94860187 -8.32917613 1.19463387 -5.8271851 -6.88457421 + 0.40673658 9.77173122 -7.33135842 -7.37107236] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 55-56 + +A copy of the dataframe used to estimate the model with added columns for residuals and fits are are available at :code:`model.data`. Residuals and fits can also be directly accessed using :code:`model.residuals` and :code:`model.fits` respectively + +.. GENERATED FROM PYTHON SOURCE LINES 56-60 + +.. code-block:: Python + + + # Look at model data + print(model.data.head()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Group IV1 DV_l DV IV2 IV3 fits residuals + 0 1 20.0 0 7.936508 4.563492 0.5 11.736456 -3.799948 + 1 1 20.0 0 15.277778 0.000000 1.0 8.329176 6.948602 + 2 1 20.0 1 0.000000 0.000000 1.5 8.329176 -8.329176 + 3 1 20.0 1 9.523810 0.000000 0.5 8.329176 1.194634 + 4 1 12.5 0 0.000000 0.000000 1.0 5.827185 -5.827185 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 61-62 + +This makes it easy to assess overall model fit visually, for example using seaborn + +.. GENERATED FROM PYTHON SOURCE LINES 62-69 + +.. code-block:: Python + + + # import dataviz + import seaborn as sns + + # plot model predicted values against true values + sns.regplot(x="fits", y="DV", data=model.data, fit_reg=True) + + + + +.. image-sg:: /auto_examples/images/sphx_glr_example_01_basic_usage_001.png + :alt: example 01 basic usage + :srcset: /auto_examples/images/sphx_glr_example_01_basic_usage_001.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 70-73 + +Robust and WLS estimation +------------------------- +:code:`Lm` models can also perform inference using robust-standard errors or perform weight-least-squares (experimental feature) for models with categorical predictors (equivalent to Welch's t-test). + +.. GENERATED FROM PYTHON SOURCE LINES 73-77 + +.. code-block:: Python + + + # Refit previous model using robust standard errors + print(model.fit(robust="hc1")) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~IV1+IV2 + + Family: gaussian Estimator: OLS + + Std-errors: robust (hc1) CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.512 R^2_adj: 0.510 + + Log-likelihood: -2527.681 AIC: 5061.363 BIC: 5074.368 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + Intercept 1.657 -3.429 6.744 2.590 561 0.640 0.522 + IV1 0.334 -0.026 0.693 0.183 561 1.823 0.069 . + IV2 0.747 0.678 0.815 0.035 561 21.444 0.000 *** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 78-86 + +.. code-block:: Python + + + # Since WLS is only supported with 2 groups for now, filter the data first + df_two_groups = df.query("IV3 in [0.5, 1.0]").reset_index(drop=True) + + # Fit new a model using a categorical predictor with unequal variances (WLS) + model = Lm("DV ~ IV3", data=df_two_groups) + print(model.fit(weights="IV3")) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~IV3 + + Family: gaussian Estimator: WLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 376 R^2: 0.999 R^2_adj: 0.999 + + Log-likelihood: -532.518 AIC: 1069.036 BIC: 1076.896 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + Intercept 45.647 35.787 55.507 5.015 373.483 9.103 0.000 *** + IV3 -2.926 -15.261 9.410 6.273 373.483 -0.466 0.641 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 87-90 + +Multi-level models +---------------------------- +Fitting a multi-level model works similarly and actually just calls :code:`lmer` or :code:`glmer` in R behind the scenes. The corresponding output is also formatted to be very similar to output of :code:`summary()` in R. + +.. GENERATED FROM PYTHON SOURCE LINES 90-100 + +.. code-block:: Python + + + # Import the lmm model class + from pymer4.models import Lmer + + # Initialize model instance using 1 predictor with random intercepts and slopes + model = Lmer("DV ~ IV2 + (IV2|Group)", data=df) + + # Fit it + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Model failed to converge with max|grad| = 0.00358015 (tol = 0.002, component 1) + + Linear mixed model fit by REML [’lmerMod’] + Formula: DV~IV2+(IV2|Group) + + Family: gaussian Inference: parametric + + Number of observations: 564 Groups: {'Group': 47.0} + + Log-likelihood: -2249.281 AIC: 4510.562 + + Random effects: + + Name Var Std + Group (Intercept) 203.390 14.261 + Group IV2 0.136 0.369 + Residual 121.537 11.024 + + IV1 IV2 Corr + Group (Intercept) IV2 -0.585 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + (Intercept) 10.300 4.806 15.795 2.804 20.183 3.674 0.001 ** + IV2 0.682 0.556 0.808 0.064 42.402 10.599 0.000 *** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 101-102 + +Similar to :code:`Lm` models, :code:`Lmer` models save details in model attributes and have additional methods that can be called using the same syntax as described above. + +.. GENERATED FROM PYTHON SOURCE LINES 102-106 + +.. code-block:: Python + + + # Get population level coefficients + print(model.coefs) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Estimate 2.5_ci 97.5_ci ... T-stat P-val Sig + (Intercept) 10.300430 4.805524 15.795335 ... 3.674034 1.487605e-03 ** + IV2 0.682128 0.555987 0.808268 ... 10.598847 1.706855e-13 *** + + [2 rows x 8 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 107-113 + +.. code-block:: Python + + + # Get group level coefficients (just the first 5) + # Each row here is a unique intercept and slope + # which vary because we parameterized our rfx that way above + print(model.fixef.head(5)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + (Intercept) IV2 + 1 4.482095 0.885138 + 2 17.991023 0.622143 + 3 8.706144 0.838055 + 4 10.143487 0.865341 + 5 10.071328 0.182101 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 114-118 + +.. code-block:: Python + + + # Get group level deviates from population level coefficients (i.e. rfx) + print(model.ranef.head(5)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + X.Intercept. IV2 + 1 -5.818335 0.203011 + 2 7.690593 -0.059985 + 3 -1.594286 0.155927 + 4 -0.156943 0.183213 + 5 -0.229102 -0.500026 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 119-120 + +:code:`Lmer` models also have some basic plotting abilities that :code:`Lm` models do not + +.. GENERATED FROM PYTHON SOURCE LINES 120-124 + +.. code-block:: Python + + + # Visualize coefficients with group/cluster fits overlaid ("forest plot") + model.plot_summary() + + + + +.. image-sg:: /auto_examples/images/sphx_glr_example_01_basic_usage_002.png + :alt: example 01 basic usage + :srcset: /auto_examples/images/sphx_glr_example_01_basic_usage_002.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 125-126 + +Plot coefficients for each group/cluster as separate regressions + +.. GENERATED FROM PYTHON SOURCE LINES 126-128 + +.. code-block:: Python + + model.plot("IV2", plot_ci=True, ylabel="predicted DV") + + + + +.. image-sg:: /auto_examples/images/sphx_glr_example_01_basic_usage_003.png + :alt: example 01 basic usage + :srcset: /auto_examples/images/sphx_glr_example_01_basic_usage_003.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 129-130 + +Because :code:`Lmer` models rely on R, they have also some extra arguments to the :code:`.fit()` method for controlling things like optimizer behavior, as well as additional methods such for post-hoc tests and ANOVAs. See tutorial 2 for information about this functionality. + +.. GENERATED FROM PYTHON SOURCE LINES 132-135 + +Two-stage summary statistics models +----------------------------------- +Fitting :code:`Lm2` models are also very similar + +.. GENERATED FROM PYTHON SOURCE LINES 135-145 + +.. code-block:: Python + + + # Import the lm2 model class + from pymer4.models import Lm2 + + # This time we use the 'group' argument when initializing the model + model = Lm2("DV ~ IV2", group="Group", data=df) + + # Fit it + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + /home/runner/work/pymer4/pymer4/pymer4/stats.py:657: RuntimeWarning: invalid value encountered in scalar divide + return 1 - (rss / tss) + Formula: DV~IV2 + + Family: gaussian + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 Groups: {'Group': 47} + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + Intercept 14.240 4.891 23.589 4.644 46 3.066 0.004 ** + IV2 0.614 0.445 0.782 0.084 46 7.340 0.000 *** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 146-147 + +Like :code:`Lmer` models, :code:`Lm2` models also store group/cluster level estimates and have some basic plotting functionality + +.. GENERATED FROM PYTHON SOURCE LINES 147-151 + +.. code-block:: Python + + + # Get group level coefficients, just the first 5 + print(model.fixef.head(5)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Intercept IV2 + Group + 1 3.039903 1.781832 + 2 23.388350 0.524852 + 3 4.904321 0.919913 + 4 23.304669 0.719425 + 5 18.378387 -0.256136 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 152-156 + +.. code-block:: Python + + + # Visualize coefficients with group/cluster fits overlaid ("forest plot") + model.plot_summary() + + + + +.. image-sg:: /auto_examples/images/sphx_glr_example_01_basic_usage_004.png + :alt: example 01 basic usage + :srcset: /auto_examples/images/sphx_glr_example_01_basic_usage_004.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 157-164 + +Model Persistence +----------------- +All pymer4 models can be saved and loaded from disk. Doing so will persist *all* model attributes and data i.e. anything accessible with the '.' syntax. Models are saved and loaded using `Joblib `_ Therefore all filenames must end with :code:`.joblib`. For :code:`Lmer` models, an additional file ending in :code:`.rds` will be saved in the same directory as the HDF5 file. This is the R model object readable in R using :code:`readRDS`. + +Prior to version 0.8.1 models were saved to HDF5 files using `deepdish `_ but this library is no longer maintained. If you have old models saved as :code:`.h5` or :code:`.hdf5` files you should use the same version of pymer4 that you used to estimate those models. + +To persist models you can use the dedicated :code:`save_model` and :code:`load_model` functions from the :code:`pymer4.io` module + +.. GENERATED FROM PYTHON SOURCE LINES 164-175 + +.. code-block:: Python + + + # Import functions + from pymer4.io import save_model, load_model + + # Save the Lm2 model above + save_model(model, "mymodel.joblib") + # Load it back up + model = load_model("mymodel.joblib") + # Check that it looks the same + print(model) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + pymer4.models.Lm2(fitted=True, formula=DV~IV2, family=gaussian, group=Group) + + + + +.. GENERATED FROM PYTHON SOURCE LINES 176-179 + +Wrap Up +------- +This was a quick overview of the 3 major model classes in :code:`pymer4`. However, it's highly recommended to check out the API to see *all* the features and options that each model class has including things like permutation-based inference (:code:`Lm` and :code:`Lm2` models) and fine-grain control of optimizer and tolerance settings (:code:`Lmer` models). + + +.. _sphx_glr_download_auto_examples_example_01_basic_usage.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_01_basic_usage.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_01_basic_usage.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/example_02_categorical.rst.txt b/_sources/auto_examples/example_02_categorical.rst.txt new file mode 100644 index 0000000..5048dea --- /dev/null +++ b/_sources/auto_examples/example_02_categorical.rst.txt @@ -0,0 +1,568 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_02_categorical.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_02_categorical.py: + + +2. Categorical Predictors +========================= + +.. GENERATED FROM PYTHON SOURCE LINES 7-8 + +The syntax for handling categorical predictors is **different** between standard regression models/two-stage-models (i.e. :code:`Lm` and :code:`Lm2`) and multi-level models (:code:`Lmer`) in :code:`pymer4`. This is because formula parsing is passed to R for :code:`Lmer` models, but handled by Python for other models. + +.. GENERATED FROM PYTHON SOURCE LINES 10-13 + +Lm and Lm2 Models +----------------- +:code:`Lm` and :code:`Lm2` models use `patsy `_ to parse model formulae. Patsy is very powerful and has built-in support for handling categorical coding schemes by wrapping a predictor in then :code:`C()` *within* the module formula. Patsy can also perform some pre-processing such as scaling and standardization using special functions like :code:`center()`. Here are some examples. + +.. GENERATED FROM PYTHON SOURCE LINES 13-23 + +.. code-block:: Python + + + # import basic libraries and sample data + import os + import pandas as pd + from pymer4.utils import get_resource_path + from pymer4.models import Lm + + # IV3 is a categorical predictors with 3 levels in the sample data + df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 24-26 + +Dummy-coded/Treatment contrasts ++++++++++++++++++++++++++++++++ + +.. GENERATED FROM PYTHON SOURCE LINES 26-33 + +.. code-block:: Python + + + # Estimate a model using Treatment contrasts (dummy-coding) + # with '1.0' as the reference level + # This is the default of the C() function + model = Lm("DV ~ C(IV3, levels=[1.0, 0.5, 1.5])", data=df) + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~C(IV3,levels=[1.0,0.5,1.5]) + + Family: gaussian Estimator: OLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.004 R^2_adj: 0.001 + + Log-likelihood: -2728.620 AIC: 5463.241 BIC: 5476.246 + + Fixed effects: + + Estimate 2.5_ci ... P-val Sig + Intercept 42.721 38.334 ... 0.000 *** + C(IV3, levels=[1.0, 0.5, 1.5])[T.0.5] 1.463 -4.741 ... 0.643 + C(IV3, levels=[1.0, 0.5, 1.5])[T.1.5] -3.419 -9.622 ... 0.280 + + [3 rows x 8 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 34-36 + +Orthogonal Polynomial Contrasts ++++++++++++++++++++++++++++++++ + +.. GENERATED FROM PYTHON SOURCE LINES 36-42 + +.. code-block:: Python + + + # Patsy can do this using the Poly argument to the + # C() function + model = Lm("DV ~ C(IV3, Poly)", data=df) + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~C(IV3,Poly) + + Family: gaussian Estimator: OLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.004 R^2_adj: 0.001 + + Log-likelihood: -2728.620 AIC: 5463.241 BIC: 5476.246 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci ... T-stat P-val Sig + Intercept 42.069 39.537 44.602 ... 32.627 0.000 *** + C(IV3, Poly).Linear -3.452 -7.838 0.935 ... -1.546 0.123 + C(IV3, Poly).Quadratic -0.798 -5.185 3.588 ... -0.357 0.721 + + [3 rows x 8 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 43-45 + +Sum-to-zero contrasts ++++++++++++++++++++++ + +.. GENERATED FROM PYTHON SOURCE LINES 45-50 + +.. code-block:: Python + + + # Similar to before but with the Sum argument + model = Lm("DV ~ C(IV3, Sum)", data=df) + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~C(IV3,Sum) + + Family: gaussian Estimator: OLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.004 R^2_adj: 0.001 + + Log-likelihood: -2728.620 AIC: 5463.241 BIC: 5476.246 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE DF T-stat P-val Sig + Intercept 42.069 39.537 44.602 1.289 561 32.627 0.000 *** + C(IV3, Sum)[S.0.5] 2.115 -1.467 5.697 1.823 561 1.160 0.247 + C(IV3, Sum)[S.1.0] 0.652 -2.930 4.234 1.823 561 0.357 0.721 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 51-53 + +Scaling/Centering ++++++++++++++++++ + +.. GENERATED FROM PYTHON SOURCE LINES 53-58 + +.. code-block:: Python + + + # Moderation with IV2, but centering IV2 first + model = Lm("DV ~ center(IV2) * C(IV3, Sum)", data=df) + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Formula: DV~center(IV2)*C(IV3,Sum) + + Family: gaussian Estimator: OLS + + Std-errors: non-robust CIs: standard 95% Inference: parametric + + Number of observations: 564 R^2: 0.511 R^2_adj: 0.507 + + Log-likelihood: -2528.051 AIC: 5068.102 BIC: 5094.113 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci ... T-stat P-val Sig + Intercept 42.051 40.268 43.833 ... 46.329 0.000 *** + C(IV3, Sum)[S.0.5] 0.580 -1.942 3.102 ... 0.452 0.652 + C(IV3, Sum)[S.1.0] 0.383 -2.136 2.903 ... 0.299 0.765 + center(IV2) 0.746 0.685 0.807 ... 24.012 0.000 *** + center(IV2):C(IV3, Sum)[S.0.5] 0.050 -0.037 0.137 ... 1.132 0.258 + center(IV2):C(IV3, Sum)[S.1.0] -0.057 -0.144 0.029 ... -1.306 0.192 + + [6 rows x 8 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 59-60 + +Please refer to the `patsy documentation `_ for more details when working categorical predictors in :code:`Lm` or :code:`Lm2` models. + +.. GENERATED FROM PYTHON SOURCE LINES 62-73 + +Lmer Models +----------- +:code:`Lmer()` models currently have support for handling categorical predictors in one of three ways based on how R's :code:`factor()` works (see the note at the end of this tutorial): + +- Dummy-coded factor levels (treatment contrasts) in which each model term is the difference between a factor level and a selected reference level +- Orthogonal polynomial contrasts in which each model term is a polynomial contrast across factor levels (e.g. linear, quadratic, cubic, etc) +- Custom contrasts for each level of a factor, which should be provided in the manner expected by R. + +To make re-parameterizing models easier, factor codings are passed as a dictionary to the :code:`factors` argument of a model's :code:`.fit()`. This obviates the need for adjusting data-frame properties as in R. Note that this is **different** from :code:`Lm` and :code:`Lm2` models above which expect factor codings in their formulae (because patsy does). + +Each of these ways also enables you to easily compute post-hoc comparisons between factor levels, as well as interactions between continuous predictors and each factor level. See tutorial 3 for more on post-hoc tests. + +.. GENERATED FROM PYTHON SOURCE LINES 73-81 + +.. code-block:: Python + + + from pymer4.models import Lmer + + # We're going to fit a multi-level logistic regression using the + # dichotomous DV_l variable and the same categorical predictor (IV3) + # as before + model = Lmer("DV_l ~ IV3 + (IV3|Group)", data=df, family="binomial") + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 82-85 + +Dummy-coding factors +++++++++++++++++++++ +First we'll use dummy-coding/treatment contrasts with 1.0 as the reference level. This will compute two coefficients: 0.5 > 1.0 and 1.5 > 1.0. + +.. GENERATED FROM PYTHON SOURCE LINES 85-89 + +.. code-block:: Python + + + print(model.fit(factors={"IV3": ["1.0", "0.5", "1.5"]})) + + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + boundary (singular) fit: see help('isSingular') + + Linear mixed model fit by maximum likelihood ['lmerMod'] + Formula: DV_l~IV3+(IV3|Group) + + Family: binomial Inference: parametric + + Number of observations: 564 Groups: {'Group': 47.0} + + Log-likelihood: -389.003 AIC: 796.006 + + Random effects: + + Name Var Std + Group (Intercept) 0.022 0.148 + Group IV30.5 0.060 0.246 + Group IV31.5 0.038 0.196 + + IV1 IV2 Corr + Group (Intercept) IV30.5 -1.0 + Group (Intercept) IV31.5 -1.0 + Group IV30.5 IV31.5 1.0 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE ... Prob_97.5_ci Z-stat P-val Sig + (Intercept) -0.129 -0.419 0.162 0.148 ... 0.540 -0.867 0.386 + IV31 0.129 -0.283 0.540 0.210 ... 0.632 0.612 0.541 + IV32 -0.128 -0.539 0.283 0.210 ... 0.570 -0.612 0.541 + + [3 rows x 13 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 90-93 + +Polynomial contrast coding +++++++++++++++++++++++++++ +Second we'll use orthogonal polynomial contrasts. This is accomplished using the :code:`ordered=True` argument and specifying the order of the *linear* contrast in increasing order. R will automatically compute higher order polynomial contrats that are orthogonal to this linear contrast. In this example, since there are 3 factor levels this will result in two polynomial terms: a linear contrast we specify below corresponding to 0.5 < 1.0 < 1.5 and an orthogonal quadratic contrast automatically determined by R, corresponding to 0.5 > 1 < 1.5 + +.. GENERATED FROM PYTHON SOURCE LINES 93-96 + +.. code-block:: Python + + + print(model.fit(factors={"IV3": ["0.5", "1.0", "1.5"]}, ordered=True)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + boundary (singular) fit: see help('isSingular') + + boundary (singular) fit: see help('isSingular') + + Linear mixed model fit by maximum likelihood ['lmerMod'] + Formula: DV_l~IV3+(IV3|Group) + + Family: binomial Inference: parametric + + Number of observations: 564 Groups: {'Group': 47.0} + + Log-likelihood: -389.003 AIC: 796.006 + + Random effects: + + Name Var Std + Group (Intercept) 0.010 0.098 + Group IV31.0 0.060 0.246 + Group IV31.5 0.003 0.050 + + IV1 IV2 Corr + Group (Intercept) IV31.0 -1.0 + Group (Intercept) IV31.5 -1.0 + Group IV31.0 IV31.5 1.0 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE ... Prob_97.5_ci Z-stat P-val Sig + (Intercept) -0.128 -0.294 0.037 0.085 ... 0.509 -1.518 0.129 + IV31 -0.182 -0.469 0.106 0.147 ... 0.526 -1.238 0.216 + IV32 0.000 -0.292 0.292 0.149 ... 0.572 0.001 1.000 + + [3 rows x 13 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 97-100 + +Custom contrasts +++++++++++++++++ +:code:`Lmer` models can also take custom factor contrasts based on how they are expected by R (see the note at the end of this tutorial for how contrasts work in R). Remember that there can be at most k-1 model terms representing any k level factor without over-parameterizing a model. If you specify a custom contrast, R will generate set of orthogonal contrasts for the rest of your model terms. + +.. GENERATED FROM PYTHON SOURCE LINES 100-106 + +.. code-block:: Python + + + # Compare level '1.0' to the mean of levels '0.5' and '1.5' + # and let R determine the second contrast orthogonal to it + + print(model.fit(factors={"IV3": {"1.0": 1, "0.5": -0.5, "1.5": -0.5}})) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + boundary (singular) fit: see help('isSingular') + + boundary (singular) fit: see help('isSingular') + + boundary (singular) fit: see help('isSingular') + + Linear mixed model fit by maximum likelihood ['lmerMod'] + Formula: DV_l~IV3+(IV3|Group) + + Family: binomial Inference: parametric + + Number of observations: 564 Groups: {'Group': 47.0} + + Log-likelihood: -389.003 AIC: 796.006 + + Random effects: + + Name Var Std + Group (Intercept) 0.022 0.148 + Group IV30.5 0.060 0.246 + Group IV31.5 0.038 0.196 + + IV1 IV2 Corr + Group (Intercept) IV30.5 -1.0 + Group (Intercept) IV31.5 -1.0 + Group IV30.5 IV31.5 1.0 + + Fixed effects: + + Estimate 2.5_ci 97.5_ci SE ... Prob_97.5_ci Z-stat P-val Sig + (Intercept) -0.128 -0.294 0.037 0.085 ... 0.509 -1.518 0.129 + IV31 -0.000 -0.358 0.357 0.182 ... 0.588 -0.001 1.000 + IV32 -0.182 -0.469 0.106 0.147 ... 0.526 -1.238 0.216 + + [3 rows x 13 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 107-112 + +User-created contrasts (without R) +++++++++++++++++++++++++++++++++++ +Another option available to you is fitting a model with *only* your desired contrast(s) rather than a full set of k-1 contrasts. Contrary to how statistics is usually taught, you don't ever *have to* include a full set of k-1 contrasts for a k level factor! The upside to doing this is that you won't need to rely on R to compute anything for you (aside from the model fit), and you will have a model with exactly the number of terms as contrasts you desire, giving you complete control. The downside is that post-hoc tests will no longer be available (see tutorial 3 for more information on post-hoc tests), but it's unlikely you're doing post-hoc tests if you are computing a subset of specific contrasts anyway. This is also a useful approach if you don't want to use patsy's formula syntax with :code:`Lm` and :code:`Lm2` as noted above. + +This can be accomplished by creating new columns in your dataframe to test specific hypotheses and is trivial to do with pandas `map `_ and `assign `_ methods. For example, here we manually compute a linear contrast by creating a new column in our dataframe and treating it as a continuous variable. + +.. GENERATED FROM PYTHON SOURCE LINES 112-117 + +.. code-block:: Python + + + # Create a new column in the dataframe with a custom (linear) contrast + df = df.assign(IV3_custom_lin=df["IV3"].map({0.5: -1, 1.0: 0, 1.5: 1})) + print(df.head()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Group IV1 DV_l DV IV2 IV3 IV3_custom_lin + 0 1 20.0 0 7.936508 4.563492 0.5 -1 + 1 1 20.0 0 15.277778 0.000000 1.0 0 + 2 1 20.0 1 0.000000 0.000000 1.5 1 + 3 1 20.0 1 9.523810 0.000000 0.5 -1 + 4 1 12.5 0 0.000000 0.000000 1.0 0 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 118-119 + +Now we can use this variable as a continuous predictor without the need for the :code:`factors` argument. Notice how the z-stat and p-value of the estimate are the same as the linear polynomial contrast estimated above. The coefficients differ in scale only because R uses [~-0.707, ~0, ~0.707] for its polynomial contrasts rather than [-1, 0, 1] like we did. + +.. GENERATED FROM PYTHON SOURCE LINES 119-126 + +.. code-block:: Python + + + # Estimate model + model = Lmer( + "DV_l ~ IV3_custom_lin + (IV3_custom_lin|Group)", data=df, family="binomial" + ) + print(model.fit()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + boundary (singular) fit: see help('isSingular') + + Linear mixed model fit by maximum likelihood ['lmerMod'] + Formula: DV_l~IV3_custom_lin+(IV3_custom_lin|Group) + + Family: binomial Inference: parametric + + Number of observations: 564 Groups: {'Group': 47.0} + + Log-likelihood: -389.016 AIC: 788.031 + + Random effects: + + Name Var Std + Group (Intercept) 0.0 0.0 + Group IV3_custom_lin 0.0 0.0 + + IV1 IV2 Corr + Group (Intercept) IV3_custom_lin + + Fixed effects: + + Estimate 2.5_ci 97.5_ci ... Z-stat P-val Sig + (Intercept) -0.128 -0.294 0.037 ... -1.517 0.129 + IV3_custom_lin -0.128 -0.331 0.075 ... -1.239 0.215 + + [2 rows x 13 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 127-133 + +A note on how contrasts in R work +--------------------------------- +.. note:: + This is just for folks curious about how contrasts in R work + +Specifying multiple custom contrasts in R has always been a point of confusion amongst users. This because the :code:`contrasts()` command in R doesn't actually expect contrast weights (i.e. a design matrix) as one would intuit. Rather, it is made for generating contrast coding schemes which are the inverse of the contrast weight matrix. For a longer explanation with examples see `this reference `_ and `this reference `_. For these situations pymer4 offers a few utility functions to convert between these matrix types if desired in :code:`pymer4.utils`: :code:`R2con()` and :code:`con2R()`. + + +.. _sphx_glr_download_auto_examples_example_02_categorical.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_02_categorical.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_02_categorical.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/example_03_posthoc.rst.txt b/_sources/auto_examples/example_03_posthoc.rst.txt new file mode 100644 index 0000000..3fde804 --- /dev/null +++ b/_sources/auto_examples/example_03_posthoc.rst.txt @@ -0,0 +1,465 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_03_posthoc.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_03_posthoc.py: + + +3. ANOVA tables and post-hoc comparisons +======================================== + +.. GENERATED FROM PYTHON SOURCE LINES 7-13 + +.. note:: + ANOVAs and post-hoc tests are only available for :code:`Lmer` models estimated using the :code:`factors` argument of :code:`model.fit()` and rely on implementations in R + +In the previous tutorial where we looked at categorical predictors, behind the scenes :code:`pymer4` was using the :code:`factor` functionality in R. This means the output of :code:`model.fit()` looks a lot like :code:`summary()` in R applied to a model with categorical predictors. But what if we want to compute an F-test across *all levels* of our categorical predictor? + +:code:`pymer4` makes this easy to do, and makes it easy to ensure Type III sums of squares infereces are valid. It also makes it easy to follow up omnibus tests with post-hoc pairwise comparisons. + +.. GENERATED FROM PYTHON SOURCE LINES 15-20 + +ANOVA tables and orthogonal contrasts +------------------------------------- +Because ANOVA is just regression, :code:`pymer4` can estimate ANOVA tables with F-results using the :code:`.anova()` method on a fitted model. This will compute a Type-III SS table given the coding scheme provided when the model was initially fit. Based on the distribution of data across factor levels and the specific coding-scheme used, this may produce invalid Type-III SS computations. For this reason the :code:`.anova()` method has a :code:`force-orthogonal=True` argument that will reparameterize and refit the model using orthogonal polynomial contrasts prior to computing an ANOVA table. + +Here we first estimate a mode with dummy-coded categories and suppress the summary output of :code:`.fit()`. Then we use :code:`.anova()` to examine the F-test results. + +.. GENERATED FROM PYTHON SOURCE LINES 20-40 + +.. code-block:: Python + + + # import basic libraries and sample data + import os + import pandas as pd + from pymer4.utils import get_resource_path + from pymer4.models import Lmer + + # IV3 is a categorical predictors with 3 levels in the sample data + df = pd.read_csv(os.path.join(get_resource_path(), "sample_data.csv")) + + # # We're going to fit a multi-level regression using the + # categorical predictor (IV3) which has 3 levels + model = Lmer("DV ~ IV3 + (1|Group)", data=df) + + # Using dummy-coding; suppress summary output + model.fit(factors={"IV3": ["1.0", "0.5", "1.5"]}, summarize=False) + + # Get ANOVA table + print(model.anova()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom: + (NOTE: Using original model contrasts, orthogonality not guaranteed) + SS MS NumDF DenomDF F-stat P-val Sig + IV3 2359.778135 1179.889067 2 515.000001 5.296284 0.005287 ** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 41-44 + +Type III SS inferences will only be valid if data are fully balanced across levels or if contrasts between levels are orthogonally coded and sum to 0. Below we tell :code:`pymer4` to respecify our contrasts to ensure this before estimating the ANOVA. :code:`pymer4` also saves the last set of contrasts used priory to forcing orthogonality. + +Because the sample data is balanced across factor levels and there are not interaction terms, in this case orthogonal contrast coding doesn't change the results. + +.. GENERATED FROM PYTHON SOURCE LINES 44-50 + +.. code-block:: Python + + + # Get ANOVA table, but this time force orthogonality + # for valid SS III inferences + # In this case the data are balanced so nothing changes + print(model.anova(force_orthogonal=True)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom: + (NOTE: Model refit with orthogonal polynomial contrasts) + SS MS NumDF DenomDF F-stat P-val Sig + IV3 2359.778135 1179.889067 2 515.000001 5.296284 0.005287 ** + + + + +.. GENERATED FROM PYTHON SOURCE LINES 51-56 + +.. code-block:: Python + + + # Checkout current contrast scheme (for first contrast) + # Notice how it's simply a linear contrast across levels + print(model.factors) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + {'IV3': ['0.5', '1.0', '1.5']} + + + + +.. GENERATED FROM PYTHON SOURCE LINES 57-63 + +.. code-block:: Python + + + # Checkout previous contrast scheme + # which was a treatment contrast with 1.0 + # as the reference level + print(model.factors_prev_) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + {'IV3': ['1.0', '0.5', '1.5']} + + + + +.. GENERATED FROM PYTHON SOURCE LINES 64-69 + +Marginal estimates and post-hoc comparisons +------------------------------------------- +:code:`pymer4` leverages the :code:`emmeans` package in order to compute marginal estimates ("cell means" in ANOVA lingo) and pair-wise comparisons of models that contain categorical terms and/or interactions. This can be performed by using the :code:`.post_hoc()` method on fitted models. Let's see an example: + +First we'll quickly create a second categorical IV to demo with and estimate a 3x3 ANOVA to get main effects and the interaction. + +.. GENERATED FROM PYTHON SOURCE LINES 69-91 + +.. code-block:: Python + + + # Fix the random number generator + # for reproducibility + import numpy as np + + np.random.seed(10) + + # Create a new categorical variable with 3 levels + df = df.assign(IV4=np.random.choice(["1", "2", "3"], size=df.shape[0])) + + # Estimate model with orthogonal polynomial contrasts + model = Lmer("DV ~ IV4*IV3 + (1|Group)", data=df) + model.fit( + factors={"IV4": ["1", "2", "3"], "IV3": ["1.0", "0.5", "1.5"]}, + ordered=True, + summarize=False, + ) + # Get ANOVA table + # We can ignore the note in the output because + # we manually specified polynomial contrasts + print(model.anova()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom: + (NOTE: Using original model contrasts, orthogonality not guaranteed) + SS MS NumDF DenomDF F-stat P-val Sig + IV4 449.771051 224.885525 2 510.897775 1.006943 0.366058 + IV3 2486.124318 1243.062159 2 508.993080 5.565910 0.004063 ** + IV4:IV3 553.852530 138.463132 4 511.073624 0.619980 0.648444 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 92-95 + +Example 1 +~~~~~~~~~ +Compare each level of IV3 to each other level of IV3, *within* each level of IV4. Use default Tukey HSD p-values. + +.. GENERATED FROM PYTHON SOURCE LINES 95-104 + +.. code-block:: Python + + + # Compute post-hoc tests + marginal_estimates, comparisons = model.post_hoc( + marginal_vars="IV3", grouping_vars="IV4" + ) + + # "Cell" means of the ANOVA + print(marginal_estimates) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + P-values adjusted by tukey method for family of 3 estimates + IV3 IV4 Estimate 2.5_ci 97.5_ci SE DF + 1 1.0 1 42.554 33.778 51.330 4.398 68.140 + 2 0.5 1 45.455 36.644 54.266 4.417 69.299 + 3 1.5 1 40.904 32.196 49.612 4.361 65.943 + 4 1.0 2 42.092 33.301 50.882 4.406 68.609 + 5 0.5 2 41.495 32.829 50.161 4.339 64.626 + 6 1.5 2 38.786 29.961 47.612 4.425 69.746 + 7 1.0 3 43.424 34.741 52.107 4.348 65.149 + 8 0.5 3 46.008 37.261 54.755 4.383 67.208 + 9 1.5 3 38.119 29.384 46.854 4.376 66.801 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 105-109 + +.. code-block:: Python + + + # Pairwise comparisons + print(comparisons) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Contrast IV4 Estimate 2.5_ci ... DF T-stat P-val Sig + 1 IV31.0 - IV30.5 1 -2.901 -9.523 ... 510.016 -1.030 0.558 + 2 IV31.0 - IV31.5 1 1.650 -4.750 ... 510.137 0.606 0.817 + 3 IV30.5 - IV31.5 1 4.552 -1.951 ... 510.267 1.645 0.228 + 4 IV31.0 - IV30.5 2 0.596 -5.749 ... 510.249 0.221 0.973 + 5 IV31.0 - IV31.5 2 3.305 -3.387 ... 510.883 1.161 0.477 + 6 IV30.5 - IV31.5 2 2.709 -3.749 ... 510.732 0.986 0.586 + 7 IV31.0 - IV30.5 3 -2.584 -8.893 ... 510.213 -0.963 0.601 + 8 IV31.0 - IV31.5 3 5.305 -1.006 ... 510.710 1.976 0.119 + 9 IV30.5 - IV31.5 3 7.889 1.437 ... 510.663 2.874 0.012 * + + [9 rows x 10 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 110-113 + +Example 2 +~~~~~~~~~ +Compare each unique IV3,IV4 "cell mean" to every other IV3,IV4 "cell mean" and used FDR correction for multiple comparisons: + +.. GENERATED FROM PYTHON SOURCE LINES 113-123 + +.. code-block:: Python + + + + # Compute post-hoc tests + marginal_estimates, comparisons = model.post_hoc( + marginal_vars=["IV3", "IV4"], p_adjust="fdr" + ) + + # Pairwise comparisons + print(comparisons) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + P-values adjusted by fdr method for 36 comparisons + Contrast Estimate 2.5_ci ... T-stat P-val Sig + 1 IV31.0 IV41 - IV30.5 IV41 -2.901 -11.957 ... -1.030 0.535 + 2 IV31.0 IV41 - IV31.5 IV41 1.650 -7.102 ... 0.606 0.726 + 3 IV31.0 IV41 - IV31.0 IV42 0.463 -8.657 ... 0.163 0.871 + 4 IV31.0 IV41 - IV30.5 IV42 1.059 -7.649 ... 0.391 0.835 + 5 IV31.0 IV41 - IV31.5 IV42 3.768 -5.364 ... 1.326 0.473 + 6 IV31.0 IV41 - IV31.0 IV43 -0.870 -9.659 ... -0.318 0.869 + 7 IV31.0 IV41 - IV30.5 IV43 -3.454 -12.306 ... -1.254 0.473 + 8 IV31.0 IV41 - IV31.5 IV43 4.435 -4.426 ... 1.609 0.390 + 9 IV30.5 IV41 - IV31.5 IV41 4.552 -4.341 ... 1.645 0.390 + 10 IV30.5 IV41 - IV31.0 IV42 3.364 -5.732 ... 1.189 0.493 + 11 IV30.5 IV41 - IV30.5 IV42 3.960 -4.883 ... 1.440 0.446 + 12 IV30.5 IV41 - IV31.5 IV42 6.669 -2.568 ... 2.321 0.186 + 13 IV30.5 IV41 - IV31.0 IV43 2.031 -6.796 ... 0.740 0.637 + 14 IV30.5 IV41 - IV30.5 IV43 -0.552 -9.603 ... -0.196 0.869 + 15 IV30.5 IV41 - IV31.5 IV43 7.336 -1.568 ... 2.648 0.118 + 16 IV31.5 IV41 - IV31.0 IV42 -1.188 -10.044 ... -0.431 0.827 + 17 IV31.5 IV41 - IV30.5 IV42 -0.591 -9.041 ... -0.225 0.869 + 18 IV31.5 IV41 - IV31.5 IV42 2.117 -6.937 ... 0.752 0.637 + 19 IV31.5 IV41 - IV31.0 IV43 -2.520 -11.037 ... -0.951 0.535 + 20 IV31.5 IV41 - IV30.5 IV43 -5.104 -13.818 ... -1.883 0.362 + 21 IV31.5 IV41 - IV31.5 IV43 2.785 -5.986 ... 1.021 0.535 + 22 IV31.0 IV42 - IV30.5 IV42 0.596 -8.082 ... 0.221 0.869 + 23 IV31.0 IV42 - IV31.5 IV42 3.305 -5.848 ... 1.161 0.493 + 24 IV31.0 IV42 - IV31.0 IV43 -1.333 -10.235 ... -0.481 0.811 + 25 IV31.0 IV42 - IV30.5 IV43 -3.916 -12.888 ... -1.403 0.446 + 26 IV31.0 IV42 - IV31.5 IV43 3.972 -4.883 ... 1.442 0.446 + 27 IV30.5 IV42 - IV31.5 IV42 2.709 -6.123 ... 0.986 0.535 + 28 IV30.5 IV42 - IV31.0 IV43 -1.929 -10.318 ... -0.739 0.637 + 29 IV30.5 IV42 - IV30.5 IV43 -4.513 -13.207 ... -1.669 0.390 + 30 IV30.5 IV42 - IV31.5 IV43 3.376 -5.172 ... 1.270 0.473 + 31 IV31.5 IV42 - IV31.0 IV43 -4.638 -13.457 ... -1.691 0.390 + 32 IV31.5 IV42 - IV30.5 IV43 -7.222 -16.183 ... -2.590 0.118 + 33 IV31.5 IV42 - IV31.5 IV43 0.667 -8.475 ... 0.235 0.869 + 34 IV31.0 IV43 - IV30.5 IV43 -2.584 -11.212 ... -0.963 0.535 + 35 IV31.0 IV43 - IV31.5 IV43 5.305 -3.325 ... 1.976 0.351 + 36 IV30.5 IV43 - IV31.5 IV43 7.889 -0.935 ... 2.874 0.118 + + [36 rows x 9 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 124-129 + +Example 3 +~~~~~~~~~ +For this example we'll estimate a more complicated ANOVA with 1 continuous IV and 2 categorical IVs with 3 levels each. This is the same model as before but with IV2 thrown into the mix. Now, pairwise comparisons reflect changes in the *slope* of the continuous IV (IV2) between levels of the categorical IVs (IV3 and IV4). + +First let's get the ANOVA table + +.. GENERATED FROM PYTHON SOURCE LINES 129-141 + +.. code-block:: Python + + model = Lmer("DV ~ IV2*IV3*IV4 + (1|Group)", data=df) + # Only need to polynomial contrasts for IV3 and IV4 + # because IV2 is continuous + model.fit( + factors={"IV4": ["1", "2", "3"], "IV3": ["1.0", "0.5", "1.5"]}, + ordered=True, + summarize=False, + ) + + # Get ANOVA table + print(model.anova()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + SS Type III Analysis of Variance Table with Satterthwaite approximated degrees of freedom: + (NOTE: Using original model contrasts, orthogonality not guaranteed) + SS MS NumDF ... F-stat P-val Sig + IV2 46010.245470 46010.245470 1 ... 306.765451 1.220547e-54 *** + IV3 726.318000 363.159000 2 ... 2.421301 8.984551e-02 . + IV4 143.379932 71.689966 2 ... 0.477981 6.203159e-01 + IV2:IV3 613.455876 306.727938 2 ... 2.045056 1.304528e-01 + IV2:IV4 4.914900 2.457450 2 ... 0.016385 9.837494e-01 + IV3:IV4 92.225327 23.056332 4 ... 0.153724 9.612985e-01 + IV2:IV3:IV4 368.085569 92.021392 4 ... 0.613537 6.530638e-01 + + [7 rows x 7 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 142-143 + +Now we can compute the pairwise difference in slopes + +.. GENERATED FROM PYTHON SOURCE LINES 143-151 + +.. code-block:: Python + + + # Compute post-hoc tests with bonferroni correction + marginal_estimates, comparisons = model.post_hoc( + marginal_vars="IV2", grouping_vars=["IV3", "IV4"], p_adjust="bonf" + ) + + # Pairwise comparisons + print(comparisons) + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + P-values adjusted by bonf method for 3 comparisons + Contrast IV4 Estimate 2.5_ci ... DF T-stat P-val Sig + 1 IV31.0 - IV30.5 1 -0.053 -0.254 ... 502.345 -0.638 1.000 + 2 IV31.0 - IV31.5 1 -0.131 -0.313 ... 502.494 -1.734 0.250 + 3 IV30.5 - IV31.5 1 -0.078 -0.278 ... 502.821 -0.933 1.000 + 4 IV31.0 - IV30.5 2 -0.038 -0.210 ... 501.096 -0.526 1.000 + 5 IV31.0 - IV31.5 2 0.002 -0.184 ... 502.745 0.031 1.000 + 6 IV30.5 - IV31.5 2 0.040 -0.142 ... 502.836 0.530 1.000 + 7 IV31.0 - IV30.5 3 -0.134 -0.329 ... 502.956 -1.646 0.301 + 8 IV31.0 - IV31.5 3 -0.110 -0.302 ... 502.109 -1.368 0.516 + 9 IV30.5 - IV31.5 3 0.024 -0.166 ... 502.538 0.304 1.000 + + [9 rows x 10 columns] + + + + + +.. _sphx_glr_download_auto_examples_example_03_posthoc.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_03_posthoc.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_03_posthoc.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/example_04_simulating_data.rst.txt b/_sources/auto_examples/example_04_simulating_data.rst.txt new file mode 100644 index 0000000..d67e9ee --- /dev/null +++ b/_sources/auto_examples/example_04_simulating_data.rst.txt @@ -0,0 +1,410 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_04_simulating_data.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_04_simulating_data.py: + + +4. Simulating Data +================== +:code:`pymer4` comes with some easy-to-use functions for simulating data that can be modeled with :code:`Lm` and multi-level data that can be modeled with :code:`Lmer` or :code:`Lm2`. These functions can be found in the :code:`pymer4.simulate` module and are aptly named: :code:`simulate_lm()` and :code:`simulate_lmm()` respectively. + +:code:`pymer4` gives you a lot of control over what you want your data to look like by setting properties such as: + +- Number of data points and number of coefficients +- Specific coefficient values +- Means and standard deviations of predictors +- Correlations between predictors +- Amount of error (noise) in the data +- Number of groups/clusters (multi-level data only) +- Variance of random effects (multi-level data only) + +.. GENERATED FROM PYTHON SOURCE LINES 18-23 + +Generating standard regression data +----------------------------------- +Generating data for a standard regression returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lm()`, along with an array of coefficients used to produce the data. + +Let's generate 500 observations, with coefficient values of: 1.2, -40.1, and 3. We also have an intercept with a value of 100. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 1. We'll also add noise from a normal distribution with mean = 0, and sd = 5. Any correlations between predictors are purely random. + +.. GENERATED FROM PYTHON SOURCE LINES 23-38 + +.. code-block:: Python + + + # Import the simulation function + from pymer4.simulate import simulate_lm + + # Also fix the random number generator for reproducibility + import numpy as np + + np.random.seed(10) + + data, b = simulate_lm( + 500, 3, coef_vals=[100, 1.2, -40.1, 3], mus=[10, 30, 1], noise_params=(0, 5) + ) + print(f"True coefficients:\n{b}\n") + print(f"Data:\n{data.head()}") + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + True coefficients: + [100, 1.2, -40.1, 3] + + Data: + DV IV1 IV2 IV3 + 0 -1114.325941 11.331587 30.715279 -0.545400 + 1 -1116.406768 9.991616 30.621336 0.279914 + 2 -1088.455691 10.265512 30.108549 1.004291 + 3 -1092.013632 9.825400 30.433026 2.203037 + 4 -1124.899182 9.034934 31.028274 1.228630 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 39-40 + +Here are some checks you might do to make sure the data were correctly generated: + +.. GENERATED FROM PYTHON SOURCE LINES 42-43 + +Check the means of predictors + +.. GENERATED FROM PYTHON SOURCE LINES 43-45 + +.. code-block:: Python + + print(data.iloc[:, 1:].mean(axis=0)) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + IV1 10.002923 + IV2 30.039709 + IV3 0.962177 + dtype: float64 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 46-47 + +Check correlations between predictors + +.. GENERATED FROM PYTHON SOURCE LINES 47-49 + +.. code-block:: Python + + print(data.iloc[:, 1:].corr()) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + IV1 IV2 IV3 + IV1 1.000000 -0.013148 -0.010051 + IV2 -0.013148 1.000000 -0.051630 + IV3 -0.010051 -0.051630 1.000000 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 50-51 + +Check coefficient recovery + +.. GENERATED FROM PYTHON SOURCE LINES 51-57 + +.. code-block:: Python + + from pymer4.models import Lm + + model = Lm("DV ~ IV1+IV2+IV3", data=data) + model.fit(summarize=False) + print(model.coefs.loc[:, "Estimate"]) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + Intercept 95.474548 + IV1 1.342881 + IV2 -40.001760 + IV3 2.859270 + Name: Estimate, dtype: float64 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 58-59 + +You have the option of being as general or specific as you like when generating data. Here's a simpler example that generates 100 observations with 5 predictors from a standard normal distribution, i.e. mean = 0, sd = 1 with random correlations between predictors. :code:`pymer4` will randomly decide what to set the coefficient values to. + +.. GENERATED FROM PYTHON SOURCE LINES 59-64 + +.. code-block:: Python + + + data, b = simulate_lm(100, 5) + print(f"True coefficients:\n{b}\n") + print(f"Data:\n{data.head()}") + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + True coefficients: + [0.05682538 0.04259271 0.63572183 0.2399937 0.08991266 0.17923857] + + Data: + DV IV1 IV2 IV3 IV4 IV5 + 0 -1.619562 -0.063833 -0.471785 -0.419493 1.270657 -1.576390 + 1 1.493992 0.670564 1.008049 1.803014 -0.040395 -0.621471 + 2 -1.630406 -1.527920 0.199663 -1.006917 0.062326 -0.190250 + 3 -0.315245 0.424936 -0.171909 -0.144126 1.227489 0.078798 + 4 1.911261 1.242033 -0.811868 0.446330 0.356810 -0.437578 + + + + +.. GENERATED FROM PYTHON SOURCE LINES 65-70 + +Generating multi-level regression data +-------------------------------------- +Generating data for a multi-level regression is just as simple and returns a pandas dataframe with outcome and predictor variables ready for use with :code:`Lmer()`, another dataframe with group/cluster level coefficients (i.e. BLUPs), and a vector of population-level coefficients. + +Here's an example generating 5000 observations, organized as 100 groups with 50 observations each. We'll have three predictors with the coefficients: 1.8, -2, and 10. We also have an intercept with a coefficient of 4. The means of the columns of our design matrix (i.e. means of the predictors) will be: 10, 30, and 2. We'll also introduce correlations between our predictors of with a mean r of .15. We'll leave the default of standard normal noise i.e., mean = 0, and sd = 1. + +.. GENERATED FROM PYTHON SOURCE LINES 70-88 + +.. code-block:: Python + + + from pymer4.simulate import simulate_lmm + + num_obs = 50 + num_coef = 3 + num_grps = 100 + mus = [10.0, 30.0, 2.0] + coef_vals = [4.0, 1.8, -2, 10] + corrs = 0.15 + + data, blups, b = simulate_lmm( + num_obs, num_coef, num_grps, coef_vals=coef_vals, mus=mus, corrs=corrs + ) + + print(f"True coefficients:\n{b}\n") + print(f"BLUPs:\n{blups.head()}\n") + print(f"Data:\n{data.head()}\n") + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + True coefficients: + [4.0, 1.8, -2, 10] + + BLUPs: + Intercept IV1 IV2 IV3 + Grp1 4.118082 1.908896 -1.769091 9.887560 + Grp2 4.250422 1.898551 -1.513031 10.359999 + Grp3 4.076250 1.858520 -2.267093 10.168399 + Grp4 3.830477 1.776946 -1.921247 9.583227 + Grp5 4.141466 2.170102 -1.892564 10.349354 + + Data: + DV IV1 IV2 IV3 Group + 0 -4.179066 9.383356 29.476310 2.438898 1.0 + 1 8.983399 12.129908 31.362946 3.859619 1.0 + 2 -13.442347 10.061723 29.302197 1.580586 1.0 + 3 -10.241627 10.758237 29.259286 1.631702 1.0 + 4 -15.502489 11.585787 30.199303 1.076930 1.0 + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 89-90 + +Again here are some checks you might do to make sure the data were correctly generated (by default lmm data will generally be a bit noisier due to within and across group/cluster variance; see the API for how to customize this): + +.. GENERATED FROM PYTHON SOURCE LINES 90-94 + +.. code-block:: Python + + + # Group the data before running checks + group_data = data.groupby("Group") + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 95-96 + +Check mean of predictors within each group + +.. GENERATED FROM PYTHON SOURCE LINES 96-98 + +.. code-block:: Python + + print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].mean(axis=0))) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + IV1 IV2 IV3 + Group + 1.0 9.901321 30.039194 1.758267 + 2.0 9.976000 30.104749 1.984167 + 3.0 10.222086 30.194326 1.905938 + 4.0 9.879292 30.215769 2.130761 + 5.0 9.903163 30.274854 1.941497 + ... ... ... ... + 96.0 9.943912 29.950404 1.952312 + 97.0 10.047164 29.978932 2.231869 + 98.0 9.997547 30.018299 2.205165 + 99.0 10.213984 30.044085 1.965605 + 100.0 9.965338 30.120661 1.870400 + + [100 rows x 3 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 99-100 + +Check correlations between predictors within each group + +.. GENERATED FROM PYTHON SOURCE LINES 100-102 + +.. code-block:: Python + + print(group_data.apply(lambda grp: grp.iloc[:, 1:-1].corr())) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + IV1 IV2 IV3 + Group + 1.0 IV1 1.000000 0.272855 0.303139 + IV2 0.272855 1.000000 0.134635 + IV3 0.303139 0.134635 1.000000 + 2.0 IV1 1.000000 0.079445 0.373448 + IV2 0.079445 1.000000 0.002340 + ... ... ... ... + 99.0 IV2 0.113312 1.000000 0.235816 + IV3 0.055161 0.235816 1.000000 + 100.0 IV1 1.000000 0.317120 0.261968 + IV2 0.317120 1.000000 0.139132 + IV3 0.261968 0.139132 1.000000 + + [300 rows x 3 columns] + + + + +.. GENERATED FROM PYTHON SOURCE LINES 103-104 + +Check coefficient recovery + +.. GENERATED FROM PYTHON SOURCE LINES 104-109 + +.. code-block:: Python + + from pymer4.models import Lmer + + model = Lmer("DV ~ IV1+IV2+IV3 + (1|Group)", data=data) + model.fit(summarize=False) + print(model.coefs.loc[:, "Estimate"]) + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + (Intercept) 4.082829 + IV1 1.845101 + IV2 -2.007044 + IV3 10.023242 + Name: Estimate, dtype: float64 + + + + + +.. _sphx_glr_download_auto_examples_example_04_simulating_data.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_04_simulating_data.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_04_simulating_data.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/example_05_misc_stats.rst.txt b/_sources/auto_examples/example_05_misc_stats.rst.txt new file mode 100644 index 0000000..36fef90 --- /dev/null +++ b/_sources/auto_examples/example_05_misc_stats.rst.txt @@ -0,0 +1,197 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/example_05_misc_stats.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_example_05_misc_stats.py: + + +5. Additional Statistics Functions +================================== +:code:`pymer4` also comes with some flexible routines for various statistical operations such as permutation testing, bootstrapping of arbitrary functions and equivalence testing. Here are a few examples: + +.. GENERATED FROM PYTHON SOURCE LINES 8-11 + +Permutation Tests +----------------- +:code:`pymer4` can compute a wide variety of one and two-sample permutation tests including mean differences, t-statistics, effect size comparisons, and correlations + +.. GENERATED FROM PYTHON SOURCE LINES 11-28 + +.. code-block:: Python + + + # Import numpy and set random number generator + import numpy as np + + np.random.seed(10) + # Import stats functions + from pymer4.stats import perm_test + + # Generate two samples of data: X (M~2, SD~10, N=100) and Y (M~2.5, SD~1, N=100) + x = np.random.normal(loc=2, size=100) + y = np.random.normal(loc=2.5, size=100) + + # Between groups t-test. The first value is the t-stat and the + # second is the permuted p-value + result = perm_test(x, y, stat="tstat", n_perm=500, n_jobs=1) + print(result) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + (-3.529814975986372, 0.001996007984031936) + + + + +.. GENERATED FROM PYTHON SOURCE LINES 29-35 + +.. code-block:: Python + + + # Spearman rank correlation. The first values is spearman's rho + # and the second is the permuted p-value + result = perm_test(x, y, stat="spearmanr", n_perm=500, n_jobs=1) + print(result) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + (0.04469246924692469, 0.6786427145708582) + + + + +.. GENERATED FROM PYTHON SOURCE LINES 36-39 + +Bootstrap Comparisons +---------------------- +:code:`pymer4` can compute a bootstrap comparison using any arbitrary function that takes as input either one or two 1d numpy arrays, and returns a single value. + +.. GENERATED FROM PYTHON SOURCE LINES 39-55 + +.. code-block:: Python + + + # Import stats function + from pymer4.stats import boot_func + + + # Define a simple function for a median difference test + def med_diff(x, y): + return np.median(x) - np.median(y) + + + # Between groups median test with resampling + # The first value is the median difference and the + # second is the lower and upper 95% confidence interval + result = boot_func(x, y, func=med_diff) + print(result) + + + + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + (-0.4928648709628707, (-0.8719792375122976, -0.09680478598285287)) + + + + +.. GENERATED FROM PYTHON SOURCE LINES 56-59 + +TOST Equivalence Tests +---------------------- +:code:`pymer4` also has experimental support for `two-one-sided equivalence tests `_. + +.. GENERATED FROM PYTHON SOURCE LINES 59-70 + +.. code-block:: Python + + + # Import stats function + from pymer4.stats import tost_equivalence + + # Generate some data + lower, upper = -0.1, 0.1 + x, y = np.random.normal(0.145, 0.025, 35), np.random.normal(0.16, 0.05, 17) + result = tost_equivalence(x, y, lower, upper, plot=True) + # Print the results dictionary nicely + for k, v in result.items(): + print(f"{k}: {v}\n") + + + +.. image-sg:: /auto_examples/images/sphx_glr_example_05_misc_stats_001.png + :alt: example 05 misc stats + :srcset: /auto_examples/images/sphx_glr_example_05_misc_stats_001.png + :class: sphx-glr-single-img + + +.. rst-class:: sphx-glr-script-out + + .. code-block:: none + + original: {'m': -0.005770606287536645, 't': -0.4781080137390306, 'p': 0.6533466533466533} + + lower: {'m': -0.1, 't': 7.807122166868652, 'p': 5.9293193911969926e-08} + + upper: {'m': 0.1, 't': -8.763338194346712, 'p': 8.999109365849837e-09} + + cohens_d: {'m': -0.17019805423837045, 'CI_lb': -0.8348542426833095, 'CI_ub': 0.5990340538537716} + + In_Equivalence_Range: True + + Means_Are_Different: False + + + + + + +.. _sphx_glr_download_auto_examples_example_05_misc_stats.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: example_05_misc_stats.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: example_05_misc_stats.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/index.rst.txt b/_sources/auto_examples/index.rst.txt new file mode 100644 index 0000000..995a68d --- /dev/null +++ b/_sources/auto_examples/index.rst.txt @@ -0,0 +1,142 @@ +:orphan: + +Usage Guide +=========== + +Usage examples: + +.. note:: + :code:`print()` statements in the examples below are only so these docs render at this site. They are not required for actual usage. + + Sometimes using ``pymer4`` interactively can cause the Python kernel to crash. This is more likely to happen if you have multiple interactive sessions running simulatenously. One way around this is to put this at the top of your notebook/code: + + .. code-block:: python + + import os + os.environ['KMP_DUPLICATE_LIB_OK']='True' + + + +.. raw:: html + +
    + + +.. raw:: html + +
    + +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_01_basic_usage_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_01_basic_usage.py` + +.. raw:: html + +
    1. Basic Usage Guide
    +
    + + +.. raw:: html + +
    + +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_02_categorical_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_02_categorical.py` + +.. raw:: html + +
    2. Categorical Predictors
    +
    + + +.. raw:: html + +
    + +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_03_posthoc_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_03_posthoc.py` + +.. raw:: html + +
    3. ANOVA tables and post-hoc comparisons
    +
    + + +.. raw:: html + +
    + +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_04_simulating_data_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_04_simulating_data.py` + +.. raw:: html + +
    4. Simulating Data
    +
    + + +.. raw:: html + +
    + +.. only:: html + + .. image:: /auto_examples/images/thumb/sphx_glr_example_05_misc_stats_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_example_05_misc_stats.py` + +.. raw:: html + +
    5. Additional Statistics Functions
    +
    + + +.. raw:: html + +
    + + +.. toctree:: + :hidden: + + /auto_examples/example_01_basic_usage + /auto_examples/example_02_categorical + /auto_examples/example_03_posthoc + /auto_examples/example_04_simulating_data + /auto_examples/example_05_misc_stats + + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-gallery + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download all examples in Python source code: auto_examples_python.zip ` + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/sg_execution_times.rst.txt b/_sources/auto_examples/sg_execution_times.rst.txt new file mode 100644 index 0000000..6d49049 --- /dev/null +++ b/_sources/auto_examples/sg_execution_times.rst.txt @@ -0,0 +1,49 @@ + +:orphan: + +.. _sphx_glr_auto_examples_sg_execution_times: + + +Computation times +================= +**00:09.845** total execution time for 5 files **from auto_examples**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_example_05_misc_stats.py` (``example_05_misc_stats.py``) + - 00:03.386 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_02_categorical.py` (``example_02_categorical.py``) + - 00:02.545 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_01_basic_usage.py` (``example_01_basic_usage.py``) + - 00:02.147 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_03_posthoc.py` (``example_03_posthoc.py``) + - 00:01.434 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_04_simulating_data.py` (``example_04_simulating_data.py``) + - 00:00.333 + - 0.0 diff --git a/_sources/citation.rst.txt b/_sources/citation.rst.txt new file mode 100644 index 0000000..5f16d9b --- /dev/null +++ b/_sources/citation.rst.txt @@ -0,0 +1,4 @@ +Citation +======== +If you use this software please cite as: +Jolly, (2018). Pymer4: Connecting R and Python for Linear Mixed Modeling. *Journal of Open Source Software*, 3(31), 862, https://doi.org/10.21105/joss.00862 \ No newline at end of file diff --git a/_sources/contributing.rst.txt b/_sources/contributing.rst.txt new file mode 100644 index 0000000..1e4ef33 --- /dev/null +++ b/_sources/contributing.rst.txt @@ -0,0 +1,86 @@ +Contributing +============ +Maintaining this package is tricky because of its inter-language operability. In particular this requires keeping up with API changes to Python packages (e.g. pandas), R packages (e.g. lmerTest) as well as changes in rpy2 (which tend to break between versions), the interface package between them. For these reasons contributions are **always** welcome! Checkout the `development roadmap on Github `_. Also note the diagram and explanation below which illustrate how code development cycles work and how automated deployment is handled through Travis CI. + +Development Cycle and workflow +------------------------------ + +All automation for testing, documentation, and packaging is handled through Github Actions. We use separate workflows to handle testing and packaging. + +Testing ++++++++ +Any pushes or PRs against the :code:`master` branch will trigger the **Tests** GA workflow. This is a simple workflow that: + +- sets up a :code:`conda` environment with required :code:`R` dependencies +- installs the latest code from the :code:`master` branch +- runs tests and builds documentation (as an additional testing layer) + +Packaging Stable Releases ++++++++++++++++++++++++++ +A stable release can be installed from :code:`pip` or from :code:`conda` using the :code:`-c ejolly` channel flag. Packaging a stable release requires building 3 artifacts: + +1. Conda packages for multiple platforms uploaded to the main :code:`ejolly` channel on anaconda cloud +2. A pip installable package uploaded to Pypi +3. Documentation site deployed to github pages + +To create a new release: + +1. Publish a new release via github +2. Manually trigger the **Build** and **Build_noarch** workflows and enable uploading to the main channel on anaconda, uploading to pypi, and deploying documentation + +*Note: Previously this process was automated to trigger when a github release is made, but this seems to be unreliable as the commit hash is missing and causes runners to not find the built tarballs* + +Packaging Development Releases +++++++++++++++++++++++++++++++ +Development releases can be install directly from the :code:`master` branch on github using :code:`pip install git+https://github.com/ejolly/pymer4.git` or conda using the :code:`-c ejolly/label/pre-release` channel flag. + +A development release only includes 1 artifact: + +1. Conda packages for multiple platforms uploaded to the :code:`ejolly/label/pre-release` channel on anaconda cloud + +Development releases are created the same way as stable releases using the same **Build** and **Build_noarch** workflows, but choosing the "pre-release" option for uploading to anaconda cloud and disabling pypi and documentation deploys. The default options for these works flow will simply build packages but perform no uploading at all which can useful for testing package builds. + +Updating deployed documentation ++++++++++++++++++++++++++++++++ +To deploy only documentation changes you can use *either* the **Build** workflow and enable the documentation deploy or the **Docs** workflow which is a bit faster as it skips packaging building. + +Code Guidelines +--------------- +Please use the `black `_ code formatter for styling code. Any easy way to check if code is formatted properly is to use a `git pre-commit hook `_. After installing black, just create a file called :code:`.git/hooks/pre-commit` and put the following inside: + + .. code-block:: bash + + #!/bin/sh + black --check . + +This will prevent the use of the :code:`git commit` command if black notes any files that have not been formatted. Just format those files and you should be able to proceed with the commit! + +Please use `google style docstrings `_ for documenting all functions, methods, and classes. + +Please be sure to include tests with any code submissions and verify they pass using `pytest `_. To run all package tests you can use :code:`pytest -s --capture=no` in the project root. To run specific tests you can point to a file or even a test function within a file, e.g. :code:`pytest pymer4/test/test_models.py -k "test_gaussian_lm"` + +Versioning Guidelines +--------------------- + +The current :code:`pymer4` scheme is `PEP 440 `_ compliant with two and only two forms of version strings: :code:`M.N.P` and :code:`M.N.P.devX`. Versions with the :code:`.devX` designation denote development versions typically on the :code:`master` branch or :code:`conda` pre-release channel. + +This simplifed scheme is not illustrated in the PEP 440 examples, but if was it would be described as "major.minor.micro" with development releases. To illustrate, the version sequence would look like this: + + .. code-block:: bash + + 0.7.0 + 0.7.1.dev0 + 0.7.1.dev1 + 0.7.1 + +The third digit(s) in the :code:`pymer4` scheme, i.e. PEP 440 "micro," are not strictly necessary but are useful for semantically versioned "patch" designations. The :code:`.devX` extension on the other hand denotes a sequence of incremental work in progress like the alpha, beta, developmental, release candidate system without the alphabet soup. + +Documentation Guidelines +------------------------ +Documentation is written with `sphinx `_ using the `bootstrap theme `_. Tutorial usage of package features is written using `sphinx gallery `_. + +To edit and build docs locally you'll need to install these packages using: :code:`pip install sphinx sphinx_bootstrap_theme sphinx-gallery`. Then from within the :code:`docs` folder you can run :code:`make html`. + +To add new examples to the tutorials simply create a new :code:`.py` file in the :code:`examples/` directory that begins with :code:`example_`. Any python code will be executed with outputs when the :code:`make html` command is run and automatically rendered in the tutorial gallery. You can add non-code comments with `rST syntax `_ using other files in the :code:`examples/` directory as a guide. + +In addition to making it easy to create standalone examples of package features, the tutorial gallery serves as another layer of testing for the package. This can be really useful to ensure previous functionality is preserved when adding new features or fixing issues. \ No newline at end of file diff --git a/_sources/features.rst.txt b/_sources/features.rst.txt new file mode 100644 index 0000000..2a1dd1c --- /dev/null +++ b/_sources/features.rst.txt @@ -0,0 +1,46 @@ +Features +======== + +Overview +-------- +All :code:`pymer4` models operate on long-format `pandas dataframes `_. These dataframes should contain columns for a dependent variable, independent variable(s), and optionally a column for a group/cluster identifiers. + +Currently, :code:`pymer4` contains 3 different model classes: + +- :code:`Lm` for ordinary-least-squares and weighted-least-squares regression optionally with robust standard errors +- :code:`Lmer` for multi-level models estimated using :code:`glmer()` in R. +- :code:`Lm2` for two-stage ordinary-least-squares in which a separate :code:`Lm` model is fit to every group/cluster and inference is performed on the coefficients across all groups/clusters. This is also known as the "summary statistics approach" and is an alternative to multi-level models estimated using :code:`Lmer`, which implicitly allow for both random-intercepts and random-slopes but shares no information across each groups/clusters to help during estimation. + +Standard regression models +-------------------------- +:code:`Lm` models which are equivalent to :code:`lm()` in R with the following additional features: + +- Automatic inclusion of confidence intervals in model output +- Optional empirically bootstrapped 95% confidence intervals +- Cluster-robust, heteroscedasticity-robust or auto-correlation-robust, 'sandwich estimators' for standard errors (*note: these are not the same as auto-regressive models*) +- Weighted-least-squares models (experimental) +- Permutation tests on model parameters + +Multi-level models +------------------ +:code:`Lmer` models which are equivalent to :code:`glmer()` in R with the following additional features: + +- Automatic inclusion of p-values in model output using `lmerTest `_ +- Automatic inclusion of confidence intervals in model output +- Automatic conversion and calculation of odds-ratios and probabilities for logit models +- Easy access to group/cluster fixed and random effects as pandas dataframes +- Random effects plotting using seaborn +- Easy post-hoc tests with multiple-comparisons correction via `emmeans `_ +- Easy model predictions on new data +- Easy generation of new data from a fitted model +- Optional permuted p-value computation via within cluster permutation testing (experimental) +- **note** that :code:`Lmer`'s usage of :code:`coef`, :code:`fixef`, and :code:`ranef` differs a bit from R: +- :code:`coef` = :code:`summary(model)` in R, i.e. "top level" estimates, i.e. the summary output of the model that can be used to make predictions on new datasets and on which inference (i.e. p-values) are computed +- :code:`fixef` = :code:`coef(model)` in R, i.e. "group/cluster" level *fixed effects,* conceptually similar to coefficients obtained from running a seperate :code:`Lm` (:code:`lm` in R) for each group/cluster +- :code:`ranef` = :code:`ranef(model)` in R, i.e. "group/cluster" level *random effects,* deviance of each cluster with respect to "top level" estimates + +Other Features +-------------- +- Highly customizable functions for simulating data useful for standard regression models and multi-level models +- Convenience methods for plotting model estimates, including random-effects terms in multi-level models +- Statistics functions for effect-size computation, permutations of various 1 and 2 sample tests, bootstrapping of various 1 and 2 sample tests, and two-one-sided equivalence tests diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..d48f49f --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,88 @@ +Pymer4 +====== +.. image:: https://github.com/ejolly/pymer4/actions/workflows/Tests.yml/badge.svg + :target: https://github.com/ejolly/pymer4/actions/workflows/Tests.yml + +.. image:: https://github.com/ejolly/pymer4/actions/workflows/Build.yml/badge.svg + :target: https://github.com/ejolly/pymer4/actions/workflows/Build.yml + +.. image:: https://badge.fury.io/py/pymer4.svg + :target: https://badge.fury.io/py/pymer4 + +.. image:: https://anaconda.org/ejolly/pymer4/badges/version.svg + :target: https://anaconda.org/ejolly/pymer4 + +.. image:: https://anaconda.org/ejolly/pymer4/badges/platforms.svg + :target: https://anaconda.org/ejolly/pymer4 + +.. image:: https://pepy.tech/badge/pymer4 + :target: https://pepy.tech/project/pymer4 + + +.. image:: http://joss.theoj.org/papers/10.21105/joss.00862/status.svg + :target: https://doi.org/10.21105/joss.00862 + +.. image:: https://zenodo.org/badge/90598701.svg + :target: https://zenodo.org/record/1523205 + +.. image:: https://img.shields.io/badge/python-3.8%20%7C%203.9%20%7C%203.10%20%7C%203.11-blue + +.. raw:: html + +
    + +.. image:: https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat + :target: https://github.com/ejolly/pymer4/issues + +:code:`pymer4` is a statistics library for estimating various regression and multi-level models in Python. Love `lme4 `_ in R, but prefer to work in the scientific Python ecosystem? This package has got you covered! + +:code:`pymer4` provides a clean interface that hides the back-and-forth code required when moving between R and Python. In other words, you can work completely in Python, never having to deal with R, but get (most) of lme4's goodness. This is accomplished using `rpy2 `_ to interface between langauges. + +Additionally :code:`pymer4` can fit various additional regression models with some bells, such as robust standard errors, and two-stage regression (summary statistics) models. See the features page for more information. + +**TL;DR** This package is your new *simple* Pythonic drop-in replacement for :code:`lm()` or :code:`glmer()` in R. + +For an example of what's possible check out the tutorials or `this blog post `_ comparing different modeling strategies for clustered/repeated-measures data. + +.. raw:: html + +
    +
    +
    +

    Contents

    +
    +
    + +.. toctree:: + :maxdepth: 1 + + Features + Installation + What's New + Tutorial + Lme4 RFX Cheatsheet + API reference + Citation + Contributing + + +.. raw:: html + +
    +
    +
    + +Publications +++++++++++++ +:code:`pymer4` has been used to analyze data is several publications including but not limited to: + +- Jolly, E., Sadhukha, S., & Chang, L.J. (in press). Custom-molded headcases have limited efficacy in reducing head motion during naturalistic fMRI expreiments. *NeuroImage*. +- Sharon, G., Cruz, N. J., Kang, D. W., et al. (2019). Human gut microbiota from autism spectrum disorder promote behavioral symptoms in mice. *Cell*, 177(6), 1600-1618. +- Urbach, T. P., DeLong, K. A., Chan, W. H., & Kutas, M. (2020). An exploratory data analysis of word form prediction during word-by-word reading. *Proceedings of the National Academy of Sciences*, 117(34), 20483-20494. +- Chen, P. H. A., Cheong, J. H., Jolly, E., Elhence, H., Wager, T. D., & Chang, L. J. (2019). Socially transmitted placebo effects. *Nature Human Behaviour*, 3(12), 1295-1305. + +Citing +++++++ +If you use :code:`pymer4` in your own work, please cite: + +Jolly, (2018). Pymer4: Connecting R and Python for Linear Mixed Modeling. *Journal of Open Source Software*, 3(31), 862, https://doi.org/10.21105/joss.00862 diff --git a/_sources/installation.rst.txt b/_sources/installation.rst.txt new file mode 100644 index 0000000..6230b2c --- /dev/null +++ b/_sources/installation.rst.txt @@ -0,0 +1,170 @@ +Installation +============ +.. note:: + :code:`pymer4` since version 0.6.0 is only compatible with Python 3. Versions 0.5.0 and lower will work with Python 2, but will not contain any new features. + +Using Anaconda (recommended) +---------------------------- + +For the latest stable release (recommended) ++++++++++++++++++++++++++++++++++++++++++++ + +:code:`pymer4` has some dependecies that can only be resolved using `conda-forge +`_ (e.g. recent versions of :code:`R, lme4, rpy2` etc). For +this reason I recommend preferring :code:`conda-forge` for all packages in the +environment you use for :code:`pymer4`. If you prefer to use the defaults Anaconda +channel you can switch the order of the channel priorities in any of the commands below, +i.e. :code:`-c conda-forge -c defaults` to :code:`-c defaults -c conda-forge`. + +Creating and installing into a new environment +############################################## + + .. code-block:: bash + + conda create --name pymer4 -c ejolly -c conda-forge -c defaults pymer4 + conda activate pymer4 + +Installing into an existing environment +####################################### + + .. code-block:: bash + + conda install -c ejolly -c conda-forge -c defaults pymer4 + +.. note:: + Both commands above pull dependencies from conda-forge *first* rather than the + default Anaconda channel. It's good practice to maintain this channel priority if + you add additional packages to your environment. So be mindful of adding a :code:`-c + conda-forge` flag if you install any additional packages into your environment. You + can avoid this if you deliberately reversed the order of channels when installing + :code:`pymer4` as noted above. + +For the latest development release +++++++++++++++++++++++++++++++++++ + +Simply use either command above and substitute :code:`ejolly` for :code:`ejolly/label/pre-release`, i.e. + + .. code-block:: bash + + conda install -c ejolly/label/pre-release -c conda-forge -c defaults pymer4 + +Speed Ups on Intel CPUs ++++++++++++++++++++++++ + +If you are installing on an Intel CPU, you can additionally request the highly optimized +Intel Math Kernel Library (MKL) which uses optimized math libraries for Basic Linear Algebra Subprograms (BLAS) computations and can provide substantial speed ups for :code:`pymer4` as well as:code:`numpy`. + + .. code-block:: bash + + conda install -c ejolly -c conda-forge -c defaults pymer4 "blas=*=mkl*" + +This isn't recommended for other CPUs (e.g. AMD) as MKL will actually *slow down* computations. Instead you can request OpenBLAS, which is the default when installing :code:`pymer4` from conda-forge. If you want to install this explicitly the following command will work: + + .. code-block:: bash + + conda install -c ejolly -c conda-forge -c defaults pymer4 "blas=*=openblas*" + + +Using pip +--------- + +.. warning:: + It's strongly advised to use the conda install method above because of how notoriously finicky it can be to install :code:`rpy2` on various platforms. I recommend only following the directions below if you're comfortable with :code:`pip` and the command line or prefer not to use Anaconda. + +Prerequisites ++++++++++++++ +:code:`pymer4` requires a working R installation along with three R packages: :code:`lme4`, :code:`lmerTest`, and :code:`emmeans`. Follow either option below to make sure these are installed. + +1. If you already have R/RStudio installed +########################################## +Make sure you also have the 3 required R packages which can be installed from within R/RStudio using: + + .. code-block:: R + + install.packages(c('lme4','lmerTest','emmeans')) + +2. If you don't have R/RStudio installed +######################################## +The `Anaconda Python distribution `_ can also install and maintain R and R-packages for you. To install R and the the required packages through Anaconda: + + .. code-block:: bash + + conda install -c conda-forge r r-base r-lmertest r-emmeans rpy2 + +For the latest stable release ++++++++++++++++++++++++++++++ +After either option you can pip install :code:`pymer4` + + .. code-block:: bash + + pip install pymer4 + +For the latest development release +++++++++++++++++++++++++++++++++++ +Install via github: + + .. code-block:: bash + + pip install git+https://github.com/ejolly/pymer4.git + + +Making sure the install worked +------------------------------ +You can test the installation by running the following command in a terminal + + .. code-block:: bash + + python -c "from pymer4.test_install import test_install; test_install()" + +Installation Issues +------------------- + +If you have installed via :code:`pip` it's recommended you try the :code:`conda` method described above prior to raising an issue on github. Otherwise the following solutions may help. + +Missing R packages +++++++++++++++++++ + +If you follow step 2 in the prerequisites above (i.e. let Anaconda install R for you), some users have reported that the ``conda install`` command above sometimes doesn't install everything you need; for example the `matrix `_ package. You can fix this by either installing any missing packages from within R directly by first launching R at a terminal using ``R``, then adding the package with ``install.packages("Matrix")`` or by using Anaconda and prepending ``r-`` infront of the *lowercase* name of the package: ``conda install -c conda-forge r-matrix``. + + +Compiler Issues on macOS +++++++++++++++++++++++++ +Some of the more cryptic error messages you might encounter on macOS are due to compiler issues that give ``rpy2`` (a package dependency of ``pymer4``) some issues during install. Here's a fix that should work for that: + +1. Install `homebrew `_ if you don't have it already by running the command at the link (it's a great pacakage manager for macOS). To check if you already have it, do ``which brew`` in your Terminal. If nothing pops up you don't have it. +2. Fix brew permissions: ``sudo chown -R $(whoami) $(brew --prefix)/*`` (this is **necessary** on macOS Sierra or higher (>= macOS 10.12)) +3. Update homebrew ``brew update`` +4. Install the xz uitility ``brew install xz`` +5. At this point you can try to re-install ``pymer4`` and re-test the installation. If it still doesn't work follow the next few steps below +6. Install an updated compiler: ``brew install gcc``, or if you have homebrew already, ``brew upgrade gcc`` +7. Enable the new compiler for use: + + .. code-block:: bash + + export CC="$(find `brew info gcc | grep usr | sed 's/(.*//' | awk '{printf $1"/bin"}'` -name 'x86*gcc-?')" + export CFLAGS="-W" + +8. If the above results in any error output (it should return nothing) you might need to manually find out where the new compiler is installed. To do so use ``brew info gcc`` and ``cd`` into the directory that begins with ``/usr`` in the output of that command. From there ``cd`` into ``bin`` and look for a file that begins with ``x86`` and ends with ``gcc-7``. It's possible that the directory ends with ``gcc-8`` or a higher number based on how recently you installed from homebrew. In that case, just use the latest version. Copy the *full path* to that file and run the following: + + .. code-block:: bash + + export CC= pathYouCopiedInQuotes + export CFLAGS="-W" + +9. Finally install ``rpy2`` using the new compiler you just installed: ``pip install rpy2`` if you have R/RStudio or ``conda install -c conda-forge rpy2`` if you don't. +10. Now you should be able to ``pip install pymer4`` :) + +Kernel Crashes in Jupyter Notebooks/Lab +--------------------------------------- +Sometimes using ``pymer4`` interactively can cause the Python kernel to crash. This is more likely to happen if you have multiple interactive sessions running simulatenously. One way around this is to put this at the top of your notebook/code: + + .. code-block:: python + + import os + os.environ['KMP_DUPLICATE_LIB_OK']='True' + +Or set the following environment variable prior to launching your interactive sessions: + + .. code-block:: bash + + export KMP_DUPLICATE_LIB_OK=TRUE diff --git a/_sources/new.rst.txt b/_sources/new.rst.txt new file mode 100644 index 0000000..6def9f9 --- /dev/null +++ b/_sources/new.rst.txt @@ -0,0 +1,169 @@ +What's New +========== +Historically :code:`pymer4` versioning was a bit all over the place but has settled down since 0.5.0. This page includes the most notable updates between versions but github is the best place to checkout more details and `releases `_. + +0.8.1 +----- +- **Compatibility Updates:** + - This version includes a :code:`noarch` build that should be installable on arm-based macOS platforms (e.g. M1, M2, etc) + - This version drops support for Python 3.7 and adds support for 3.9-3.11 +- **Breaking changes:** + - This version also uses :code:`joblib` for model saving and loading and drops supported hdf5 files previously handled with the :code:`deepdish` library as it is no longer actively maintained. This means that 0.8.1 will **not** be able to load models saved with earlier versions of :code:`pymer4`! +- **Fixes:** + - `#119 `_ + - `#122 `_ + - `#125 `_ + +0.8.0 +----- +- **NOTE:** + - there was no 0.7.9 release as there were enough major changes to warrant a new + minor release version + - this version unpins the maximum versions of :code:`rpy2` and :code:`pandas` + - if there are install issues with the :code:`conda` release accompanying this version you should be able to successfully install into a conda environment using pip with the following: :code:`conda install 'r-lmerTest' 'r-emmeans' rpy2 -c conda-forge` followed by :code:`pip install pymer4` +- **Bug fixes:** + - fixed as issue where :code:`Lmer` with :code:`family='binomial'` was not + converting logits into probabilities correctly + - fixes `#79 `_ + - fixes `#88 `_ + - fixes `#113 `_ + - fixes `#114 `_ + - generally more robust conversion of R types to pandas + +- **New features:** + - :code:`Lm` models now support :code:`family='binomial'` and uses the + :code:`LogisticRegression` class from scikit-learn with no regularization for + estimation. Estimates and errors have been verified against the :code:`glm` + implementation in R + - new :code:`lrt` function for estimating likelihood-ratio tests between + :code:`Lmer` models thanks to `@dramanica `_. This + replicates the functionality of :code:`anova()` in R for :code:`lmer` models. + - new :code:`.confint()` method for :code:`Lmer` models thanks to `@dramanica + `_. This allows computing confidence intervals on 1 + or more paramters of an already fit model including random effects which are not + computed by default when calling :code:`.fit()` + +0.7.8 +----- +- Maintenance release that pins :code:`rpy2 >= 3.4.5,< 3.5.1` due to R -> Python dataframe conversion issue on recent :code:`rpy2` versions that causes a `recursion error `_. +- Pending code changes to support :code:`rpy2 >= 3.5.1` are tracked on `this development branch `_. **Upcoming releases will drop support for** :code:`rpy2 < 3.5.X` +- Clearer error message when making circular predictions using :code:`Lmer` models + +0.7.7 +----- +- This version is identical to 0.7.6 but supports :code:`R >= 4.1` +- Installation is also more flexible and includes instructions for using :code:`conda-forge` and optimized libraries (MKL) for Intel CPUs + +0.7.6 +----- +- **Bug fixes:** + - fixes an issue in which a :code:`Lmer` model fit using categorical predictors would be unable to use :code:`.predict` or would return fitted values instead of predictions on new data. random effect and fixed effect index names were lost thanks to Mario Leaonardo Salinas for discovering this issue + +0.7.5 +----- +- This version is identical to 0.7.4 and simply exists because a naming conflict that resulted in a failed released to Anaconda cloud. See release notes for 0.7.4 below + +0.7.4 +----- +- **Compatibility updates:** + - This version drops official support for Python 3.6 and adds support for Python 3.9. While 3.6 should still work for the most part, development support and testing against this version of Python will no longer continue moving forward. +- **New features:** + - :code:`utils.result_to_table` function nicely formats the :code:`model.coefs` output for a fitted model. The docstring also contains instructions on using this in conjunction with the `gspread-pandas `_ library for "exporting" model results to a google sheet + +0.7.3 +----- +- **Bug fixes:** + - fix issue in which random effect and fixed effect index names were lost thanks to `@jcheong0428 `_ and `@Shotgunosine `_ for the quick PRs! + +0.7.2 +----- +- **Bug fixes:** + - fix bug in which :code:`boot_func` would fail iwth :code:`y=None` and :code:`paired=False` +- **Compatibility updates:** + - add support for :code:`rpy2>=3.4.3` which handles model matrices differently + - pin maximum :code:`pandas<1.2`. This is neccesary until our other dependency :code:`deepdish` adds support. See `this issue `_ + +0.7.1 +----- +- **Pymer4 will be on conda as of this release!** + - install with :code:`conda install -c ejolly -c defaults -c conda-forge pymer4` + - This should make installation much easier + - Big thanks to `Tom Urbach `_ for assisting with this! +- **Bug fixes:** + - design matrix now handles rfx only models properly + - compatibility with the latest version of pandas and rpy2 (as of 08/20) + - :code:`Lmer.residuals` now save as numpy array rather than :code:`R FloatVector` +- **New features:** + - :code:`stats.tost_equivalence` now takes a :code:`seed` argument for reproducibility +- **Result Altering Change:** + - Custom contrasts in :code:`Lmer` models are now expected to be specified in *human readable* format. This should be more intuitive for most users and is often what users expect from R itself, even though that's not what it actually does! R expects custom contrasts passed to the :code:`contrasts()` function to be the *inverse* of the desired contrasts. See `this vignette `_ for more info. + - In :code:`Pymer4`, specifying the following contrasts: :code:`model.fit(factors = {"Col1": {'A': 1, 'B': -.5, 'C': -.5}}))` will estimate the difference between A and the mean of B and C as one would expect. Behind the scenes, :code:`Pymer4` is performing the inversion operation automatically for R. +- Lots of other devops changes to make testing, bug-fixing, development, future releases and overall maintenance much easier. Much of this work has been off-loaded to automated testing and deployment via Travis CI. + + +0.7.0 +----- +- **dropped support for versions of** :code:`rpy2 < 3.0` +- **Result Altering Change:** :code:`Lm` standard errors are now computed using the square-root of the adjusted mean-squared-error :code:`(np.sqrt(res.T.dot(res) / (X.shape[0] - X.shape[1])))` rather than the standard deviation of the residuals with DOF adjustment :code:`(np.std(res, axis=0, ddof=X.shape[1]))`. While these produce the same results if an intercept is included in the model, they differ slightly when an intercept is not included. Formerly in the no-intercept case, results from pymer4 would differ slightly from R or statsmodels. This change ensures the results are always identical in all cases. +- **Result Altering Change:** :code:`Lm` rsquared and adjusted rsquared now take into account whether an intercept is included in the model estimation and adjust accordingly. This is consistent with the behavior of R and statsmodels +- **Result Altering Change:** hc1 is the new default robust estimator for :code:`Lm` models, changed from hc0 +- **API change:** all model residuals are now saved in the :code:`model.residuals` attribute and were formerly saved in the :code:`model.resid` attribute. This is to maintain consistency with :code:`model.data` column names. +- **New feature:** addition of :code:`pymer4.stats` module for various parametric and non-parametric statistics functions (e.g. permutation testing and bootstrapping) +- **New feature:** addition of :code:`pymer4.io` module for saving and loading models to disk +- **New feature:** addition of :code:`Lm2` models that can perform multi-level modeling by first estimating a separate regression for each group and then performing inference on those estimates. Can perform inference on first-level semi-partial and partial correlation coefficients instead of betas too. +- **New feature:** All model classes now have the ability to rank transform data prior to estimation, see the rank argument of their respective :code:`.fit()` methods. +- **New features for Lm models:** + - :code:`Lm` models can transform coefficients to partial or semi-partial correlation coefficients + - :code:`Lm` models can also perform weight-least-squares (WLS) regression given the weights argument to :code:`.fit()`, with optional dof correction via Satterthwaite approximation. This is useful for categorical (e.g. group) comparison where one does not want to assume equal variance between groups (e.g. Welch's t-test). This remains an experimental feature + - :code:`Lm` models can compute hc1 and hc2 robust standard errors +- **New documentation look:** the look and feel of the docs site has been completely changed which should make getting information much more accessible. Additionally, overview pages have now been turned into downloadable tutorial jupyter notebooks +- All methods/functions capable of parallelization now have their default :code:`n_jobs` set to 1 (i.e. no default parallelization) +- Various bug fixes to all models +- Automated testing on travis now pins specific r and r-package versions +- Switched from lsmeans to emmeans for post-hoc tests because lsmeans is deprecated +- Updated interactions with rpy2 api for compatibility with version 3 and higher +- Refactored package layout for easier maintainability + +0.6.0 +----- +- **Dropped support for Python 2** +- upgraded :code:`rpy2` dependency version +- Added conda installation instructions +- Accepted `JOSS `_ version + +0.5.0 +----- +- :code:`Lmer` models now support all generalized linear model family types supported by lme4 (e.g. poisson, gamma, etc) +- :code:`Lmer` models now support ANOVA tables with support for auto-orthogonalizing factors using the :code:`.anova()` method +- Test statistic inference for :code:`Lmer` models can now be performed via non-parametric permutation tests that shuffle observations within clusters +- :code:`Lmer.fit(factors={})` arguments now support custom arbitrary contrasts +- New forest plots for visualizing model estimates and confidence intervals via the :code:`Lmer.plot_summary()` method +- More comprehensive documentation with examples of new features +- Submission to `JOSS `_ + +0.4.0 +----- +- Added :code:`.post_hoc()` method to :code:`Lmer` models +- Added :code:`.simulate()` method to :code:`Lmer` models +- Several bug fixes for Python 3 compatibility + +0.3.2 +----- +- addition of :code:`simulate` module + +0.2.2 +----- +- Official pyipi **release** + +0.2.1 +----- +- Support for standard linear regression models +- Models include support for robust standard errors, boot-strapped CIs, and permuted inference + +0.2.0 +----- +- Support for categorical predictors, model predictions, and model plots + +0.1.0 +----- +- Linear and Logit multi-level models diff --git a/_sources/rfx_cheatsheet.rst.txt b/_sources/rfx_cheatsheet.rst.txt new file mode 100644 index 0000000..ec87367 --- /dev/null +++ b/_sources/rfx_cheatsheet.rst.txt @@ -0,0 +1,24 @@ +Lme4 Random Effects Cheat Sheet +=============================== + +Because :code:`Lmer` models just call the :code:`lme4` package in R behind the scenes, some familiarity with :code:`lmer` model `formulae `_ is required. Here is a quick reference for common random effects specifications: + +.. code-block:: python + + #Random intercepts only + (1 | Group) + + #Random slopes only + (0 + Variable | Group) + + #Random intercepts and slopes (and their correlation) + (Variable | Group) + + #Random intercepts and slopes (without their correlation) + (1 | Group) + (0 + Variable | Group) + + #Same as above but will not separate factors (see: https://rdrr.io/cran/lme4/man/expandDoubleVerts.html) + (Variable || Group) + + #Random intercept and slope for more than one variable (and their correlations) + (Variable_1 + Variable_2 | Group) diff --git a/_sources/sg_execution_times.rst.txt b/_sources/sg_execution_times.rst.txt new file mode 100644 index 0000000..bc64519 --- /dev/null +++ b/_sources/sg_execution_times.rst.txt @@ -0,0 +1,49 @@ + +:orphan: + +.. _sphx_glr_sg_execution_times: + + +Computation times +================= +**00:09.845** total execution time for 5 files **from all galleries**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_example_05_misc_stats.py` (``../examples/example_05_misc_stats.py``) + - 00:03.386 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_02_categorical.py` (``../examples/example_02_categorical.py``) + - 00:02.545 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_01_basic_usage.py` (``../examples/example_01_basic_usage.py``) + - 00:02.147 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_03_posthoc.py` (``../examples/example_03_posthoc.py``) + - 00:01.434 + - 0.0 + * - :ref:`sphx_glr_auto_examples_example_04_simulating_data.py` (``../examples/example_04_simulating_data.py``) + - 00:00.333 + - 0.0 diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..cfc60b8 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +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; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +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 { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/binder_badge_logo.svg b/_static/binder_badge_logo.svg new file mode 100644 index 0000000..327f6b6 --- /dev/null +++ b/_static/binder_badge_logo.svg @@ -0,0 +1 @@ + launchlaunchbinderbinder \ No newline at end of file diff --git a/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 0000000..09e88ce --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 0000000..f4ede63 --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/_static/bootstrap-2.3.2/css/bootstrap.css b/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 0000000..b725064 --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/_static/bootstrap-2.3.2/css/bootstrap.min.css b/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..b6428e6 --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/_static/bootstrap-2.3.2/js/bootstrap.js b/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 0000000..638bb18 --- /dev/null +++ b/_static/bootstrap-2.3.2/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('