diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree deleted file mode 100644 index f7b54d8..0000000 Binary files a/docs/build/doctrees/index.doctree and /dev/null differ diff --git a/docs/build/doctrees/modules.doctree b/docs/build/doctrees/modules.doctree deleted file mode 100644 index 0fb6ef9..0000000 Binary files a/docs/build/doctrees/modules.doctree and /dev/null differ diff --git a/docs/build/doctrees/setup.doctree b/docs/build/doctrees/setup.doctree deleted file mode 100644 index f6df961..0000000 Binary files a/docs/build/doctrees/setup.doctree and /dev/null differ diff --git a/docs/build/doctrees/statannotations.doctree b/docs/build/doctrees/statannotations.doctree deleted file mode 100644 index 2fd98df..0000000 Binary files a/docs/build/doctrees/statannotations.doctree and /dev/null differ diff --git a/docs/build/doctrees/statannotations.stats.doctree b/docs/build/doctrees/statannotations.stats.doctree deleted file mode 100644 index 556534b..0000000 Binary files a/docs/build/doctrees/statannotations.stats.doctree and /dev/null differ diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo deleted file mode 100644 index 633b86f..0000000 --- a/docs/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# 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: e9f3508e439d00c65299ca22c3f70b92 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/_sources/index.rst.txt b/docs/build/html/_sources/index.rst.txt deleted file mode 100644 index 70f6f93..0000000 --- a/docs/build/html/_sources/index.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -.. statannotations documentation master file, created by - sphinx-quickstart on Sun Jun 27 09:05:52 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to statannotations's documentation! -=========================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - modules - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/build/html/_sources/modules.rst.txt b/docs/build/html/_sources/modules.rst.txt deleted file mode 100644 index 86a09c7..0000000 --- a/docs/build/html/_sources/modules.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ -statannotations -=============== - -.. toctree:: - :maxdepth: 4 - - statannotations - custom-test diff --git a/docs/build/html/_sources/setup.rst.txt b/docs/build/html/_sources/setup.rst.txt deleted file mode 100644 index 552eb49..0000000 --- a/docs/build/html/_sources/setup.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -setup module -============ - -.. automodule:: setup - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/html/_sources/statannotations.rst.txt b/docs/build/html/_sources/statannotations.rst.txt deleted file mode 100644 index e48438f..0000000 --- a/docs/build/html/_sources/statannotations.rst.txt +++ /dev/null @@ -1,63 +0,0 @@ -statannotations package -======================= - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - statannotations.stats - -Submodules ----------- - -statannotations.Annotation module ---------------------------------- - -.. automodule:: statannotations.Annotation - :members: - :undoc-members: - :show-inheritance: - -.. _Annotator_module: - -statannotations.Annotator module --------------------------------- - -.. automodule:: statannotations.Annotator - :members: - :undoc-members: - :show-inheritance: - -statannotations.PValueFormat module ------------------------------------ - -.. automodule:: statannotations.PValueFormat - :members: - :undoc-members: - :show-inheritance: - -statannotations.format\_annotations module ------------------------------------------- - -.. automodule:: statannotations.format_annotations - :members: - :undoc-members: - :show-inheritance: - -statannotations.utils module ----------------------------- - -.. automodule:: statannotations.utils - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: statannotations - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/html/_sources/statannotations.stats.rst.txt b/docs/build/html/_sources/statannotations.stats.rst.txt deleted file mode 100644 index b660e9b..0000000 --- a/docs/build/html/_sources/statannotations.stats.rst.txt +++ /dev/null @@ -1,55 +0,0 @@ -statannotations.stats package -============================= - -Submodules ----------- - -statannotations.stats.ComparisonsCorrection module --------------------------------------------------- - -.. automodule:: statannotations.stats.ComparisonsCorrection - :members: - :undoc-members: - :show-inheritance: - -statannotations.stats.StatResult module ---------------------------------------- - -.. automodule:: statannotations.stats.StatResult - :members: - :undoc-members: - :show-inheritance: - -.. _StatTest_module: - -statannotations.stats.StatTest module -------------------------------------- - -.. automodule:: statannotations.stats.StatTest - :members: - :undoc-members: - :show-inheritance: - -statannotations.stats.test module ---------------------------------- - -.. automodule:: statannotations.stats.test - :members: - :undoc-members: - :show-inheritance: - -statannotations.stats.utils module ----------------------------------- - -.. automodule:: statannotations.stats.utils - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: statannotations.stats - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/build/html/_static/alabaster.css b/docs/build/html/_static/alabaster.css deleted file mode 100644 index cac2609..0000000 --- a/docs/build/html/_static/alabaster.css +++ /dev/null @@ -1,701 +0,0 @@ -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Georgia, serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatter between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css deleted file mode 100644 index aa9df31..0000000 --- a/docs/build/html/_static/basic.css +++ /dev/null @@ -1,904 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2021 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: 450px; - 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; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -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; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -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, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::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; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -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; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd: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 > dt:after { - content: ":"; -} - -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; -} - -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.5em; - content: ":"; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- 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; -} - -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.doctest > 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/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js deleted file mode 100644 index 61ac9d2..0000000 --- a/docs/build/html/_static/doctools.js +++ /dev/null @@ -1,321 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js deleted file mode 100644 index ce10072..0000000 --- a/docs/build/html/_static/documentation_options.js +++ /dev/null @@ -1,12 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.0.0a0', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false -}; \ No newline at end of file diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png deleted file mode 100644 index a858a41..0000000 Binary files a/docs/build/html/_static/file.png and /dev/null differ diff --git a/docs/build/html/_static/jquery-3.5.1.js b/docs/build/html/_static/jquery-3.5.1.js deleted file mode 100644 index 5093733..0000000 --- a/docs/build/html/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- -
    - -
  • »
  • - -
  • Index
  • - - -
  • - - - -
  • - -
- - -
-
-
-
- - -

Index

- -
- A - | C - | D - | E - | F - | G - | H - | I - | L - | M - | N - | O - | P - | R - | S - | T - | V - | W - -
-

A

- - - -
- -

C

- - - -
- -

D

- - -
- -

E

- - -
- -

F

- - - -
- -

G

- - - -
- -

H

- - -
- -

I

- - - -
- -

L

- - -
- -

M

- - -
- -

N

- - -
- -

O

- - -
- -

P

- - - -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

V

- - - -
- -

W

- - -
- - - -
- -
-
- -
- -
-

- © Copyright 2021, Florian Charlier. - -

-
- - - - Built with Sphinx using a - - theme - - provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html deleted file mode 100644 index c2a034a..0000000 --- a/docs/build/html/index.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - - - Welcome to statannotations’s documentation! — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- -
    - -
  • »
  • - -
  • Welcome to statannotations’s documentation!
  • - - -
  • - - - View page source - - -
  • - -
- - -
-
-
-
- -
-

Welcome to statannotations’s documentation!

- -
-
-

Indices and tables

- -
- - -
- -
-
- - -
- -
-

- © Copyright 2021, Florian Charlier. - -

-
- - - - Built with Sphinx using a - - theme - - provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html deleted file mode 100644 index b7c41fb..0000000 --- a/docs/build/html/modules.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - statannotations — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - - - -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv deleted file mode 100644 index 947802e..0000000 Binary files a/docs/build/html/objects.inv and /dev/null differ diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html deleted file mode 100644 index b4c7f07..0000000 --- a/docs/build/html/py-modindex.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - - - - - - Python Module Index — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- -
    - -
  • »
  • - -
  • Python Module Index
  • - - -
  • - -
  • - -
- - -
-
-
-
- - -

Python Module Index

- -
- s -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- s
- statannotations -
    - statannotations.Annotation -
    - statannotations.Annotator -
    - statannotations.format_annotations -
    - statannotations.PValueFormat -
    - statannotations.stats -
    - statannotations.stats.ComparisonsCorrection -
    - statannotations.stats.StatResult -
    - statannotations.stats.StatTest -
    - statannotations.stats.test -
    - statannotations.stats.utils -
    - statannotations.utils -
- - -
- -
-
- -
- -
-

- © Copyright 2021, Florian Charlier. - -

-
- - - - Built with Sphinx using a - - theme - - provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/search.html b/docs/build/html/search.html deleted file mode 100644 index c3fdd4c..0000000 --- a/docs/build/html/search.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - Search — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- -
    - -
  • »
  • - -
  • Search
  • - - -
  • - -
  • - -
- - -
-
-
-
- - - - -
- -
- -
- -
-
- -
- -
-

- © Copyright 2021, Florian Charlier. - -

-
- - - - Built with Sphinx using a - - theme - - provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js deleted file mode 100644 index ad32996..0000000 --- a/docs/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["custom-test","index","modules","setup","statannotations","statannotations.stats"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["custom-test.rst","index.rst","modules.rst","setup.rst","statannotations.rst","statannotations.stats.rst"],objects:{"":{statannotations:[4,0,0,"-"]},"statannotations.Annotation":{Annotation:[4,1,1,""]},"statannotations.Annotation.Annotation":{check_data_stat_result:[4,2,1,""],formatted_output:[4,3,1,""],print_labels_and_content:[4,2,1,""],text:[4,3,1,""]},"statannotations.Annotator":{Annotator:[4,1,1,""]},"statannotations.Annotator.Annotator":{alpha:[4,3,1,""],annotate:[4,2,1,""],annotate_custom_annotations:[4,2,1,""],apply_and_annotate:[4,2,1,""],apply_test:[4,2,1,""],comparisons_correction:[4,3,1,""],configure:[4,2,1,""],fig:[4,3,1,""],get_annotations_text:[4,2,1,""],get_configuration:[4,2,1,""],get_empty_annotator:[4,2,1,""],get_offset_func:[4,2,1,""],has_type0_comparisons_correction:[4,2,1,""],loc:[4,3,1,""],new_plot:[4,2,1,""],orient:[4,3,1,""],plot_and_annotate:[4,2,1,""],plot_and_annotate_facets:[4,2,1,""],print_pvalue_legend:[4,2,1,""],pvalue_format:[4,3,1,""],reset_configuration:[4,2,1,""],set_custom_annotations:[4,2,1,""],set_pvalues:[4,2,1,""],set_pvalues_and_annotate:[4,2,1,""],test:[4,3,1,""],validate_test_short_name:[4,2,1,""],verbose:[4,3,1,""]},"statannotations.PValueFormat":{Formatter:[4,1,1,""],PValueFormat:[4,1,1,""],get_corrected_star:[4,4,1,""],sort_pvalue_thresholds:[4,4,1,""]},"statannotations.PValueFormat.Formatter":{config:[4,2,1,""],format_data:[4,2,1,""]},"statannotations.PValueFormat.PValueFormat":{config:[4,2,1,""],correction_format:[4,3,1,""],format_data:[4,2,1,""],get_configuration:[4,2,1,""],print_legend_if_used:[4,2,1,""],pvalue_format_string:[4,3,1,""],pvalue_thresholds:[4,3,1,""],simple_format_string:[4,3,1,""],text_format:[4,3,1,""]},"statannotations.format_annotations":{pval_annotation_text:[4,4,1,""],simple_text:[4,4,1,""]},"statannotations.stats":{ComparisonsCorrection:[5,0,0,"-"],StatResult:[5,0,0,"-"],StatTest:[5,0,0,"-"],test:[5,0,0,"-"],utils:[5,0,0,"-"]},"statannotations.stats.ComparisonsCorrection":{ComparisonsCorrection:[5,1,1,""],check_valid_correction_name:[5,4,1,""],get_correction_parameters:[5,4,1,""],get_validated_comparisons_correction:[5,4,1,""]},"statannotations.stats.ComparisonsCorrection.ComparisonsCorrection":{apply:[5,2,1,""],document:[5,2,1,""]},"statannotations.stats.StatResult":{StatResult:[5,1,1,""]},"statannotations.stats.StatResult.StatResult":{adjust:[5,2,1,""],corrected_significance:[5,3,1,""],correction_method:[5,3,1,""],formatted_output:[5,3,1,""],is_significant:[5,3,1,""],significance_suffix:[5,3,1,""]},"statannotations.stats.StatTest":{StatTest:[5,1,1,""],wilcoxon:[5,4,1,""]},"statannotations.stats.StatTest.StatTest":{from_library:[5,2,1,""],short_name:[5,3,1,""]},"statannotations.stats.test":{apply_test:[5,4,1,""]},"statannotations.stats.utils":{check_alpha:[5,4,1,""],check_num_comparisons:[5,4,1,""],check_pvalues:[5,4,1,""],get_num_comparisons:[5,4,1,""],return_results:[5,4,1,""]},"statannotations.utils":{InvalidParametersError:[4,5,1,""],check_is_in:[4,4,1,""],check_not_none:[4,4,1,""],check_order_in_data:[4,4,1,""],check_pairs_in_data:[4,4,1,""],check_valid_text_format:[4,4,1,""],empty_dict_if_none:[4,4,1,""],get_closest:[4,4,1,""],get_x_values:[4,4,1,""],raise_expected_got:[4,4,1,""],remove_null:[4,4,1,""],render_collection:[4,4,1,""]},statannotations:{Annotation:[4,0,0,"-"],Annotator:[4,0,0,"-"],PValueFormat:[4,0,0,"-"],format_annotations:[4,0,0,"-"],stats:[5,0,0,"-"],utils:[4,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","property","Python property"],"4":["py","function","Python function"],"5":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:property","4":"py:function","5":"py:exception"},terms:{"0":[4,5],"001":4,"01":4,"05":[4,5],"1":[4,5],"12141511":4,"1e":4,"2":4,"3":4,"4":4,"5":4,"5e":4,"9981846":4,"case":5,"class":[4,5],"default":[4,5],"float":5,"function":[1,2,4,5],"import":0,"int":5,"return":[0,4],"short":4,"static":[4,5],"true":[4,5],A:4,For:4,If:4,One:4,Or:4,The:4,a_list:4,accept:4,ad:4,add:4,addit:[4,5],adjust:5,after:4,alpha:[4,5],an:4,annot:[0,2],annotate_custom_annot:4,annotate_param:4,annotation_func:4,annotation_param:4,appli:[4,5],apply_and_annot:4,apply_test:[4,5],ar:4,arg:[4,5],argument:[4,5],arrai:4,assum:4,auto:4,ax:[0,4],ax_op_aft:4,ax_op_befor:4,bar:4,base:[4,5],befor:4,behavior:[4,5],being:4,benjamini:5,between:4,bonferroni:5,bool:5,box:4,boxplot:4,brunner:5,calcul:4,call:4,callabl:5,can:[0,4],check:4,check_alpha:5,check_data_stat_result:4,check_is_in:4,check_not_non:4,check_num_comparison:5,check_order_in_data:4,check_pairs_in_data:4,check_pvalu:5,check_valid_correction_nam:5,check_valid_text_format:4,classmethod:4,close:4,closest:4,collect:4,color:4,com:4,compar:4,comparison:[4,5],comparisons_correct:[0,4,5],comparisonscorrect:[2,4],comput:4,config:4,configur:[0,4],constructor:4,content:2,coord:4,coordin:4,core:4,corr_kwarg:5,correct:[4,5],corrected_signific:5,correction_format:4,correction_method:5,correspond:4,creat:4,custom:4,custom_func:0,custom_long_nam:0,custom_short_nam:0,custom_test:0,data:[0,4,5],datafram:4,def:0,defin:4,dict:[4,5],displai:4,document:5,each:4,earlier:5,either:5,empty_dict_if_non:4,engin:4,equal:4,equival:5,error:4,error_typ:4,exact:4,except:4,exist:4,expect:4,extend:[1,2],facetgrid:4,fals:4,fig:4,first:4,follow:4,for_:4,format:[4,5],format_annot:2,format_data:4,formatt:4,formatted_output:[4,5],fraction:4,frame:4,from:[0,4,5],from_librari:5,func:5,func_nam:4,fwer:4,gener:4,get:5,get_annotations_text:4,get_closest:4,get_configur:4,get_corrected_star:4,get_correction_paramet:5,get_empty_annot:4,get_num_comparison:5,get_offset_func:4,get_validated_comparisons_correct:5,get_x_valu:4,got:4,group:4,group_data1:[0,5],group_data1_log:0,group_data2:[0,5],group_data2_log:0,gt:5,has_type0_comparisons_correct:4,have:4,hide:4,hide_non_signific:4,hochberg:5,hold:4,holm:5,how:4,http:4,hue:4,hue_ord:4,index:1,initi:[0,4],instanc:[4,5],instead:4,interfac:5,interpret:5,invalidparameterserror:4,is_signific:5,keyword:5,kruskal:5,kwarg:[4,5],label:4,leven:5,line_height:4,line_offset:4,line_offset_to_group:4,line_width:4,link:4,list:4,loc:4,log:0,log_ttest:0,ls:5,mann:5,map:4,messag:4,method:[4,5],method_typ:5,mode:4,modul:[1,2],multipl:[4,5],multipletest:4,munzel:5,must:4,mylist:4,mynumb:4,name:[4,5],new_plot:4,non:4,none:[0,4,5],notat:4,np:0,ns:4,num_comparison:[4,5],number:[4,5],numpi:0,object:[0,4,5],one:[4,5],onto:4,option:[4,5],order:4,orient:4,origin:4,other:[1,2],otherwis:4,output:[0,4],overrid:4,p:[0,4],p_valu:5,packag:[1,2],page:1,pair:[0,4],panda:4,paramet:[4,5],pass:[0,4,5],per:4,perform:4,plot:4,plot_and_annot:4,plot_and_annotate_facet:4,plot_param:4,point:4,posit:4,print:4,print_labels_and_cont:4,print_legend_if_us:4,print_pvalue_legend:4,properti:[4,5],provid:[4,5],pval:5,pval_annotation_text:4,pvalu:[4,5],pvalue_format:4,pvalue_format_str:4,pvalue_threshold:4,pvalueformat:2,rais:4,raise_expected_got:4,rang:4,re:4,refer:4,remov:4,remove_nul:4,render:4,render_collect:4,replac:4,reset_configur:4,result:[4,5],results_arrai:5,return_result:5,run:5,same:4,sampl:5,scipi:0,seaborn:4,search:1,see:4,sep:4,seri:4,set:[0,4],set_custom_annot:4,set_pvalu:4,set_pvalues_and_annot:4,short_nam:5,short_test_nam:4,show:4,show_test_nam:4,signific:4,significance_suffix:5,simpl:4,simple_format_str:4,simple_text:4,singl:4,smallest:4,sort:4,sort_pvalue_threshold:4,stackoverflow:4,standard:4,star:[0,4],stat:[0,2,4],stat_nam:5,stat_str:5,stat_summari:5,statannot:0,statist:[1,2,4,5],statresult:[2,4],stats_param:[0,4,5],statsmodel:[4,5],statsmodels_api:5,stattest:[0,2,4],str:[4,5],string:4,struct:4,submodul:2,subpackag:2,suffix:4,t:[0,5],take:0,test:[0,2,4],test_descript:5,test_ind:5,test_long_nam:5,test_nam:5,test_pair:5,test_result_list:5,test_short_nam:[4,5],test_welch:5,text:4,text_annot_custom:4,text_format:[0,4],text_offset:4,them:4,thereof:4,thi:[4,5],three:4,threshold:4,top:4,ttest_ind:0,tupl:4,two:[0,4,5],type:4,union:[4,5],us:[0,4,5],use_fixed_offset:4,util:2,valid_valu:4,validate_test_short_nam:4,valu:[0,4,5],valueerror:4,verbos:[4,5],version:5,vs:4,w:4,wa:4,when:[0,4],whether:4,whitnei:5,wilcoxon:5,within:4,work:4,write:0,x:4,y:4,yekuti:5,you:0,your:0},titles:["Extending to other statistical functions","Welcome to statannotations\u2019s documentation!","statannotations","setup module","statannotations package","statannotations.stats package"],titleterms:{"function":0,annot:4,comparisonscorrect:5,content:[1,4,5],document:1,extend:0,format_annot:4,indic:1,modul:[3,4,5],other:0,packag:[4,5],pvalueformat:4,s:1,setup:3,stat:5,statannot:[1,2,4,5],statist:0,statresult:5,stattest:5,submodul:[4,5],subpackag:4,tabl:1,test:5,util:[4,5],welcom:1}}) \ No newline at end of file diff --git a/docs/build/html/setup.html b/docs/build/html/setup.html deleted file mode 100644 index 2375be1..0000000 --- a/docs/build/html/setup.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - - - - setup module — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

setup module

-
- - -
- -
-
- -
- -
-

- © Copyright 2021, Florian Charlier. - -

-
- - - - Built with Sphinx using a - - theme - - provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/statannotations.html b/docs/build/html/statannotations.html deleted file mode 100644 index 817e274..0000000 --- a/docs/build/html/statannotations.html +++ /dev/null @@ -1,771 +0,0 @@ - - - - - - - - - - statannotations package — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

statannotations package

- -
-

Submodules

-
-
-

statannotations.Annotation module

-
-
-class statannotations.Annotation.Annotation(structs, data: Union[str, statannotations.stats.StatResult.StatResult], formatter: Optional[statannotations.PValueFormat.Formatter] = None)
-

Bases: object

-

Holds data, linked structs and an optional Formatter.

-
-
-check_data_stat_result()
-
- -
-
-property formatted_output
-
- -
-
-print_labels_and_content(sep=' vs. ')
-
- -
-
-property text
-
- -
- -
-
-

statannotations.Annotator module

-
-
-class statannotations.Annotator.Annotator(ax, pairs, plot='boxplot', data=None, x=None, y=None, hue=None, order=None, hue_order=None, engine='seaborn', verbose=True, **plot_params)
-

Bases: object

-

Optionally computes statistical test between pairs of data series, and add -statistical annotation on top of the groups (boxes, bars…). The same -exact arguments provided to the seaborn plotting function must be passed to -the constructor.

-
-
This Annotator works in one of the three following modes:
    -
  • Add custom text annotations (set_custom_annotations)

  • -
  • Format pvalues and add them to the plot (set_pvalues)

  • -
  • -
    Perform a statistical test and then add the results to the plot

    (apply_test)

    -
    -
    -
  • -
-
-
-
-
-property alpha
-
- -
-
-annotate(line_offset=None, line_offset_to_group=None)
-

Add configured annotations to the plot.

-
- -
-
-annotate_custom_annotations(text_annot_custom)
-
-
Parameters
-

text_annot_custom – List of strings to annotate for each -pair

-
-
-
- -
-
-apply_and_annotate()
-

Applies a configured statistical test and annotates the plot

-
- -
-
-apply_test(num_comparisons='auto', **stats_params)
-
-
Parameters
-
    -
  • stats_params – Parameters for statistical test functions.

  • -
  • num_comparisons – Override number of comparisons otherwise -calculated with number of pairs

  • -
-
-
-
- -
-
-property comparisons_correction
-
- -
-
-configure(**parameters)
-
    -
  • alpha: Acceptable type 1 error for statistical tests, default 0.05

  • -
  • color

  • -
  • -
    comparisons_correction: Method for multiple comparisons correction.

    One of statsmodels multipletests methods (w/ default FWER), or -a ComparisonsCorrection instance.

    -
    -
    -
  • -
  • -
    correction_format: How to format the star notation on the plot when

    the multiple comparisons correction method removes the significance -* default: a ‘ (ns)’ suffix is added, such as in printed output, -corresponds to “{star} ({suffix})” -* replace: the original star value is replaced with ‘ns’ -corresponds to “{suffix}” -* a custom formatting string using “{star}” for the original -pvalue and ‘{suffix}’ for ‘ns’

    -
    -
    -
  • -
  • -
    hide_non_significant: hide annotations for non-significant pair

    comparisons

    -
    -
    -
  • -
  • line_height: in axes fraction coordinates

  • -
  • line_offset

  • -
  • line_offset_to_group

  • -
  • line_width

  • -
  • loc

  • -
  • -
    pvalue_format: list of lists, or tuples. Default values are:
      -
    • For “star” text_format: -[[1e-4, “****”], [1e-3, “***”], [1e-2, “**”], [0.05, “*”], [1, “ns”]].

    • -
    • For “simple” text_format: -[[1e-5, “1e-5”], [1e-4, “1e-4”], [1e-3, “0.001”], [1e-2, “0.01”], [5e-2, “0.05”]].

    • -
    -
    -
    -
  • -
  • -
    show_test_name: Set to False to not show the (short) name of

    test

    -
    -
    -
  • -
  • test

  • -
  • text_offset: in points

  • -
  • test_short_name

  • -
  • use_fixed_offset

  • -
  • verbose

  • -
-
- -
-
-property fig
-
- -
-
-get_annotations_text()
-
- -
-
-get_configuration()
-
- -
-
-static get_empty_annotator()
-

This instance will have to be initialized with new_plot() before -being used. This behavior can be useful to create an Annotator before -using it in a FacetGrid mapping.

-
- -
-
-classmethod get_offset_func(position)
-
- -
-
-has_type0_comparisons_correction()
-
- -
-
-property loc
-
- -
-
-new_plot(ax, pairs=None, plot='boxplot', data=None, x=None, y=None, hue=None, order=None, hue_order=None, engine: str = 'seaborn', **plot_params)
-
- -
-
-property orient
-
- -
-
-static plot_and_annotate(plot: str, pairs: list, plot_params: dict, configuration: dict, annotation_func: str, annotation_params: Optional[dict] = None, ax_op_before: Optional[List[Union[str, list, None, dict]]] = None, ax_op_after: Optional[List[Union[str, list, None, dict]]] = None, annotate_params: Optional[dict] = None)
-

Plots using seaborn and annotates in a single call.

-
-
Parameters
-
    -
  • plot – seaborn plotting function to call

  • -
  • pairs – pairs to compare (see Annotator)

  • -
  • plot_params – parameters for plotting function call

  • -
  • configuration – parameters for Annotator.configure

  • -
  • annotation_func – name of annotation function to be called, from: -* ‘set_custom_annotations’ -* ‘set_pvalues’ -* ‘apply_test’

  • -
  • annotation_params – parameters for the annotation function

  • -
  • ax_op_before – list of [func_name, args, kwargs] to apply on ax -before annotating

  • -
  • ax_op_after – list of [func_name, args, kwargs] to apply on ax -after annotating

  • -
  • annotate_params – parameters for Annotator.annotate

  • -
-
-
-
- -
-
-plot_and_annotate_facets(plot: str, plot_params: dict, configuration: dict, annotation_func: str, *args, annotation_params: Optional[dict] = None, ax_op_before: Optional[List[Union[str, list, None, dict]]] = None, ax_op_after: Optional[List[Union[str, list, None, dict]]] = None, annotate_params: Optional[dict] = None, **kwargs)
-

Plots using seaborn and annotates in a single call, to be used within -a FacetGrid. -First, initialize the Annotator with Annotator(None, pairs) to define -the pairs, then map this function onto the FacetGrid.

-
-
Parameters
-
    -
  • plot – seaborn plotting function to call

  • -
  • plot_params – parameters for plotting function call

  • -
  • configuration – parameters for Annotator.configure

  • -
  • annotation_func – name of annotation function to be called, from: -* ‘set_custom_annotations’ -* ‘set_pvalues’ -* ‘apply_test’

  • -
  • annotation_params – parameters for the annotation function

  • -
  • ax_op_before – list of [func_name, args, kwargs] to apply on ax -before annotating

  • -
  • ax_op_after – list of [func_name, args, kwargs] to apply on ax -after annotating

  • -
  • annotate_params – parameters for Annotator.annotate

  • -
  • args – additional parameters for the seaborn function

  • -
  • kwargs – additional parameters for the seaborn function

  • -
-
-
-
- -
-
-print_pvalue_legend()
-
- -
-
-property pvalue_format
-
- -
-
-reset_configuration()
-
- -
-
-set_custom_annotations(text_annot_custom)
-
-
Parameters
-

text_annot_custom – List of strings to annotate for each -pair

-
-
-
- -
-
-set_pvalues(pvalues, num_comparisons='auto')
-
-
Parameters
-
    -
  • pvalues – list or array of p-values for each pair comparison.

  • -
  • num_comparisons – Override number of comparisons otherwise -calculated with number of pairs

  • -
-
-
-
- -
-
-set_pvalues_and_annotate(pvalues, num_comparisons='auto')
-
- -
-
-property test
-
- -
-
-validate_test_short_name()
-
- -
-
-property verbose
-
- -
- -
-
-

statannotations.PValueFormat module

-
-
-class statannotations.PValueFormat.Formatter
-

Bases: object

-
-
-config(*args, **kwargs)
-
- -
-
-format_data(data)
-
- -
- -
-
-class statannotations.PValueFormat.PValueFormat
-

Bases: statannotations.PValueFormat.Formatter

-
-
-config(**parameters)
-
- -
-
-property correction_format
-
- -
-
-format_data(result)
-
- -
-
-get_configuration()
-
- -
-
-print_legend_if_used()
-
- -
-
-property pvalue_format_string
-
- -
-
-property pvalue_thresholds
-
- -
-
-property simple_format_string
-
- -
-
-property text_format
-
- -
- -
-
-statannotations.PValueFormat.get_corrected_star(star: str, res: statannotations.stats.StatResult.StatResult, correction_format='{star} ({suffix})')str
-
- -
-
-statannotations.PValueFormat.sort_pvalue_thresholds(pvalue_thresholds)
-
- -
-
-

statannotations.format_annotations module

-
-
-statannotations.format_annotations.pval_annotation_text(result: List[statannotations.stats.StatResult.StatResult], pvalue_thresholds: List)List[tuple]
-
-
Parameters
-
    -
  • result – StatResult instance or list thereof

  • -
  • pvalue_thresholds – thresholds to use for formatter

  • -
-
-
Returns
-

A List of rendered annotations if a list of StatResults was -provided, a string otherwise.

-
-
-
- -
-
-statannotations.format_annotations.simple_text(result: statannotations.stats.StatResult.StatResult, pvalue_format, pvalue_thresholds, short_test_name=True)str
-

Generates simple text for test name and pvalue.

-
-
Parameters
-
    -
  • result – StatResult instance

  • -
  • pvalue_format – format string for pvalue

  • -
  • pvalue_thresholds – String to display per pvalue range

  • -
  • short_test_name – whether to display the test (short) name

  • -
-
-
Returns
-

simple annotation

-
-
-
- -
-
-

statannotations.utils module

-
-
-exception statannotations.utils.InvalidParametersError(parameters)
-

Bases: Exception

-
- -
-
-statannotations.utils.check_is_in(x, valid_values, error_type=<class 'ValueError'>, label=None)
-

Raise an error if x is not in valid_values.

-
- -
-
-statannotations.utils.check_not_none(name, value)
-
- -
-
-statannotations.utils.check_order_in_data(data, x, order)None
-
- -
-
-statannotations.utils.check_pairs_in_data(pairs: Union[list, tuple], data: Optional[Union[List[list], pandas.core.frame.DataFrame]] = None, coord: Optional[Union[str, list]] = None, hue: Optional[str] = None, hue_order: Optional[List[str]] = None)
-

Checks that values referred to in order and pairs exist in data.

-
- -
-
-statannotations.utils.check_valid_text_format(text_format)
-
- -
-
-statannotations.utils.empty_dict_if_none(data)
-
- -
-
-statannotations.utils.get_closest(a_list, value)
-

Assumes myList is sorted. Returns closest value to myNumber. -If two numbers are equally close, return the smallest number. -from https://stackoverflow.com/a/12141511/9981846

-
- -
-
-statannotations.utils.get_x_values(data, x)set
-
- -
-
-statannotations.utils.raise_expected_got(expected, for_, got, error_type=<class 'ValueError'>)
-

Raise a standardized error message.

-
-
Raise an error_type error with the message

Expected expected for for_; got got instead.

-
-
Or, if for_ is None,

Expected expected; got got instead.

-
-
-
- -
-
-statannotations.utils.remove_null(series)
-
- -
-
-statannotations.utils.render_collection(collection)
-
- -
-
-

Module contents

-
-
- - -
- -
- -
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/statannotations.stats.html b/docs/build/html/statannotations.stats.html deleted file mode 100644 index 6d403f8..0000000 --- a/docs/build/html/statannotations.stats.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - statannotations.stats package — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - - - -
- -
- - - - - - - - - - - - - - - - - - - -
- - - - -
-
-
-
- -
-

statannotations.stats package

-
-

Submodules

-
-
-

statannotations.stats.ComparisonsCorrection module

-
-
-class statannotations.stats.ComparisonsCorrection.ComparisonsCorrection(method: Union[str, callable], alpha: float = 0.05, name: Optional[str] = None, method_type: Optional[int] = None, statsmodels_api: bool = True, corr_kwargs: Optional[dict] = None)
-

Bases: object

-
-
-apply(test_result_list)
-
- -
-
-document(func)
-
- -
- -
-
-statannotations.stats.ComparisonsCorrection.check_valid_correction_name(name)
-
- -
-
-statannotations.stats.ComparisonsCorrection.get_correction_parameters(name)
-
- -
-
-statannotations.stats.ComparisonsCorrection.get_validated_comparisons_correction(comparisons_correction)
-
- -
-
-

statannotations.stats.StatResult module

-
-
-class statannotations.stats.StatResult.StatResult(test_description, test_short_name, stat_str, stat, pval, alpha=0.05)
-

Bases: object

-
-
-adjust(stat_summary)
-
- -
-
-property corrected_significance
-
- -
-
-property correction_method
-
- -
-
-property formatted_output
-
- -
-
-property is_significant
-
- -
-
-property significance_suffix
-
- -
- -
-
-

statannotations.stats.StatTest module

-
-
-class statannotations.stats.StatTest.StatTest(func: Callable, test_long_name: str, test_short_name: str, stat_name: str = 'Stat', alpha: float = 0.05, *args, **kwargs)
-

Bases: object

-
-
-static from_library(test_name: str)statannotations.stats.StatTest.StatTest
-
- -
-
-property short_name
-
- -
- -
-
-statannotations.stats.StatTest.wilcoxon(group_data1, group_data2, verbose=1, **stats_params)
-

This function provides the equivalent behavior from earlier versions of -statannot/statannotations.

-
- -
-
-

statannotations.stats.test module

-
-
-statannotations.stats.test.apply_test(group_data1, group_data2, test: Optional[Union[statannotations.stats.StatTest.StatTest, str]] = None, comparisons_correction: Optional[Union[statannotations.stats.ComparisonsCorrection.ComparisonsCorrection, str]] = None, num_comparisons: int = 1, alpha: float = 0.05, **stats_params)
-

Get formatted result of two-sample statistical test.

-
-
Parameters
-
    -
  • group_data1 – data

  • -
  • group_data2 – data

  • -
  • test – Union[StatTest, str]: Statistical test to run. -Either a StatTest instance or one of: -- Brunner-Munzel -- Levene -- Mann-Whitney -- Mann-Whitney-gt -- Mann-Whitney-ls -- t-test_ind -- t-test_welch -- t-test_paired -- Wilcoxon -- Kruskal

  • -
  • comparisons_correction – Union[ComparisonsCorrection, str]: -(Default value = None) -Method to use for multiple comparisons correction. Either a -ComparisonsCorrection instance or one of (interfacing statsmodels): -- Bonferroni -- Holm-Bonferroni -- Benjamini-Hochberg -- Benjamini-Yekutieli

  • -
  • num_comparisons – int: (Default value = 1) -Number of comparisons to use for multiple comparisons correction.

  • -
  • alpha – float: (Default value = 0.05) -Used for pvalue interpretation in case of comparisons_correction.

  • -
  • stats_params – Additional keyword arguments to pass to the test -function

  • -
-
-
-
- -
-
-

statannotations.stats.utils module

-
-
-statannotations.stats.utils.check_alpha(alpha)
-
- -
-
-statannotations.stats.utils.check_num_comparisons(num_comparisons)
-
- -
-
-statannotations.stats.utils.check_pvalues(p_values)
-
- -
-
-statannotations.stats.utils.get_num_comparisons(p_values, num_comparisons)
-
- -
-
-statannotations.stats.utils.return_results(results_array)
-
- -
-
-

Module contents

-
-
- - -
- -
- -
-
- -
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index d423ab2..a88d2e7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -13,11 +13,10 @@ import os import sys import sphinx_rtd_theme - +import nbsphinx sys.path.insert(0, os.path.abspath('../..')) - # -- Project information ----------------------------------------------------- project = 'statannotations' @@ -27,13 +26,12 @@ # The full version, including alpha/beta/rc tags release = '1.0.0a0' - # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx_rtd_theme'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx_rtd_theme', 'nbsphinx'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -43,7 +41,6 @@ # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] - # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for diff --git a/docs/source/example.ipynb b/docs/source/example.ipynb new file mode 100644 index 0000000..c403646 --- /dev/null +++ b/docs/source/example.ipynb @@ -0,0 +1,1412 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from statannotations.Annotator import Annotator\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "\n", + "\n", + "sns.set(style=\"whitegrid\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boxplot non-hue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Multiple comparisons" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By default, no multiple comparisons correction is applied." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "df = sns.load_dataset(\"tips\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Thur vs. Fri: Mann-Whitney-Wilcoxon test two-sided, P_val:6.477e-01 U_stat=6.305e+02\n", + "Thur vs. Sat: Mann-Whitney-Wilcoxon test two-sided, P_val:4.690e-02 U_stat=2.180e+03\n", + "Sun vs. Fri: Mann-Whitney-Wilcoxon test two-sided, P_val:2.680e-02 U_stat=9.605e+02\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = \"day\"\n", + "y = \"total_bill\"\n", + "order = ['Sun', 'Thur', 'Fri', 'Sat']\n", + "ax = sns.boxplot(data=df, x=x, y=y, order=order)\n", + "annot = Annotator(ax, [(\"Thur\", \"Fri\"), (\"Thur\", \"Sat\"), (\"Fri\", \"Sun\")], data=df, x=x, y=y, order=order)\n", + "annot.configure(test='Mann-Whitney', text_format='star', loc='outside', verbose=2)\n", + "annot.apply_test()\n", + "ax, test_results = annot.annotate()\n", + "plt.savefig('example_non-hue_outside.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Statistical test results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `annotate` method returns the tuple `ax, annotations`, where `annotations` is a list of `Annotation` objects.\n", + "The `data` attribute of an Annotation is a `StatResult` object, which containing both the original data of the groups\n", + "(boxes for boxplots), and the statistical test results (p-value, etc)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mann-Whitney-Wilcoxon test two-sided, P_val:6.477e-01 U_stat=6.305e+02\n", + "Mann-Whitney-Wilcoxon test two-sided, P_val:4.690e-02 U_stat=2.180e+03\n", + "Mann-Whitney-Wilcoxon test two-sided, P_val:2.680e-02 U_stat=9.605e+02\n", + "\n", + "StatResult attributes: dict_keys(['test_description', 'test_short_name', 'stat_str', 'stat_value', 'pvalue', '_corrected_significance', '_correction_method', 'alpha', 'group1', 'group2'])\n" + ] + } + ], + "source": [ + "for res in test_results:\n", + " print(res.data)\n", + "\n", + "print(\"\\nStatResult attributes:\", test_results[0].data.__dict__.keys())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Applying a multiple comparisons correction (requires `statsmodels`)\n", + "In this example, note that previously configured parameters are remembered if not changed.\n", + "This is the case for `pairs`, `test`, `text_format`, and `loc`.\n", + "\n", + "To avoid this, you can call `annot.reset_configuration()` to get back to all default/unset values." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Thur vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val:1.000e+00 U_stat=6.305e+02\n", + "Thur vs. Sat: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val:1.407e-01 U_stat=2.180e+03\n", + "Sun vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val:8.041e-02 U_stat=9.605e+02\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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FBMT4319r2TdunWtlCb4tOQ9f+DAAQ0YMKCVk7YMh4CaobKyUjU1Nbpw4YIk6dprr1VmZqZuvfVWJSUl6eTJk5Kkffv2adKkSZKkSZMmaeXKlXrggQc0cuRI7d6927T8waCwsFAOh0PDhg3zFkJOTo7mz5/v/Z1JkyZp37592rdvnyZMmKC0tDQ9+eSTZkUOOvPnz9f06dOVnJysgoKCBn+7aKix9/w777yjiRMnKjU1VXa7XQcOHNDevXtVUFCg1atX67333jM5/dWxB9AMt912m4YPH64RI0YoPj5eAwcOVEpKirp3797o82pqarRhwwYVFBRo1apVSkxMbKXEwee///2vsrOzdfbsWSUlJWny5MmN/v7x48e1c+dOdezYsZUSBpdTp05p3Lhx3scpKSmSpE6dOmnNmjWSpGeeecaUbMHgSu/52NhYPf3001qzZo2io6O1efNmrV27VmvWrFFSUpIGDBigwYMHmx3/qiiAZlqyZIl+97vfac+ePdqzZ48mTpyo559/vtHn1P8h9OzZU1VVVa0RM2gNHjxYERERio6OVlRUlKqrqxv9/R49evDh34jLHQKaP3++7rjjDpMSBZ8rvedffvllFRQU6NixY/roo49+NtNmMKAAmmHXrl06f/68xowZo/T0dKWnp2vjxo3avHmzpB9uuOB2uxs8LzIyUpKYxroJwsN/+JO02WzyeDze/9arvzeEpJ/Nb46m4XVrmiu9599880298MILSk1NVf/+/fXLX/5Sb775ptlxmy34KstE7dq105/+9Cfv8VKPx6PDhw8rPj5eUVFR+uKLLyRJO3bsMDNmyImKitKXX34pj8ejr776Sp9//rnZkWARV3rPR0REyGazafr06Ro4cKDy8/NVW1srSQoLC/N+HejYA2iGu+++WzNnztT06dO9W6GDBw/WjBkz9Ktf/UrLli3TSy+9pEGDBpmcNLT8+te/1j//+U/Z7Xb16NFD/fr1MzsSLOJK7/mXX35Z8+fPV3Jysmw2mwYNGqT9+/dLuvT3+sILL6hjx46y2+1mxr8qbggDABbFISAAsCgKAAAsigIAAIuiAADAoigAALAoCgBoJqfT6Z3rCQhmFAAAWBQFADTBqlWrNGLECE2YMEH5+fmSpGPHjmny5MmaOHGihg0bpscee0wul0u5ublyOBze53799dcaNGiQLl68aFZ84LIoAOAqtm/frnfffVdbt271zlQqXbrxx/jx47Vx40a9++67OnnypHbt2iW73a7S0lIdPXpUkrRp0ybdd999ioiIMPOfAfwMBQBcxQcffKCRI0eqQ4cOCg8PV3p6uiTp97//vaKjo7Vu3Tr93//9n06dOqXz588rIiJC999/vzZt2qTa2lpt2bJFEydONPlfAfwccwEBTfDjGVPCwsIkSXPmzFFtba2Sk5M1dOhQffPNN97fczgcmjBhggYMGKCePXsqNjbWlNxAY9gDAK5iyJAhcjqdOn36tOrq6rzz6+/Zs0czZszQmDFjJEkHD+xHsF0AAACqSURBVB70zgLZpUsX3XXXXVq+fLkefPBB07IDjWEPALiKxMREff7550pPT9d1112n2267TZWVlZo9e7ZmzJih9u3bq0OHDurfv79KS0u9z0tLS9OyZcu4AxwCFrOBAgaoq6vT0qVL1bVrV02dOtXsOMBlcQgI8LOzZ89q4MCB+uabb/TQQw+ZHQe4IvYAAMCi2AMAAIuiAADAoigAALAoCgAALIoCAACL+n/V8idQFmgytgAAAABJRU5ErkJggg==\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotting = {\n", + " \"data\": df,\n", + " \"x\": x,\n", + " \"y\": y,\n", + " \"order\": order\n", + "}\n", + "ax = sns.boxplot(**plotting)\n", + "annot.new_plot(ax, **plotting)\n", + "annot.configure(comparisons_correction=\"Bonferroni\", verbose=2)\n", + "test_results = annot.apply_test().annotate()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Or another" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Thur vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:6.477e-01 U_stat=6.305e+02\n", + "Thur vs. Sat: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:4.690e-02 (ns) U_stat=2.180e+03\n", + "Sun vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:2.680e-02 (ns) U_stat=9.605e+02\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = \"day\"\n", + "y = \"total_bill\"\n", + "order = ['Sun', 'Thur', 'Fri', 'Sat']\n", + "ax = sns.boxplot(data=df, x=x, y=y, order=order)\n", + "annot.new_plot(ax, data=df, x=x, y=y, order=order)\n", + "annot.configure(comparisons_correction=\"BH\")\n", + "annot.apply_and_annotate()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "To have `\"ns\"` instead of `\"* (ns)\"`, configure with `correction_format=\"replace\"`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Thur vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:6.477e-01 U_stat=6.305e+02\n", + "Thur vs. Sat: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:4.690e-02 (ns) U_stat=2.180e+03\n", + "Sun vs. Fri: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:2.680e-02 (ns) U_stat=9.605e+02\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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FBMT4319r2TdunWtlCb4tOQ9f+DAAQ0YMKCVk7YMh4CaobKyUjU1Nbpw4YIk6dprr1VmZqZuvfVWJSUl6eTJk5Kkffv2adKkSZKkSZMmaeXKlXrggQc0cuRI7d6927T8waCwsFAOh0PDhg3zFkJOTo7mz5/v/Z1JkyZp37592rdvnyZMmKC0tDQ9+eSTZkUOOvPnz9f06dOVnJysgoKCBn+7aKix9/w777yjiRMnKjU1VXa7XQcOHNDevXtVUFCg1atX67333jM5/dWxB9AMt912m4YPH64RI0YoPj5eAwcOVEpKirp3797o82pqarRhwwYVFBRo1apVSkxMbKXEwee///2vsrOzdfbsWSUlJWny5MmN/v7x48e1c+dOdezYsZUSBpdTp05p3Lhx3scpKSmSpE6dOmnNmjWSpGeeecaUbMHgSu/52NhYPf3001qzZo2io6O1efNmrV27VmvWrFFSUpIGDBigwYMHmx3/qiiAZlqyZIl+97vfac+ePdqzZ48mTpyo559/vtHn1P8h9OzZU1VVVa0RM2gNHjxYERERio6OVlRUlKqrqxv9/R49evDh34jLHQKaP3++7rjjDpMSBZ8rvedffvllFRQU6NixY/roo49+NtNmMKAAmmHXrl06f/68xowZo/T0dKWnp2vjxo3avHmzpB9uuOB2uxs8LzIyUpKYxroJwsN/+JO02WzyeDze/9arvzeEpJ/Nb46m4XVrmiu9599880298MILSk1NVf/+/fXLX/5Sb775ptlxmy34KstE7dq105/+9Cfv8VKPx6PDhw8rPj5eUVFR+uKLLyRJO3bsMDNmyImKitKXX34pj8ejr776Sp9//rnZkWARV3rPR0REyGazafr06Ro4cKDy8/NVW1srSQoLC/N+HejYA2iGu+++WzNnztT06dO9W6GDBw/WjBkz9Ktf/UrLli3TSy+9pEGDBpmcNLT8+te/1j//+U/Z7Xb16NFD/fr1MzsSLOJK7/mXX35Z8+fPV3Jysmw2mwYNGqT9+/dLuvT3+sILL6hjx46y2+1mxr8qbggDABbFISAAsCgKAAAsigIAAIuiAADAoigAALAoCgBoJqfT6Z3rCQhmFAAAWBQFADTBqlWrNGLECE2YMEH5+fmSpGPHjmny5MmaOHGihg0bpscee0wul0u5ublyOBze53799dcaNGiQLl68aFZ84LIoAOAqtm/frnfffVdbt271zlQqXbrxx/jx47Vx40a9++67OnnypHbt2iW73a7S0lIdPXpUkrRp0ybdd999ioiIMPOfAfwMBQBcxQcffKCRI0eqQ4cOCg8PV3p6uiTp97//vaKjo7Vu3Tr93//9n06dOqXz588rIiJC999/vzZt2qTa2lpt2bJFEydONPlfAfwccwEBTfDjGVPCwsIkSXPmzFFtba2Sk5M1dOhQffPNN97fczgcmjBhggYMGKCePXsqNjbWlNxAY9gDAK5iyJAhcjqdOn36tOrq6rzz6+/Zs0czZszQmDFjJEkHD+xHsF0AAACqSURBVB70zgLZpUsX3XXXXVq+fLkefPBB07IDjWEPALiKxMREff7550pPT9d1112n2267TZWVlZo9e7ZmzJih9u3bq0OHDurfv79KS0u9z0tLS9OyZcu4AxwCFrOBAgaoq6vT0qVL1bVrV02dOtXsOMBlcQgI8LOzZ89q4MCB+uabb/TQQw+ZHQe4IvYAAMCi2AMAAIuiAADAoigAALAoCgAALIoCAACL+n/V8idQFmgytgAAAABJRU5ErkJggg==\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.boxplot(data=df, x=x, y=y, order=order)\n", + "annot.new_plot(ax, data=df, x=x, y=y, order=order)\n", + "annot.configure(comparisons_correction=\"BH\", correction_format=\"replace\")\n", + "annot.apply_and_annotate()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Location" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Statistical test annotation can be either drawn inside the plot area (`loc='inside'`), or on top on it (`loc='outside'`)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Sun vs. Thur: Custom statistical test with Benjamini-Hochberg correction, P_val:1.000e-01\n", + "Sun vs. Fri: Custom statistical test with Benjamini-Hochberg correction, P_val:1.000e-03\n", + "Sun vs. Sat: Custom statistical test with Benjamini-Hochberg correction, P_val:1.000e-01\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = \"day\"\n", + "y = \"total_bill\"\n", + "order = ['Sun', 'Thur', 'Fri', 'Sat']\n", + "pairs = [(\"Sun\", \"Thur\"), (\"Sun\", \"Sat\"), (\"Fri\", \"Sun\")]\n", + "ax = sns.boxplot(data=df, x=x, y=y, order=order)\n", + "annot.new_plot(ax, pairs=pairs, data=df, x=x, y=y, order=order)\n", + "annot.configure(test=None, loc='inside')\n", + "annot.set_pvalues([0.1, 0.1, 0.001])\n", + "annot.annotate()\n", + "plt.savefig('example_non-hue_inside.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boxplot with hue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create boxes with unequal ymax position." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": " carat cut color clarity depth table price x y z\n0 0.23 Ideal E SI2 61.5 55.0 326 3.95 3.98 2.43\n1 0.21 Premium E SI1 59.8 61.0 326 3.89 3.84 2.31\n2 0.23 Good E VS1 56.9 65.0 327 4.05 4.07 2.31\n3 0.29 Premium I VS2 62.4 58.0 334 4.20 4.23 2.63\n4 0.31 Good J SI2 63.3 58.0 335 4.34 4.35 2.75", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
caratcutcolorclaritydepthtablepricexyz
00.23IdealESI261.555.03263.953.982.43
10.21PremiumESI159.861.03263.893.842.31
20.23GoodEVS156.965.03274.054.072.31
30.29PremiumIVS262.458.03344.204.232.63
40.31GoodJSI263.358.03354.344.352.75
\n
" + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = sns.load_dataset('diamonds')\n", + "df = df[df['color'].map(lambda x: x in 'EIJ')]\n", + "# Modifying data to yield unequal boxes in the hue value\n", + "df.loc[df['cut'] == 'Ideal', 'price'] = df.loc[df['cut'] == 'Ideal', 'price'].map(lambda x: min(x, 5000))\n", + "df.loc[df['cut'] == 'Premium', 'price'] = df.loc[df['cut'] == 'Premium', 'price'].map(lambda x: min(x, 7500))\n", + "df.loc[df['cut'] == 'Good', 'price'] = df.loc[df['cut'] == 'Good', 'price'].map(lambda x: min(x, 15000))\n", + "df.loc[df['cut'] == 'Very Good', 'price'] = df.loc[df['cut'] == 'Very Good', 'price'].map(lambda x: min(x, 3000))\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "E_Ideal vs. E_Premium: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:1.560e-31 U_stat=3.756e+06\n", + "I_Ideal vs. I_Premium: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:5.141e-61 U_stat=1.009e+06\n", + "J_Ideal vs. J_Premium: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:4.018e-37 U_stat=2.337e+05\n", + "E_Ideal vs. E_Good: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:5.201e-19 U_stat=1.480e+06\n", + "I_Ideal vs. I_Good: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:5.008e-13 U_stat=4.359e+05\n", + "J_Ideal vs. J_Good: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:1.006e-04 U_stat=1.174e+05\n", + "E_Ideal vs. E_Very Good: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:1.736e-02 U_stat=4.850e+06\n", + "E_Good vs. I_Ideal: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:5.906e-01 U_stat=9.882e+05\n", + "I_Premium vs. J_Ideal: Mann-Whitney-Wilcoxon test two-sided with Benjamini-Hochberg correction, P_val:5.159e-27 U_stat=8.084e+05\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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RETNx9+drsN5VnWpo6ioCD4+/1nExdfXF4WFhSJGRERE5PictqrfZDJBJpNZt81ms832g+Tk5NgjLCIiIofmtInfz88PP/74o3X71q1b8PX1bfL5rK4iImo6S1U/OT+nrep/8skn8d1330Gr1aKqqgpffvklIiIixA6LiIjIoTltib9z58548803MXPmTOj1ejz//PN4/PHHxQ6LiIjIoTlt4geA6OhoREdHN+scyyCGGidfXIaISEiW35lOOhCM7uHUib8l9Ho9ACAvL0/kSIiInI9er0ebNo2sEkpOwWnH8beUyWRCRUUFVCpVs0YBEBFJmdlshl6vR7t27SBvZNVNcg6SS/xERERSxtc2IiIiCWHiJyIikhAmfiIiIglh4iciIpIQJn4iIiIJYeInIiKSECZ+IiIiCZHczH3UNFevXkVkZCR69uxps/+FF15AfHy8SFG5vpCQEJw/f17sMCRl7969OH78OJKSksQOhUgQTPzUKF9fX6SlpYkdBhERtSJW9RMREUkIS/zUqKKiIsTExNjs27BhA0JCQkSKiIiIHhYTPzWKVf1ERK6HVf1EJDk//vgjCgsLAdSuOqdQKESOiEg4TPxEJDlffPEFjhw5AgA4f/48goKCRI6ISDhclpca1NhwvieeeAKrVq0SKSrXx+F8wigoKMBbb72F8vJy+Pn5YdOmTejQoYPYYREJgomfiIhIQljVT0REJCFM/ERERBLCxE9ERCQhTPxEREQSwsRPREQkIUz8RA4kISEBH3/8sdhhEJELY+InIiKSEM7VT2Rne/bswaeffgq5XA5vb2/84Q9/wDfffIOdO3dCLpejU6dO+N3vfocePXrYnPfjjz9iw4YNqKqqgkqlwuLFixEREYG9e/diz549qKqqgqenJ3bu3CnSnRGRM2LiJ7Kjn376CcnJydi3bx/8/f3x3//935g1axZMJhN27doFtVqNvXv3YuHChfjHP/5hPa+kpASvv/46tm3bhn79+uHChQuYPn069uzZAwD4+eefcfToUXh6eop1a0TkpJj4iezou+++w9NPPw1/f38AwKxZs1BUVASVSgW1Wg0AiI2NxTvvvIOrV69az8vOzkbXrl3Rr18/AMBjjz2GgQMH4vjx45DJZAgJCWHSJ6IWYRs/kR0pFArIZDLrtk6nw5UrV+odZzabYTAYrNtGo9HmvLrHeHh42CliInJ1TPxEdhQeHo7vvvsORUVFAICUlBR8/fXXyMjIgFarBVC7UpyXlxe6detmPa9///7Iz89HdnY2AODChQs4ceIEhgwZIvxNEJFLYVU/kR2FhIRg6dKleOWVVwAAPj4+OHz4MI4cOYKXXnoJJpMJarUaf/7znyGX/+c9XK1W409/+hN+//vfQ6fTQSaTITExET169MDp06fFuh0icgFcnY+IiEhCWNVPREQkIUz8REREEsLET0REJCFM/ERERBLCxE9ERCQhTPxEREQSwsRPREQkIUz8REREEvL/+nKpw+sVf48AAAAASUVORK5CYII=\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = \"color\"\n", + "y = \"price\"\n", + "hue = \"cut\"\n", + "hue_order=['Ideal', 'Premium', 'Good', 'Very Good', 'Fair']\n", + "order = [\"E\", \"I\", \"J\"]\n", + "pairs=[\n", + " ((\"E\", \"Ideal\"), (\"E\", \"Very Good\")),\n", + " ((\"E\", \"Ideal\"), (\"E\", \"Premium\")),\n", + " ((\"E\", \"Ideal\"), (\"E\", \"Good\")),\n", + " ((\"I\", \"Ideal\"), (\"I\", \"Premium\")),\n", + " ((\"I\", \"Ideal\"), (\"I\", \"Good\")),\n", + " ((\"J\", \"Ideal\"), (\"J\", \"Premium\")),\n", + " ((\"J\", \"Ideal\"), (\"J\", \"Good\")),\n", + " ((\"E\", \"Good\"), (\"I\", \"Ideal\")),\n", + " ((\"I\", \"Premium\"), (\"J\", \"Ideal\")),\n", + " ]\n", + "ax = sns.boxplot(data=df, x=x, y=y, order=order, hue=hue, hue_order=hue_order)\n", + "annot.new_plot(ax, pairs, data=df, x=x, y=y, order=order, hue=hue, hue_order=hue_order)\n", + "annot.configure(test='Mann-Whitney', verbose=2)\n", + "annot.apply_test()\n", + "annot.annotate()\n", + "plt.legend(loc='upper left', bbox_to_anchor=(1.03, 1))\n", + "plt.savefig('example_hue_layout.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Boxplot with bucketed categories" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": " total_bill tip sex smoker day time size tip_bucket\n0 16.99 1.01 Female No Sun Dinner 2 (0.991, 4.0]\n1 10.34 1.66 Male No Sun Dinner 3 (0.991, 4.0]\n2 21.01 3.50 Male No Sun Dinner 3 (0.991, 4.0]\n3 23.68 3.31 Male No Sun Dinner 2 (0.991, 4.0]\n4 24.59 3.61 Female No Sun Dinner 4 (0.991, 4.0]", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
total_billtipsexsmokerdaytimesizetip_bucket
016.991.01FemaleNoSunDinner2(0.991, 4.0]
110.341.66MaleNoSunDinner3(0.991, 4.0]
221.013.50MaleNoSunDinner3(0.991, 4.0]
323.683.31MaleNoSunDinner2(0.991, 4.0]
424.593.61FemaleNoSunDinner4(0.991, 4.0]
\n
" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = sns.load_dataset(\"tips\")\n", + "df['tip_bucket'] = pd.cut(df['tip'], 3)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": "[(0.991, 4.0], (4.0, 7.0], (7.0, 10.0]]\nCategories (3, interval[float64]): [(0.991, 4.0] < (4.0, 7.0] < (7.0, 10.0]]" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# In this case we just have to pass the list of categories objects to the annotate function.\n", + "tip_bucket_list = df['tip_bucket'].unique()\n", + "tip_bucket_list" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Fri_(0.991, 4.0] vs. Sat_(7.0, 10.0]: t-test independent samples, P_val:6.176e-07 t=-7.490e+00\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe8AAAEJCAYAAAC9lK9SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dfVxUddo/8M/wbELKFCApuVKtaW5qmsre5iAC4QNqYja2yb2W5COau5uPSbeZwbLeld5l3nq7bbFtLKIJ8lJe8iBs6pqllcviQ4lKZAI6gIDOOMPM7w9+M4EMwwzMmTNn5vP+J2fmzDnXfCGu+Z7zPdclMxgMBhAREZFkeIgdABEREdmGyZuIiEhimLyJiIgkhsmbiIhIYpi8iYiIJMZL7ACspdfr0dzcDG9vb8hkMrHDISKSBIPBAK1Wi969e8PDg/M1VyGZ5N3c3IwLFy6IHQYRkST98pe/REBAgNhhkJ1IJnl7e3sDaP0F9PHxETkaIiJpuHPnDi5cuGD6G0quQTLJ23iq3MfHB76+viJHQ0QkLbzc6Fp4AYSIiEhimLyJiIgkRjKnzYmIyPH0ej2qqqrQ3Nwsdihup3fv3hgwYIDZuwSYvImIqFPXr1+HTCbD4MGDeauZA+n1evz444+4fv06goODO7zOnwQREXWqvr4eISEhTNwO5uHhgZCQEDQ0NJh/3cHxELk0tVqNGzduYNmyZdBoNFCr1di1axeKioqgVquh0+mg0+kwd+5cGAwG3LlzB2q1GmfOnEFqairUarXYH4GonZaWFt5mJhJvb2/odDqzr/G0OZEd5efnIy8vD5cuXcKSJUug1WrR2NiIe+65BydPnsQzzzyD9PR0VFdXIykpCfPnz0d5eTk+//xzqFQqXLp0Ce+99x5rGZBT4W1m4rA07kzeRHY0bdo0HD58GI899hiio6MxdOhQpKWlQaPR4MUXX0RISAjGjRsHf39/9O3bF//xH/+BESNG4NixYwgLC0NiYiITNzm9NetTcP1Gvd33e/99fZG2+Q2L27S0tGDFihX405/+BE9PT6xfvx5lZWXw8/PDli1b8NBDD7XbXq/XIzU1FZ9//jl8fX3xwgsv4NlnnwUA7Ny5E3v37oWPjw+mTJmCxYsXm96n1WqxYMECLFmyBGPHjrUq/vLycsyZMwdlZWUdXrtz506HWPv374/nnnsOFy9eRH5+PgYMGGDVcQAmbyK78vT0xMKFCzF48GBcunQJgYGBeP3113Hr1i307t0bADB27FgkJSXh66+/BtB6auwPf/gDQkNDuaKXJOH6jXrcute6hGbbfr/ocptPP/0U48ePR69evbB792706tULhw4dwpdffom1a9ciKyur3fZ79+7FxYsXkZubC71ej9/85jcYMmQIbt68iQMHDmDv3r3o1asXli5disOHDyM2NhYVFRVYt24dysvLrY799u3b2LRpE7RardnXMzIyzMaak5ODqKgoq49jxGveRHYkk8kwfPhw+Pn5YciQIbjvvvsQFhaGwYMHw9/fHwAwfPhwyGQyPPHEEwBaqwYOGzYM9913Hx588EExwydyagaDARkZGZg6dSoAoKSkBNOnTwcAPPnkk1CpVLh69Wq795SXl2PSpEnw8fGBn58fxo4di6KiIpSXl2P8+PHw9/eHp6cnnnrqKRQWFgIAsrOzsWDBAgwfPtzq2NLS0vCf//mfnb5uTay2YPImIiJJOHfuHAICAkwNVmpqahAUFGR6PSgoCNeuXWv3nqFDh6KoqAi3b9/GzZs3cezYMVy/fh2PPfYYjh49ivr6emg0GhQXF+P69esAgFWrViE6OtrquIwLUuPi4jrdxppYbcHT5kREJAmXL19Gv379TI8NBkO7RV0Gg6HDLW0JCQm4cuUK5syZg5CQEPz617+GRqNBREQEZs2ahXnz5qFv376IiIjAt99+a3NMtbW1+OCDD/CXv/zF4nbWxGoLzryJiEgSZDIZvLx+nnOGhISgpqbG9NhcQZOGhgbMmzcPBw4cwP/93/9BrVbjwQcfRFNTE2JjY3HgwAFkZGTAx8cHYWFhNsdUUlKC+vp6/OY3v8GMGTMAADNmzEBTU1O77ayJ1RZM3kREJAkDBw7Ejz/+aHqsUCiQk5MDAPjqq6/g6+uLBx54oN17vv76a6SkpMBgMODatWsoLCxEdHQ0qqqqsGTJEuh0OjQ2NiI7OxuTJ0+2OaZnn30WhYWFyMnJMcWSk5NjWuNiS6y24GlzEtW+ffuQn58vdhgkoLi4OMyaNUvsMMgFPProo6irq0NjYyMCAgIwb948pKSkYOrUqfDx8UF6ejoA4F//+he2bduGXbt2YeLEiSgtLcW0adMAACkpKaZbsmJjYzF9+nS0tLTgt7/9LUaNGmXx+OvXr0dUVBQmTZpkVbyffvopampqsGLFik5j7S6ZwWAw9GgPDqLRaFBWVoZhw4axn7cLefnll3HhwgX88pe/FDsUEoDxZ7tz506xQ3FbPf3befbsWQwZMqTdc2Le5/3xxx/Dw8MDL7zwgt2P35XDhw/Dx8cHkZGRdt1vVFQUPv74Y7P3eZsbf4Azb3IC/OPuul5++WWxQyABdJVghTR37lwsX74cCQkJ6NWrl0OPrdPp7Jq41Wo1nnvuuXbXwq3F5E1ERJLh7e2NDz74QJRjT5kyxa778/PzM10HtxUXrBEREUkMZ94kKmPFIXJN/PkSCYPJm0RlXAFKrok/XyJh8LQ5ERGRxDB5ExERSQxPmxMRkU3eeG0tGlTX7b7fPvL7kfJmqsVt2vbzNt4q1tTUhJkzZ2Lz5s1me2//+c9/RlZWFgwGA37/+98jNja20/2Xlpbi7bffNj2urq7G8OHD8b//+7/ttrt69SpeffVV3LhxA4MGDcKWLVtw9uxZpKSkQK1Wo7i42JaPbjMmbyIiskmD6jqe/4X963v97XLXXwja9vM22rRpE27evGl2+zNnziA3Nxc5OTloamrCc889hzFjxqBv375mt1coFFAoFABam47MnTsXa9eu7bDdxo0b8fzzz2Pq1Kl4//33sX37drz66qvYuXMnEhMTrfm4PcLT5kREJAl39/MGgIMHD6J3794YPHiw2ff84x//QExMDHx9fXHfffdhzJgxKCkpsep46enpUCqV+MUvftHuea1Wiy+//BJPP/00AGDWrFkOL/PM5E1ERJJwdz/vq1ev4qOPPsKqVas6fU9NTU277l3W9tG+fPkyTp48aXYWXVdXB39/f1OHs6CgIFRXV9v6cXqEyZuIiCShbT9vvV6P9evXY8OGDfDz8+v0PXq9vsNz1vTR/vvf/47nn38ePj4+HV67uzc3gA6PhcbkTUREktC2n3dFRQUqKiqwfv16zJgxA2VlZXjttddw4sSJdu/p168famtrTY9ra2ut6qNdVFTUaTlUuVyOxsZGtLS02LRPe+KCNSKyi+LiYhQUFLR7rr6+tfPU3YuDYmJiEBUV5bDYyDW07ef98MMPo7S01PTavHnzsGzZsg6rzSdMmICUlBTMnz8ft2/fxokTJ7BixQqLx1GpVFCr1QgLCzP7ure3N0aPHo2DBw8iPj4e+/fvx4QJE3r46WwjaPKeN28eVCqV6ZvSG2+8gebmZqSmpkKj0WDy5MlYuXKlkCEQkYhUKhWAjsmbpK2P/H6rVoZ3Z7+W3N3PuzNt+3k//vjjmD59OmbPng2dTofly5cjJCQEADBjxgzs3LnT9NioqqrKdHq+rbb9vF9//XWsWbMGH3zwAUJDQ9vdXuYIgvXzNhgMmDBhAo4cOWJK3mq1GnFxccjIyEBoaCgWLlyIxMRE07J8S9jPm0h6jLfYpKZavneXhCNEP28x2bOf91tvvYXly5fD39/fDpG1qqqqQmJiot3u8+5s/AW75l1RUQEAePHFFzF9+nT89a9/xZkzZzBw4ECEhYXBy8sL8fHxDl9eT0RE0jV37lwcO3YMt2/f7tF+DAYDhg0bZtfE/dVXXzmsh71gp81v3ryJiIgIbNiwAVqtFomJiViwYAGCgoJM2wQHB9u8vL6srMzeoRKRQBobGwEAp06dEjkSchX26uctk8ns3vXOeB3cEQRL3iNHjsTIkSNNj2fPno1t27Zh1KhRpufMLbfvCk+bE4lv165dprNrlhhX+WZnZ3e5bXh4OJKSknocG7VnPG1OrkWw5P3VV19Bq9UiIiICQGui7t+/f7eW7BORc6moqMC/z5fDs0/He2Db0nu03kpz7tr3Frdrabhjt9iI3IFgybuxsRHbtm1DZmYmtFotPvvsM2zcuBGvvPIKrly5ggEDBiAvLw8JCQlChUBENlCpVEhPT8fq1asRGBjY5faefXzQZ8IDdjl2wz+u2mU/YrF17Ih6SrAFaxMnToRCocDMmTORkJCAhIQEjBw5EmlpaUhOTsaUKVMQHh6OuLg4oUIgIhtkZmaivLwcmZmZYociORw7cjRB7/N+5ZVX8Morr7R7LiIiArm5uUIelohspFKpUFRUBIPBgMLCQiiVSoszyLq6OujqNXabMevqNajzrbPLvhzN1rFzBWtT1uF63Q277/f+wPuQ+sZbFrdp2xJ05cqV+OmnnwC0lkG9cOECsrOz8atf/arde2xpCWqk1WqxYMECLFmyxFT45ezZs1i/fj2am5sxevRobNy40XQrtNHNmzfxhz/8AT/88APkcjneffdd3L59G8nJyTh37hzOnz9vy5B0ihXWiAiZmZmmGtB6vR6ZmZlYvHixyFFJgzuO3fW6G9A+0Xk98W7v93TXXwjatgTdsWOH6fmtW7dixIgRHRK3rS1BgdY1HevWrUN5eXm751999VW8+eabGDFiBNatW4esrCw8//zz7bZ59913MXr0aOzcuRP79+/H5s2b8e677yInJ6fTzmfdweRNRCgpKYFOpwMA6HQ6HDlyxGICCgwMRLXmhl2veUt1tmrr2FH3GVuC3n33QkVFBfbv348DBw50eE/blqC+vr6mlqAzZ87s9DjZ2dlYsGABPvroI9NzP/74I9RqNUaMGAGgtQ3otm3bOiTvkpISfPLJJwCAadOm4Y033oBWq4W3t3e3P7c5bExCRIiMjDSd/vPy8sLEiRNFjkg6OHaOc3dLUKPt27fjpZdeMltwpTstQVetWoXo6OgO+2lbp6SzNqBtt/Py8oK/v7+pTLA9MXkTEZRKpalNooeHB5RKpcgRSQfHznHatgQ1amhowLFjx/Dss8+afU93W4Ka20/buiTW1ikxGAzdOl5XmLyJCHK5HJMmTYJMJkN0dLRkT2GLgWPnOG1bghqVlpZiwoQJnRbv6m5L0K72c/36dbP7CQ4OxvXrrU1bdDodmpubBWnMw+RNRABaZ5BDhw7lzLEbOHaO0bYlqNE333yD0aNHd/qeCRMm4PDhw7h9+zZUKhVOnDhhKh5mi/79+8PX19dU6jcnJ8dsG1CFQoH9+/cDAA4ePIjRo0fb/Xo3wORNRP+fXC5HWloaZ47dwLFzjLYtQY1++OGHDi09//Wvf5lK7bZtCTp37twOLUFt6a+xZcsWpKamIi4uDrdu3UJiYiKA1pXun376KQBgxYoV+OabbzB16lT87W9/Q0pKSo8+c2e42pyI3AqrofXc/YH3WXVbV3f2a4lMJkNiYiJycnJMLUF37drVYbtf/epX7Z5/8cUX8eKLL3bYbuzYsejdu3enx8vIyGj3+NFHHzVbp3/FihWmf/ft27fdLWxCYfImIrfSthoab+nqnq4KqQjJOHtOSEhAr169ur0fIVqCdqayshLJycl23SdPmxOR27i7GlpdnTSrurkzY0vQniRuQJiWoJ158MEHkZOTY7fqagCTNxG5EXPV0IikiMmbSIJUKhXWrFnDmaONzFVDo64ZDAaxQ3BLlsadyZtIgtjFqntYDc12fn5+uHHjBhO4gxkMBty4cQN+fuZryHPBGpHEuGMXK3tRKpUoKioCwGpo1howYACqqqraFSghx/Dz88OAAQPMvsbkTSQx7tjFyl6M1dDy8/NZDc1K3t7eGDRokNhh0F142pxIYnjdtmdYDY1cAWfeRBITGRmJgoIC6HQ6Ua/btjTcQcM/rlrcRq9uAQB4+Hl2uS/0s7iJ3RiroRFJGZM3kcQ4w3Xb8PBwq7arqKho3b5fF9v3s36fRMTkTSQ5znDd1lg3uitr164FAKSmpgoZDpHbYfJ2AsXFxSgoKGj3XH19PQB0aCUXExODqKgoh8VGzkmpVKKyspLXbYncFJO3k1KpVAA6Jm8igNdtidwdk7cTiIqK6jCb5ulGIiLqDG8VIyIikhgmbyIiIolh8iYiIpIYJm8icivsyEaugMmbiNwKO7KRKxA8ef/xj3/EmjVrAADHjx9HfHw8YmNj8c477wh9aCKidu7uyMbZN0mVoMn7n//8Jz777DMAgFqtxrp167B9+3YcPHgQZWVlKC0tFfLwRETtmOvIRiRFgt3nXV9fj3feeQeLFi3CuXPncObMGQwcOBBhYWEAgPj4eOTn50OhUAgVArk4c5XpAFano86Z68jGdqokRYLNvFNSUrBy5Urce++9AICamhoEBQWZXg8ODkZ1dbVQhyc3plKpTBXqiNqKjIyEl1frnEXMjmxEPSXIzHvPnj0IDQ1FREQE9u3bB6D1FJVMJjNtYzAY2j22VllZmd3idGaNjY0AgFOnTokcifPq06cPZs+e3eH5Dz/8EADMvsbxdCxn+z0eOnRou7M1Q4YMcZrYiGwhSPI+ePAgamtrMWPGDDQ0NODWrVv48ccf4en5c0/f2tpaBAcH27zvYcOGwdfX157hOqXs7GwAwKhRo0SORHrcYexUKhXS09OxevVqUbqKmWPuMkZtbS2An38mRmJewigvL0d+fj5iY2MRGRkpSgyOpNFo3GbS404ESd7GmQ8A7Nu3DydPnsTGjRsRGxuLK1euYMCAAcjLy0NCQoIQhydyeW1vd3Lma7ZyuVzsEDpgRzZyBQ5rTOLr64u0tDQkJydDo9FAoVAgLi7OUYcnchkqlQqFhYUwGAwoKCiAUql0itm3uQY7zogd2cgVCJ68Z82ahVmzZgEAIiIikJubK/QhiVxaZmZmuxXTzj77JiL7Y4U1Iok5cuQIDAYDgNaFn0eOHBE5IiJyNPbzJpKYoKAg/PDDD+0eU0esA0CujMmbSGKMK7iNampqRIpEmow1AO5O3kRSwuRNJDETJ05Efn6+qVYCZ4vmdbaAbu3atQCA1NRUR4dEZDe85k0kMUqlsl2VMN7yROR+mLyJJEYulyM6OhoymQwxMTFOcZsYETkWT5sTSRALjRC5NyZvIglioREi98bT5kRERBLDmTeRGzJ3DzTvfyaSDiZvIgLA+5+JpITJm8gNmbsHmvc/d41V28hZWEzeI0eOhEwm6/C8sTjE6dOnBQuMiEgqeNaCHM1i8s7Ly3NUHG5j165dqKio6HI74zbG2ZAl4eHhSEpK6nFsRGQZq7aRs7CYvP/9739bfHP//v3tGow7qKiowHdn/41+/pavWPQy6AEAjT+ct7jdtSad3WIjIiJpsJhBMjIyOn1NJpMhNjbW7gG5g37+Xpj/uNwu+/rwjMou+3F21p6xAHjWgohcX7eTN5EjWXvGAuBZCyJyfRb/Em7evBnr16/HokWLzL6+Y8cOQYIiMseeZywAaZ+1UKlUSE9Px+rVq1nbnMgNWUzeERERAICnn37aIcEQkXUyMzNRXl6OzMxMLF68WOxwiMjBLCZv46rKZ555BnV1dfjmm2/g5eWF4cOH495773VIgETUnkqlQlFREQwGAwoLC6FUKjn7JnIzVtU2LykpQVxcHHbv3o3t27djypQp+PLLL4WOjYjMyMzMhF7fel1fr9cjMzNT5IiIyNGsqrC2detW/PWvf8UjjzwCoPUWsg0bNmDfvn2CBueK6urqcL1JZ7frrdeadNDV1dllXyQNJSUl0OlaF9vpdDocOXKEp86J3IxVM2+ZTGZK3ADw2GOPwWAwCBYUEXUuMjISXl6t37u9vLwwceJEkSMiIkezOPM21usdNmwYdu/eDaVSCQ8PD+zbtw/jxo1zSICuJjAwEF5NNXa9zzuA1zvdilKpRFFREQDAw8MDSqVS5IhcE2sLkDOzmLzHjRsHmUxmmmX/6U9/Mj2WyWRYvXq1Q4Ikop/J5XJMmjQJ+fn5iI6O5mI1gbC2ADkzi7+V586d63IHeXl5mDZtmt0CIqKuKZVKVFZWctYtMNYWIGdl1TVvS3bv3m2POIjIBnK5HGlpaZx1E7mpHidvLlwjIiJyrB4nb3P9vo22bt2KKVOmYOrUqfjwww8BAMePH0d8fDxiY2Pxzjvv9PTwREREbseq+7y74+TJkzhx4gRyc3Oh0+kwZcoUREREYN26dcjIyEBoaCgWLlyI0tJSKBQKocIgIiJyOYIl7zFjxuDjjz+Gl5cXqqur0dLSgps3b2LgwIEICwsDAMTHxyM/P5/Jm8iC4uJiFBQUtHvOeBtn37592z0fExNjKmtMRK6rx8nb0jVvb29vbNu2DX/+858RFxeHmpoaBAUFmV4PDg5GdXV1T0MgcjsqVeuq5buTN9mPvashAqyISPbT4+QdHx9v8fXly5cjKSkJixYtwuXLl9tdIzfeL26LsrKybsXpLBobGwXZ56lTp+y+X2cixLgZ9+vsY9enTx/Mnj273XPGNSR3Pw+gw+c5dOgQrl271uVxjNssW7asy2379euHyZMnd7mdMzL+LnX1c1er1YIcX61WO/3vHDk/i8m7q8R84MABvPTSS2Zfu3jxIu7cuYMhQ4agV69eiI2NRX5+Pjw9PU3b1NbWIjg42KaAhw0bBl9fX5veIzRbeitnZ2ejsd6+xw8ICMCoUaPsu1MnI8S4AdIdu+zsbACwKvbs7Gxcq6rsstiIv0droRHUX7W43bUmnWTHDbB+7EJDQ9Gou2n3+7wDQkMdOnYajUbykx7qyOL/zRs2bOj2jquqqrBt2zZ8+umnAICioiIolUqkp6fjypUrGDBgAPLy8pCQkNDtYzgL9lYmZ2fPYiMsNEIkPovJe8yYMaZ/19fX4/bt2zAYDGhpaUFlZaXFHSsUCpw5cwYzZ86Ep6cnYmNjMXXqVMjlciQnJ0Oj0UChUCAuLs4+n0Qk7K1sPS68IiKyD6tbgu7cuRMA4OnpCa1Wi4cffhgHDhyw+L7k5GQkJye3ey4iIgK5ubndDNf5mOutzNm39bjwiojIdlYl75ycHBw5cgRpaWlYtWoVTpw4gdLSUqFjkwT2VrZeVFRUh9m0sQtTamqqxfdy5S8R0c+sqrAml8sRHByM8PBwnDt3DjNnzsSFCxeEjk0S2FuZiIgczaqZt5eXFyorKxEeHo6vvvoK48ePh0ajETo2SWBvZcewdx90gL3QiUi6rJp5L1y4EBs2bEBkZCQKCgoQGRmJcePGCR2bJBh7K8tkMvZWJiIih7Bq5j106FB89NFHAID9+/fjypUr8PDocU8TSTK3YvrGjRvw9vbGxYsXTddwAa6YJiIiYVhM3sbbeJKSkpCRkWEqhXr//ffjhRdeQH5+vvARSkBDQwO8vLzg7e1t1fbXrFh41XSndQW7v4/lL0nXmnQIsC5MIiJyERaT9+9//3scO3YMADB27Nif3+TlhaefflrYyJxUT1ZMA0B4eLhVx6mtqAAAhIZZ3j7Ahn0SEZFrsJi8d+/eDaA1OVmTmKhrSUlJVm1nyxcCIiJyL1Zd805NTcW3336Lzz//HFqtFuPHj8eTTz4pdGxERERkhlWrzvbv34/ly5ejoaEBzc3N+N3vfoesrCyhYyMiIiIzrJp5/+Uvf8GePXtMHcCSkpLw0ksvYc6cOYIGR0Q9Z+/qdKxMRyQ+q2beer2+XevOkJAQt71VjIiISGxWzbz79u2LwsJCREdHAwAKCwvRp08fQQMjIvuwd3U6VqYjEp9VyTs5ORnr1q3Dpk2bAADe3t54//33BQ2MiIiIzLOqSMumTZuwZ88efP/995DJZOjfvz9++9vfskgLERGRCKwu0hIREQEAMBgMbl2khYiISGws0kJEkrdr1y5U/P+qhF0xbte2D0Fn2wVZV/GYyOGsLtJCROSsKioqUFZ+Hp5+fbvcVq/zBACcrai2uF3LrdtAH6v+RBI5HH8zicglePr1xT0DJ9ltf43n99ptX0T2xuRNRNQJazoAAuwCSI7H5E1EZIbMwwuePt4I6KKzH8AugOR4TN5ERGZ4+PgjPDzEqjU/7AJIjsbkTZLBU5hERK2YvEkSbDnVyFOYROTqmLxJEpKSkqzelqcwicjVMXkTuQFrLjnwcgORdDB5E7k4ay8N8HIDkXQweZPdCVGqEmhNGLacPqdW1o4ZLzcQSYegyfu9997DoUOHAAAKhQKrVq3C8ePHkZqaCo1Gg8mTJ2PlypVChkAiEKRUpbreLrE5O2u/+PBLjziKi4tRUFDQ4fnOfh4xMTGIiopySGzkXgRL3sePH8fRo0fx2WefQSaTYcGCBcjLy8OWLVuQkZGB0NBQLFy4EKWlpVAoFEKFQSKxd6nKW1eK7LYvZ2btFx9+6XEucrlc7BDIzQiWvIOCgrBmzRr4+PgAAB566CFcvnwZAwcORFhYGAAgPj4e+fn5TN5Ebdjzi4+7fOlxlKioKM6kySkIlrwfeeQR078vX76MQ4cO4YUXXkBQUJDp+eDgYFRXW5453K2srMxuMdpLY2MjAODUqVPdev8333yDr7/+ut1z165dAwAsW7as3fMjR47EiBEjunUcRzGOhxD7tWaMe/rzEJMQY8dx69l+pTge5PoEX7D23XffYeHChVi1ahU8PT1x+fJl02sGgwEymcym/Q0bNgy+vr52jrJnsrOzAQCjRo3q1vsbGhrw/ffft3uupaUFABAQ0P6mnEGDBnX7OI6SnZ0N1N6y+34DAgKs+uw9/XmISYix47h1n7Vj58w0Go1TTnqoZwRN3qdOncLy5cuxbt06TJ06FSdPnkRtba3p9draWgQHBwsZgiTwVBwREdnCcjWGHvjpp5+wdOlSbNmyBVOnTgUADB8+HJcuXcKVK1fQ0tKCvLw8TJgwQagQiIiIXJJgM+/du3dDo9EgLS3N9JxSqURaWhqSk5Oh0WigUCgQFxcnVAhERCvsuvgAAAr8SURBVEQuSbDk/dprr+G1114z+1pubq5QhyUiInJ5rLBmAQtmEBGRM2LytoAFM8hVmasUxiphRNLB5N0FFswgd8EqYUTSweRN5IZc7fbEuro6tKjr7foFuUVdj7o6H7vtj8iemLyJnIi9kxATEJFrYvImIskLDAzEtbo7dm+GExgYaLf9EdkTkzeRE7F3EmICInJNTN4kWeytTETuismbXA5XTRORq2PyJslytRXTRETWEqwxCREREQmDyZuIiEhimLyJiIgkhsmbiIhIYrhgzQJWuyKSDmv/X9Xr1AAADy+/LvcHhNgjNCK7Y/ImIskLDw+3eltjHYDw8K4Sc4hN+yVyJCZvC1jtikgakpKSrN7WWLwnNTVVqHCIBMdr3kRERBLDmTfZHdsz9ow1Y8frtkTujcmbyIlYe42V122J3BuTN9kd2zN2n7XXbnndlsi98Zo3ERGRxDB5ExERSQxPm3eBi4e6hwUziIiEw+RtARcPdQ8LZhARCYvJ2wIuHuoeFswgIhIWr3kTERFJjKDJu6mpCdOmTUNVVRUA4Pjx44iPj0dsbCzeeecdIQ9NRETksgRL3t9++y3mzp2Ly5cvAwDUajXWrVuH7du34+DBgygrK0NpaalQhyciInJZgiXvrKwsvP766wgODgYAnDlzBgMHDkRYWBi8vLwQHx+P/Px8oQ5PRETksgRbsLZ58+Z2j2tqahAUFGR6HBwcjOrqaqEOT0RE5LIcttpcr9dDJpOZHhsMhnaPrVVWVmbPsOyisbERAHDq1CmRI5Eejl33cNy6j2NHrsBhybtfv36ora01Pa6trTWdUrfFsGHD4Ovra8/Qeiw7OxsAMGrUKJEjkR6OXfdw3LrP3cZOo9E45aSHesZht4oNHz4cly5dwpUrV9DS0oK8vDxMmDDBUYcnIiJyGQ6befv6+iItLQ3JycnQaDRQKBSIi4tz1OGJiIhchuDJu7i42PTviIgI5ObmCn1IIiIUFxejoKCgw/PGkrzG6n5GMTExiIqKckhsRD3F8qhE5FbkcrnYIRD1GJM3EbmkqKgoh82kVSoV0tPTsXr1agQGBjrkmOTeWNuciKiHMjMzUV5ejszMTLFDITfBmbeNzF1H4zU0IvelUqlQVFQEg8GAwsJCKJVKzr5JcJx524FcLud1NCI3lZmZCb1eD6C1GBVn3+QInHnbyJHX0YjI+ZWUlECn0wEAdDodjhw5gsWLF4scFbk6zryJiHogMjISXl6t8yAvLy9MnDhR5IjIHTB5ExH1gFKphIdH659SDw8PKJVKkSMid8DkTUTUA3K5HJMmTYJMJkN0dDQXq5FD8Jo3EVEPKZVKVFZWctZNDsPkTQ7D2+zIVcnlcqSlpYkdBrkRJm8SFW+xIyKyHZM3OQxvsyMisg8uWCMiIpIYJm8iIiKJYfImIiKSGCZvIiIiiWHyJiIikhgmbyIiIolh8iYiIpIY3udN5ORYmY6I7sbkTSRBrExH5N6YvImcHCvTEdHdeM2biIhIYpi8iYiIJIbJm4iISGKYvImIiCSGyZuIiEhiJLPa3GAwAADu3LkjciRERNJh/Jtp/BtKrkEyyVur1QIALly4IHIkRETSo9Vq4efnJ3YYZCcyg0S+jun1ejQ3N8Pb2xsymUzscIiIJMFgMECr1aJ3797w8OCVUlchmeRNRERErfg1jIiISGKYvImIiCSGyZuIiEhimLyJiIgkhsmbiIhIYpi8iYiIJIbJm4iISGIkU2HNVWzcuBGnT5+GVqtFZWUlHnroIQDAzZs3MWvWLCQnJ4scobRUVVUhLi7ONI5GO3bsQGhoqOlxUlIS3nzzTYSEhDg6RKeTn5+PnTt3QqfTwWAwYMaMGViwYEGn22dlZeGee+7BtGnTHBilc7F1zIiExuTtYK+//jqA1qSTmJiInJwcAMD//M//iBmWpAUHB5vGsTO7du1yUDTOrbq6Gn/84x+xb98+BAYGorm5GfPmzcOgQYMwadIks+85ffo0xowZ4+BInUd3xoxIaDxt7kTOnDkDpVKJiRMnmpL5vn37sGbNGtM28+bNwxdffIEvvvgCs2fPxqxZs7B69WqxQnZaa9aswaJFizB58mQUFxcjKioKVVVVYoclurq6Omi1WqjVagBA7969kZaWhocffhiHDh3CnDlzMH36dMTFxeH06dM4fvw4iouLsW3bNnz++eciRy8OS2PW9vfqiy++wLx58wC0/n+anp6O5557DjExMSgtLRUtfnJNnHk7kRs3biAzMxNNTU2IiorC/PnzLW5/+fJlHDlyBAEBAQ6K0DnV1NRgxowZpsfx8fEAgL59+2LHjh0AgDfffFOU2JzNo48+ikmTJiE6OhpDhgzB2LFjER8fj7CwMKSkpGDHjh2Qy+XIzs7Gzp07sWPHDkRFRWHMmDF46qmnxA5fFJ2N2cCBAy2+T6vV4u9//zuKi4uxdetWKBQKB0VM7oDJ24k89dRT8PHxgVwuR2BgIBoaGixuP2jQILdP3ID50+Zr1qzB448/LlJEzm3jxo1YsmQJjh49iqNHj2LOnDnYsmUL3n//fRQXF+PSpUs4efIkm1i00dmYWWL8svPII4+gvr7eEWGSG2HydiJeXj//OGQyGQwGg+m/RsbWqADY3q8LHJ+OSkpKcOvWLUyZMgUJCQlISEhAVlYWPvnkE7z99tuYPn06nnzySQwePBiffPKJ2OE6hc7GLDs7G8DPfbJ1Ol279/n6+gIAuyCSIPjV2skFBgbi4sWLMBgM+OGHH3D+/HmxQyIJ8/Pzw3//93+brtMaDAacPXsWPj4+kMlkWLRoEcaOHYuCggK0tLQAADw9PU3/dkedjdmQIUMQGBiI77//HgBQVFQkZpjkZjjzdnK//vWvsXfvXsTFxWHQoEEYNWqU2CGRhI0bNw7Lli3DokWLTGdxnnrqKbz//vtYs2YNJk+eDJlMhvHjx+PUqVMAWn8H3377bQQEBCAuLk7M8EXR2ZgtXboUTzzxBDZt2oT33nsP48ePFzlScifs501ERCQxPG1OREQkMUzeREREEsPkTUREJDFM3kRERBLD5E1ERCQxTN5ENsrPzzfVsCYiEgOTNxERkcQweRNZYevWrYiOjsbs2bNRUFAAALh06RLmz5+POXPmYOLEiVi8eDE0Gg1yc3OhVCpN77169SrGjx+PO3fuiBU+EbkYJm+iLhQWFuLw4cPYv3+/qesbAGRlZWHmzJnIysrC4cOHUVVVhZKSEsTFxaGyshLfffcdAGDPnj145pln4OPjI+bHICIXwuRN1IV//vOfiImJgb+/P7y8vJCQkAAAePXVVyGXy7Fr1y7813/9F2pqanDr1i34+Pjg2WefxZ49e9DS0oLPPvsMc+bMEflTEJErYW1zIiu0rSLs6ekJAPjd736HlpYWTJ48GZGRkfjpp59M2ymVSsyePRtjxozBI488grCwMFHiJiLXxJk3URcmTJiA/Px83Lx5E3q93tQ7/OjRo1i6dCmmTJkCAPj2229N3bdCQ0MxYsQIvPXWW5g7d65osRORa+LMm6gLCoUC58+fR0JCAu699148+uijqKurw8qVK7F06VLcc8898Pf3x5NPPonKykrT+2bNmoVNmzZBoVCIGD0RuSJ2FSMSgF6vxxtvvIEHHngAL7/8stjhEJGL4WlzIjtramrC2LFj8dNPPyExMVHscIjIBXHmTUREJDGceRMREUkMkzcREZHEMHkTERFJDJM3ERGRxDB5ExERSQyTNxERkcT8P1d8/in24cjMAAAAAElFTkSuQmCC\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = \"day\"\n", + "y = \"total_bill\"\n", + "hue = \"tip_bucket\"\n", + "data = df\n", + "ax = sns.boxplot(data=df, x=x, y=y, hue=hue)\n", + "# method calls can be queued\n", + "(annot\n", + " .reset_configuration()\n", + " .new_plot(ax, [((\"Sat\", tip_bucket_list[2]), (\"Fri\", tip_bucket_list[0]))],\n", + " data=df, x=x, y=y, hue=hue)\n", + " .configure(test='t-test_ind')\n", + " .apply_test()\n", + " .annotate())\n", + "\n", + "plt.legend(loc='upper left', bbox_to_anchor=(1.03, 1))\n", + "plt.savefig('example_bucketed.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Barplot with hue" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note: Support for barplot has not been fully implemented yet." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "SI2_I vs. SI2_J: t-test independent samples, P_val:3.710e-01 t=-8.949e-01\n", + "SI1_I vs. SI1_J: t-test independent samples, P_val:8.513e-05 t=-3.937e+00\n", + "VS1_I vs. VS1_J: t-test independent samples, P_val:9.140e-05 t=-3.923e+00\n", + "VS2_I vs. VS2_J: t-test independent samples, P_val:6.806e-03 t=-2.709e+00\n", + "VVS2_I vs. VVS2_J: t-test independent samples, P_val:9.076e-14 t=-7.672e+00\n", + "VVS1_I vs. VVS1_J: t-test independent samples, P_val:6.536e-10 t=-6.321e+00\n", + "I1_I vs. I1_J: t-test independent samples, P_val:2.905e-02 t=-2.206e+00\n", + "IF_I vs. IF_J: t-test independent samples, P_val:4.412e-03 t=-2.881e+00\n", + "SI1_E vs. SI2_E: t-test independent samples, P_val:4.178e-66 t=-1.749e+01\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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OnSoWHGIiIgaJdqu0Y8++ggajQarV682vDZhwgScPHkSc+fORf/+/bF27VosWbIElZWV6NevH6ZOnSpWHCIiokaJVoRLlixp9PTViRMnGv7ct29fZGRkiBWBiIioSZxZhoiImk2v00q6XnPmFL0XzjVKRETN5uCkRE7qTIuvN3DBDouv8144IiQiIlljERIRkayxCImISNZYhEREJGssQiIikjUWIRERyRovnyAiombT67SiXOqg12nh4KRscrmff/65xdviiJCIiJrNlLKypfU2ui2rbYmIiMgGsQiJiEjWWIRERCRrLEIiIpI1FiEREckai5CIiGSNRUhERM1WI9L9CM1db2ZmJhYuXNisbfGCeiJqNrVajaqqKqSkpOC9996DIAjYtWsXevfujZCQEDg51X3ETJkyBXv27IFWq4Ver0d+fj6OHj2KpKQkuLi4SPxd2IYanRYqE6+dM2dZsamclIjdOc/i602Le9/i67wXFiERNVtWVhaOHDmCwsJCzJ49G1qtFhUVFXB1dcX333+PcePGITU1FcXFxYiPj0dcXBx++uknnD59GuXl5SgsLMSmTZugUqksnu27777D+vXr4eXlhYKCAuh0Orz99tsQBAGrV6+GXq8HAMyaNQuhoaEW3765/rdQim+XGh7/t2isWRJywCIkomYLCwvDsWPH0K9fP4wYMQKPPfYYVq9eDY1Gg+nTp6Nz584IDg6Gu7s72rdvj5CQEPj7++PMmTPw8vLC1KlTRSnBehcvXkRKSgp8fX3x8ccfY/369XB0dERcXBzGjBmDS5cuYe/evTZRhCQdFiERNZujoyNmzZoFHx8fFBYWokOHDkhJSUF1dTXc3NwAAEFBQYiPj8f58+cBAEqlEq+//jq6du2KqqoqUfN169YNvr6+AIDHHnsMBw4cwOTJk7Fs2TKcPHkSTz75JObPny9qBrJ9PFmGiJpNoVBg4MCBcHFxga+vLzp16gQvLy/4+PjA3d0dADBw4EAoFAoEBAQAAFQqFfz8/NCpUyf07NlT1Hx3H39UKBQQBAETJkzAZ599hpCQEHz77beIiIiARqMRNQeJ44cffkBxcTEAQBAEODo6Nms9LEIikpUJEyYgLy8PUVFReOedd3D79m2UlpZKHYuaYf/+/Th+/DiAurtQeHl5NWs93DVKRLLy+uuvY+XKldiwYQMUCgXmzJmD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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = sns.load_dataset('diamonds')\n", + "df = df[df['color'].map(lambda c: c in 'EIJ')]\n", + "\n", + "x = \"clarity\"\n", + "y = \"carat\"\n", + "hue = \"color\"\n", + "hue_order=[\"E\", \"I\", \"J\"]\n", + "pairs = [\n", + " ((\"SI2\", \"E\"), (\"SI1\", \"E\"))\n", + " ]\n", + "pairs = pairs + [((clar, 'I'), (clar, 'J'))\n", + " for clar in df['clarity'].unique()]\n", + "width = 0.4\n", + "ax = sns.barplot(data=df, x=x, y=y, hue=hue, hue_order=hue_order, seed=2021)\n", + "annot.new_plot(ax, pairs, plot='barplot',\n", + " data=df, x=x, y=y, hue=hue, hue_order=hue_order, seed=2021)\n", + "annot.apply_test().annotate()\n", + "\n", + "plt.legend(loc='upper left', bbox_to_anchor=(1.03, 1), title=hue)\n", + "plt.savefig('example_barplot_hue.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tuning y offsets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](./example_tuning_y_offsets_w_arguments.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sat_Yes vs. Sat_No: t-test independent samples, P_val:4.304e-01 t=7.922e-01\n", + "Thur_No vs. Fri_No: t-test independent samples, P_val:7.425e-01 t=-3.305e-01\n", + "Thur_Yes vs. Sun_No: t-test independent samples, P_val:5.623e-01 t=-5.822e-01\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = sns.load_dataset(\"tips\")\n", + "x = \"day\"\n", + "y = \"total_bill\"\n", + "hue = \"smoker\"\n", + "pairs = [((\"Thur\", \"No\"), (\"Fri\", \"No\")),\n", + " ((\"Sat\", \"Yes\"), (\"Sat\", \"No\")),\n", + " ((\"Sun\", \"No\"), (\"Thur\", \"Yes\"))]\n", + "ax = sns.boxplot(data=df, x=x, y=y, hue=hue)\n", + "annot.new_plot(ax, pairs,\n", + " data=df, x=x, y=y, hue=hue)\n", + "annot.configure(test='t-test_ind', text_format='full', loc='inside',\n", + " comparisons_correction=None, line_height=0.05, text_offset=8)\n", + "\n", + "annot.apply_test().annotate(line_offset_to_group=0.2, line_offset=0.1)\n", + "\n", + "plt.legend(loc='upper left', bbox_to_anchor=(1.03, 1))\n", + "plt.savefig('example_tuning_y_offsets.svg')\n", + "plt.savefig('example_tuning_y_offsets.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### Use a different test with StatTest" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "setosa vs. versicolor: Bartlett statistical test for equal variances, P_val:8.660e-03 Stat=6.892e+00\n", + "versicolor vs. virginica: Bartlett statistical test for equal variances, P_val:1.478e-01 Stat=2.095e+00\n", + "setosa vs. virginica: Bartlett statistical test for equal variances, P_val:6.379e-05 Stat=1.599e+01\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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rVaLgIAAHDt2DGVlZYiJiYGbmxtCQ0MRFhaG/v37Y926dTh06BA0Gg2efvppTJkyBampqYiNjYVOp8PNmzcRGRkJb29vOZ+auhFUZ2+99ZbYunWrEEKIo0ePiri4ODF27Fhx5coVIYQQX3/9tZgyZYoQQoiIiAixY8cOIYQQ//jHP8QHH3wghBAiNzdXDB48WFy/fl2EhISI06dPCyGEiIuLE9988424ePGiCAsLE5WVlUIIIebPny+2bdvWkF+m1Tp48KCYM2eOEEKI7Oxs4evrK55++mnxyy+/CCGEOH/+vBg5cqQQour8RERECCGEuHz5svD19RVCCFFaWipefvllodPpxKZNm8SmTZvE1atXhaenp/j999+FEEKEh4eLxMREERMTI6KiooQQQty4cUNotVpx5swZsWPHDhERESH0er3w8vIyneN9+/aJwMBAIYQQISEhYtOmTQ30zFifO53LkJAQceLECXHixAnh4eEhbt68KYQQIjo6WsTExAghhEhLSxM9evQQly5dMp0HIYTw8vISH374oRBCiH/+858iLCxMCCFM+9y3b58IDg4Wer1eFBcXi4CAAHHt2jUxZ84c8euvvwohhDh+/Ljw9/dvyKeh3jiivweenp6YM2cOzpw5g2HDhmHYsGHYvHkzZs+ebXpMcXHxbdudOHECK1euBAB06tQJvXv3xunTpzFixAiEhYXB29sbI0aMwODBgwEAERER2L59O7Kzs/HTTz/hwQcfbJgv0MoNGzYMK1asQHFxMfbu3QtfX19s2bIFkZGRpseUlpYiPz8fAPDYY48BAB544AHY29sjODgYXl5eCA8Ph729vWmbH3/8Ef369UO7du0AwPRX2ObNm/HGG28AAFxcXDBixAikpqbC0dERAHDx4kXcd999puOMGTMGS5cuRVFRUY3j0+1uPZfVo/FqDz30EFq2bAkASElJwbp16wAA7u7u6Nat2x33OXToUABA165dcfDgwRr/dvLkSYwZMwZ2dnaws7PDrl27AFSd68OHD2P//v04ffo0SkpKLP61SolFfw88PDzw1Vdf4ciRI9i3bx+2b9+Ojh07mr4pKisr8eeff962nbjl5RAhBCorKzF16lR4eXnh8OHDWLt2LdLS0jB06FDMmzcPU6dOxahRo6BWq++4zjTdzs7ODl5eXkhOTsb+/fvx3nvvYdu2babz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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from statannotations.stats.StatTest import StatTest\n", + "\n", + "# For example bartlett's test\n", + "from scipy.stats import bartlett\n", + "\n", + "df = sns.load_dataset(\"iris\")\n", + "x = \"species\"\n", + "y = \"sepal_length\"\n", + "\n", + "pairs = [(\"setosa\", \"versicolor\"), (\"setosa\", \"virginica\"), (\"versicolor\", \"virginica\")]\n", + "\n", + "# Required descriptors for annotate\n", + "custom_long_name = 'Bartlett statistical test for equal variances'\n", + "custom_short_name = 'Bartlett'\n", + "custom_func = bartlett\n", + "custom_test = StatTest(custom_func, custom_long_name, custom_short_name)\n", + "\n", + "# Then, same as usual\n", + "ax = sns.boxplot(data=df, x=x, y=y)\n", + "annot.reset_configuration()\n", + "annot.new_plot(ax, pairs, data=df, x=x, y=y)\n", + "annot.configure(test=custom_test, comparisons_correction=None,\n", + " text_format='star').apply_test().annotate()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use a custom test with StatTest" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "setosa vs. versicolor: Log t-test, P_val:4.416e-18 Stat=-1.066e+01\n", + "versicolor vs. virginica: Log t-test, P_val:1.979e-07 Stat=-5.598e+00\n", + "setosa vs. virginica: Log t-test, P_val:3.486e-29 Stat=-1.605e+01\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from statannotations.stats.StatTest import StatTest\n", + "import numpy as np\n", + "from scipy.stats import ttest_ind\n", + "\n", + "# Any function that follows the StatTest API could go here\n", + "def log_ttest(group_data1, group_data2, **stats_params):\n", + " group_data1_log = np.log(group_data1)\n", + " group_data2_log = np.log(group_data2)\n", + "\n", + " return ttest_ind(group_data1_log, group_data2_log, **stats_params)\n", + "\n", + "df = sns.load_dataset(\"iris\")\n", + "x = \"species\"\n", + "y = \"sepal_length\"\n", + "\n", + "pairs = [(\"setosa\", \"versicolor\"), (\"setosa\", \"virginica\"), (\"versicolor\", \"virginica\")]\n", + "\n", + "# Required descriptors for annotate\n", + "custom_long_name = 'Log t-test'\n", + "custom_short_name = 'log-t'\n", + "custom_func = log_ttest\n", + "custom_test = StatTest(custom_func, custom_long_name, custom_short_name)\n", + "\n", + "# Then, same as usual\n", + "ax = sns.boxplot(data=df, x=x, y=y)\n", + "annot = Annotator(ax, pairs, data=df, x=x, y=y)\n", + "annot.configure(test=custom_test, comparisons_correction=None,\n", + " text_format='star').apply_test().annotate()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Custom p-values as input\n", + "! multiple comparisons corrections will be applied if they are configured in annotator." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Performing Bartlett statistical test for equal variances on pair: ('setosa', 'versicolor') stat=6.89e+00 p-value=8.66e-03\n", + "Performing Bartlett statistical test for equal variances on pair: ('setosa', 'virginica') stat=1.60e+01 p-value=6.38e-05\n", + "Performing Bartlett statistical test for equal variances on pair: ('versicolor', 'virginica') stat=2.09e+00 p-value=1.48e-01\n", + "pvalues: [0.008659557933880048, 6.378941946712554e-05, 0.14778816016231236]\n" + ] + } + ], + "source": [ + "from scipy.stats import bartlett\n", + "\n", + "test_short_name = 'Bartlett'\n", + "pvalues = []\n", + "for pair in pairs:\n", + " data1 = df.groupby(x)[y].get_group(pair[0])\n", + " data2 = df.groupby(x)[y].get_group(pair[1])\n", + " stat, p = bartlett(data1, data2)\n", + " print(\"Performing Bartlett statistical test for equal variances on pair:\",\n", + " pair, \"stat={:.2e} p-value={:.2e}\".format(stat, p))\n", + " pvalues.append(p)\n", + "print(\"pvalues:\", pvalues)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "setosa vs. versicolor: Custom statistical test, P_val:8.660e-03\n", + "versicolor vs. virginica: Custom statistical test, P_val:1.478e-01\n", + "setosa vs. virginica: Custom statistical test, P_val:6.379e-05\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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rVaLgIAAHDt2DGVlZYiJiYGbmxtCQ0MRFhaG/v37Y926dTh06BA0Gg2efvppTJkyBampqYiNjYVOp8PNmzcRGRkJb29vOZ+auhFUZ2+99ZbYunWrEEKIo0ePiri4ODF27Fhx5coVIYQQX3/9tZgyZYoQQoiIiAixY8cOIYQQ//jHP8QHH3wghBAiNzdXDB48WFy/fl2EhISI06dPCyGEiIuLE9988424ePGiCAsLE5WVlUIIIebPny+2bdvWkF+m1Tp48KCYM2eOEEKI7Oxs4evrK55++mnxyy+/CCGEOH/+vBg5cqQQour8RERECCGEuHz5svD19RVCCFFaWipefvllodPpxKZNm8SmTZvE1atXhaenp/j999+FEEKEh4eLxMREERMTI6KiooQQQty4cUNotVpx5swZsWPHDhERESH0er3w8vIyneN9+/aJwMBAIYQQISEhYtOmTQ30zFifO53LkJAQceLECXHixAnh4eEhbt68KYQQIjo6WsTExAghhEhLSxM9evQQly5dMp0HIYTw8vISH374oRBCiH/+858iLCxMCCFM+9y3b58IDg4Wer1eFBcXi4CAAHHt2jUxZ84c8euvvwohhDh+/Ljw9/dvyKeh3jiivweenp6YM2cOzpw5g2HDhmHYsGHYvHkzZs+ebXpMcXHxbdudOHECK1euBAB06tQJvXv3xunTpzFixAiEhYXB29sbI0aMwODBgwEAERER2L59O7Kzs/HTTz/hwQcfbJgv0MoNGzYMK1asQHFxMfbu3QtfX19s2bIFkZGRpseUlpYiPz8fAPDYY48BAB544AHY29sjODgYXl5eCA8Ph729vWmbH3/8Ef369UO7du0AwPRX2ObNm/HGG28AAFxcXDBixAikpqbC0dERAHDx4kXcd999puOMGTMGS5cuRVFRUY3j0+1uPZfVo/FqDz30EFq2bAkASElJwbp16wAA7u7u6Nat2x33OXToUABA165dcfDgwRr/dvLkSYwZMwZ2dnaws7PDrl27AFSd68OHD2P//v04ffo0SkpKLP61SolFfw88PDzw1Vdf4ciRI9i3bx+2b9+Ojh07mr4pKisr8eeff962nbjl5RAhBCorKzF16lR4eXnh8OHDWLt2LdLS0jB06FDMmzcPU6dOxahRo6BWq++4zjTdzs7ODl5eXkhOTsb+/fvx3nvvYdu2babz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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.boxplot(data=df, x=x, y=y)\n", + "annot.new_plot(ax=ax, pairs=pairs,\n", + " data=df, x=x, y=y)\n", + "(annot\n", + " .configure(test=None, test_short_name=test_short_name)\n", + " .set_pvalues(pvalues=pvalues)\n", + " .annotate())\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Non-hue violin" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "setosa vs. versicolor: Custom statistical test, P_val:8.660e-03\n", + "versicolor vs. virginica: Custom statistical test, P_val:1.478e-01\n", + "setosa vs. virginica: Custom statistical test, P_val:6.379e-05\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.violinplot(data=df, x=x, y=y)\n", + "annot.new_plot(ax=ax, pairs=pairs, plot=\"violinplot\",\n", + " data=df, x=x, y=y)\n", + "(annot\n", + " .configure(test=None, test_short_name=test_short_name)\n", + " .set_pvalues(pvalues=pvalues)\n", + " .annotate())\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Custom annotation texts" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "Thur vs. Fri: first pair\n", + "Thur vs. Sat: second pair\n", + "Sun vs. Fri: third pair\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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fsjUqVNZuHAhdrudyMhI58Yd4NSpU4SGhhIQUP+n+u2332K327Hb7VgsFufrdrud6upq5/OgoCDnY4vFQt3o7z8cBd7f3/+qtTb0N39/f+bMmUNtbS1jxoxh+PDhnDp1ioZGlu/QoUNjq0IMpkNAIm3s7bffJj09naioKObOnUtUVBSfffYZkZGR7Nmzhy+//BKAXbt2MWHCBC5evEhkZCQ5OTlcunQJu93Ob37zG959912GDh3KH//4R6qrq7Hb7bz11lv84he/aHT5w4YNw2q1cu7cOex2e6MnbY8cOcKRI0cAWLduHQMHDqRLly7s3r2bmTNnMnbsWAAOHjxIbW2ti9aQtBW1AETaWHx8PPv372fs2LFcd9119OjRg+TkZK6//noWLlzInDlzcDgcBAQE8Oqrr9KxY0eSkpL46quvSEhIwOFwMHjwYJKTk6mpqeH5558nPj6empoaBgwYwNNPP93o8qOjo/n8889JTEykS5cu9OvXj/Ly8gbf261bN1566SW++uorQkJCnOcXZs+ezcyZM+nQoQOdOnVi0KBBlJSUuHxdiXvpjmAi0qD8/HwWLVpETk6O0aWIm+gQkIiISakFIB4tOzsbq9VqdBkiDYqNjSUhIcHoMlpMLQDxaFarlaNHjxpdhsgVjh496vU7JzoJLB6vT58+rF692ugyROqZNm2a0SW0mloAIiImpQAQETEpHQISjzZhwgSjSxBpkC98N9ULSETEpHQISETEpBQAIiImpQAQETEpBYCIiEkpAERETEoBICJiUgoAERGTUgCIiJiUAkBExKQUAGJKCxYsICYmhqVLl5KSksKxY8eaNf3DDz9MWVmZS2r59NNPmTVrlkvmJdIcGgpCTKlfv37s3LmTG2+8sUXT9+3bl3379hESEuLiykTajloAYjr3338/DoeDlJQUPvroI2JiYvj000/Jz89nwoQJJCUlERcXx/nz55k1axYTJ05k0qRJPPXUU9jtdtLT0wF46KGHOHXqVL15r1ixgieeeIIHHniAe++9l3/7t3+jsrISgB07dpCUlERCQgLDhw/npZdeAi7fe3f8+PEApKWlMWPGDMaNG8cLL7zQhmtFzEijgYrpvP322/Tt25c33njjij34L774gm3btnHzzTezadMmqqqq2Lx5M7W1tSxYsIATJ06wePFisrOzG5we4P/+7//405/+REhICHPnzmXlypU8+eSTvP7662RkZPCP//iPnD59mhEjRvDggw9eMf3Fixd599133fb5ReqoBSDyAz169ODmm28GICIigmPHjpGcnMzq1at56KGHCA8Pv+Y8YmNj6datG35+fkyePJndu3djsVhYtWoVhw8f5uWXXyYjIwOHw8H3339/xfQREREu/1wiDVEAiPxAhw4dnI/DwsLIzc1l2rRpVFZWMnXqVPLy8q45D39/f+dju92On58fFy5cYNKkSRw+fJg77riDJ598koCAABo6BffDGkTcSQEgchVvv/026enpREVFMXfuXKKiovjss8+Ayxv5mpqaBqfbvn0758+fx263s379ekaMGEFxcTGVlZU8/vjjxMTEkJ+fz6VLl7Db7W35kUTq0TkAkauIj49n//79jB07luuuu44ePXqQnJwMXD7Mk5yczIoVK+jTp0+96bp160ZKSgrl5eUMGjSIGTNmEBgYyPDhwxkzZgyBgYH06dOH2267jeLiYgIDA434eCLqBiriSitWrKC8vJxnnnnG6FJErkmHgERETEotAPFo2dnZWK1Wo8vwGbGxsSQkJBhdhngItQDEo1mtVo4ePWp0GT7h6NGjClOpRyeBxeP16dOH1atXG12G15s2bZrRJYiHUQtARMSkFAAiIialQ0Di0SZMmGB0CT5D61J+TL2ARERMSoeARERMSgEgImJSCgAREZNSAIiImJTX9AKy2+1UVVXRrl07LBaL0eWIiHgFh8NBdXU1HTt2xM+v/j6/1wRAVVWVhgQQEWmhPn360Llz53qveU0AtGvXDrj8ITR+uohI01y6dImjR486t6E/5DUBUHfYJzAwkKCgIIOrERHxLg0dOtdJYBERk1IAiIiYlAJARMSkFAAiIi1QVlZGWloa5eXlRpfSYgoAEZEWyMzM5LPPPiMzM9PoUlpMASAi0kxlZWVs374dh8PBtm3bvLYV4NZuoMnJyZSVlREQcHkxCxcupKqqisWLF2Oz2RgzZgyzZ892ZwkiIi6XmZmJ3W4HLo9SkJmZyaOPPmpwVc3ntgBwOBwUFRWxY8cOZwBcvHiR2NhY1q5dS48ePZg+fTq7du0iOjraXWWIiLjczp07qampAaCmpoYdO3Z4ZQC47RBQYWEhAA8//DATJkzgzTff5NChQ4SHhxMWFkZAQABxcXFYrVZ3lSAi4hbDhw937tgGBAQwYsQIgytqGbcFwLlz54iMjGTlypX84Q9/IDMzk6+//pru3bs73xMaGsrp06fdVYKIiFskJSU5B1bz8/MjKSnJ4Ipaxm2HgAYOHMjAgQOdzydPnszy5cuJiIhwvuZwOJo9smdBQYHLahQRaakBAwZw4MABBgwY4Dzi4W3cFgAfffQR1dXVREZGApc39jfffDOlpaXO95SWlhIaGtqs+fbv319jAYmI4Xr27MmSJUuYNWsWwcHBRpdzVTab7ao7zm47BHT+/HmWLFmCzWajsrKSjRs3MmfOHI4fP05xcTG1tbXk5OQwbNgwd5UgIuI2ISEhZGRkePTG/1rcFgAjRowgOjqa+Ph4EhMTSUxMZODAgWRkZJCamsrYsWPp1asXsbGx7ipBRMRtCgsL+dWvfsXx48eNLqXFLA6Hw2F0EU1R14zx9ENAZWVlLFmyhHnz5nn1noGINO6xxx7jxIkT3HLLLaxcudLocq6qsW2nrgR2MV+4PFxEGldYWMiJEycAKCkp8dpWgALAhXzl8nARadyLL77Y6HNvoQBwoYYuDxcR31O391+npKTEoEpaRwHgQg1dHi4ivicsLKze81tuucWgSlpHAeBCvnJ5uIg07oknnmj0ubdQALiQr1weLiKN69Wrl7MVcMstt9CzZ0+DK2oZBYALhYSEMHLkSCwWC/fcc4+6gYr4sCeeeIIOHTp47d4/uPl+AGaUlJRESUmJ9v5FfFyvXr1Yt26d0WW0igLAxeouDxcR8XQ6BCQiYlIKABcrKysjLS1NF4GJiMdTALiYhoIQEW+hAHAhDQUhIt5EAeBCGgpCRLyJAsCFNBSEiHgTBYALaSgIEfPwhQ4fCgAX0lAQIubhCx0+FAAupKEgRMzBVzp8KABcLCkpiTvuuEN7/yI+zFc6fCgAXKxuKAjt/Yv4Ll/p8KEAEI/mCyfaxPf4SocPBYB4NF840Sa+x1c6fCgAxGP5yok28T2+0uFDASAey1dOtIlv8oUOHwoA8Vi+cqJNfJMvdPhQAIjH8pUTbSKeSgEgHstXTrSJeCoFgHgsXznRJuKpFADi0WJjY7nuuuuIjY01uhQRn6MAEI9mtVr5/vvvsVqtRpci4nMUAOKxdB2AiHspAMRj6ToAEfdSAIjH0nUArqVxleTHAty9gOeff57y8nIyMjLYu3cvixcvxmazMWbMGGbPnu3uxTdLXl4eubm5rZpHRUUFAF27dm3VfEaNGkVMTEyr5uHthg8fTm5uLjU1NboOwAV+OK7So48+anQ54gHc2gLYt28fGzduBODixYvMnz+fV155ha1bt1JQUMCuXbvcuXhDlJWVUVZWZnQZPkHXAbiOzqdIQ9zWAqioqGDp0qXMmDGDI0eOcOjQIcLDwwkLCwMgLi4Oq9VKdHS0u0potpiYmFbvdaenpwOwePFiV5RkanXXAVitVl0H0EoNnU9RK0Dc1gJ45plnmD17Nl26dAHgzJkzdO/e3fn30NBQTp8+7a7Fi4/whQG3PIHOp0hD3NIC2LBhAz169CAyMpLs7Gzg8l6HxWJxvsfhcNR73lQFBQUuq9Mdzp8/D8CBAwcMrsR3/PKXv6SwsNDoMrzanXfeyV/+8hdqa2vx9/fnzjvv1HdU3BMAW7dupbS0lIkTJ3L27FkuXLjAV199hb+/v/M9paWlhIaGNnve/fv3JygoyJXlulRWVhYAERERBlci8nc9e/YkJSXFGQCzZs0y9SE1M3X4sNlsV91xdksA/P73v3c+zs7OZv/+/Tz77LOMHj2a4uJifvKTn5CTk0NiYqI7Fi8iP6LzKa5X19mjtQFgJLd3A60TFBRERkYGqamp2Gw2oqOjNb6LSBtKSkqipKRE51NQh486bg+AhIQEEhISAIiMjGTLli3uXqSINKDuBiYidXQlsIiISSkARERMSgEgImJSCgAREZNSAIiImJQCQETEpBQAIiImpQAQETEpBYCIiEkpAERETEoBICJiUgoAERGTUgCIRysrKyMtLU33sBVxAwWAeLTMzEw+++wzMjMzjS5FxOcoAMRjlZWVsW3bNhwOB7m5uWoFiLiYAkA8VmZmZr0bmasVIOJaCgDxWDt27MDhcADgcDjIy8szuCIR36IAEI/VvXv3es9DQ0MNqkTENykAxGOVlpY2+lxEWkcBIB5rxIgRWCwWACwWCyNGjDC4IhHfogAQj5WUlERAQAAAAQEBJCUlGVyRiG9RAIjHCgkJYejQoQAMGzaM4OBggysS8S0KAPFodb2ARMT1FADiscrKytizZw8AH3zwgS4EE3ExBYB4rMzMTOx2OwB2u10Xgom4mAJAPNbOnTvrXQm8Y8cOgysS8S0KAPFYw4cPr9cLSN1ARVxLASAeKykpCT+/y19RPz8/dQMVcTEFgHiskJAQRo4cicVi4Z577lE3UBEXCzC6AJHGJCUlUVJSor1/ETdoNAAGDhzovBT/hxwOBxaLhY8//ththYnA5VZARkaG0WWI+KRGAyAnJ6et6hARkTbWaAAcPny40YlvvvnmRv++bNky/vznP2OxWJg8eTJTp05l7969LF68GJvNxpgxY5g9e3bzqxYRkVZrNADWrl171b9ZLBZGjx591b/v37+fDz/8kC1btlBTU8PYsWOJjIxk/vz5rF27lh49ejB9+nR27dpFdHR0yz+BiIi0SIsD4FoGDx7M//zP/xAQEMDp06epra3l3LlzhIeHExYWBkBcXBxWq1UBICJigEYD4Le//S3/8R//wYwZMxr8+6pVqxqdebt27Vi+fDmvv/46sbGxnDlzpt5dnkJDQzl9+nQLyhYRkdZqNAAiIyMBuPfee1u8gFmzZpGSksKMGTMoKiqq16uorjdRcxQUFLS4lrZw/vx5AA4cOGBwJcb75JNP+Mtf/tKqeVRWVgLQqVOnFs9j4MCB/PSnP21VHSI/5gu/9UYDICYmBoBJkyZRXl7OJ598QkBAAHfddRddunRpdMZffvklly5d4vbbb+e6665j9OjRWK1W/P39ne8pLS1t9n1e+/fvT1BQULOmaUtZWVkAREREGFyJ8c6ePcuxY8daNY+620D26NGjxfPo2bOn/j/E5bzlt26z2a6649ykC8F27tzJvHnz6N27N7W1tZw4cYKlS5cyaNCgq05z8uRJli9fzh//+EcAtm/fTlJSEkuWLKG4uJif/OQn5OTkkJiY2IKPJN4gJibGuRPRUunp6QAsXrzYFSWJyA80KQCWLVvGm2++Se/evYHL3UOffvppsrOzrzpNdHQ0hw4dIj4+Hn9/f0aPHs24ceMICQkhNTUVm81GdHQ0sbGxrvkkIj4sLy+P3NzcVs2joqICgK5du7ZqPqNGjWp1sItnaFIAWCwW58Yf4M4772zSnZpSU1NJTU2t91pkZCRbtmxpZpki0lplZWVA6wNAfEejAVC3x9C/f39ee+015+iM2dnZ3H333W1SoIjocJq4R6MBcPfdd2OxWJx7+y+88ILzucViYd68eW1SpIiIuF6jAXDkyJFrziAnJ4fx48e7rCAREWkbrb4fwGuvveaKOkREpI21OgCacjJYREQ8T6sDoLlX8oqIiGfQLSFFRExKASAiYlI6ByAiYlKtDoC4uDhX1CEiIm2s0esArrVxf+edd3jkkUdcWpCIiLSNRgPg6aefbqs6RESkjTUaAIMHD3Y+rqio4Pvvv8fhcFBbW0tJSYnbi2uONWvWUFhYaHQZzhrqxl0xSq9evUhJSTG0BhHxbE0eDnr16tUA+Pv7U11dzW233cY777zj1uKao7CwkILPPse/vbEjHdprLt/w5q+Fxt3qsvZihWHLFhHv0aQA2Lx5Mzt27CAjI4Mnn3ySDz/8kF27drm7tmbzb9+VDuEjjS7DcBeKtxtdgoh4gSb1AgoJCSE0NJRevXpx5MgR4uPjOXr0qLtrExERN2pSCyAgIICSkhJ69erFRx99RFRUFDabzd21iYhcQef76mvN+b4mBcD06dN5+umnefXVV1m2bBmbNm1i+PDhLVqgiEhrFBYWcvTwYbr5+xtaR6DdDkBZE4bNd5dva2tbNX2TAuCOO+7gjTfeAGDTpk0UFxfj56dRJETEGN38/ZnYWbe23Hy+dR0+Gt2KV1RUUFFRQUpKCmfPnqWiogKbzUa3bt2YNWtWqxYsIiLGarQF8O///u/s2bMHgCFDhvx9ooAA7r33XvdWJiIibtVoANTd7Ss9PV03khYR8TFNOgewePFiDh48yAcffEB1dTVRUVEMGjTI3bWJiIgbNelM7qZNm5g1axZnz56lqqqKOXPmsH79enfXJiIibtSkFsAf/vAHNmzYQGhoKAApKSk88sgjTJkyxa3FiYiI+zSpBWC3250bf4AbbrhB3UBFRLxck7biXbt2Zdu2bc7n27Zt4/rrr3dbUSIi4n5NOgSUmprK/PnzWbRoEQDt2rVj5cqVbi1MRETcq9EAqKi4fJXZokWL2LBhA8eOHcNisXDzzTfz61//GqvV2iZFing7Txi/xlPGrgHdr8JTNPlCsMjISODyTeB1IZhI8xQWFnL488/wvz7QsBrsfpfHjTnyzTHDagCoPXvJ0OXL3+lCMJE24n99INcPu8noMgx39n+/NroE+ZsmnQTWxl9ExPe4tS/nyy+/zLhx4xg3bhxLliwBYO/evcTFxTF69GiWLl3qzsWLiEgj3BYAe/fuZffu3WzcuJFNmzZx+PBhcnJymD9/Pq+88gpbt26loKDAI28tKSJiBm4LgO7du5OWlkZgYCDt2rXj1ltvpaioiPDwcMLCwggICCAuLk49iUREDNKk6wBaonfv3s7HRUVFvPfeezzwwAN0797d+XpoaCinT592VwnSCp7QbRE8p+uiui2KL3JbANT54osvmD59Ok8++ST+/v4UFRU5/+ZwOLBYLM2aX0FBQYOvnz9/vjVl+pzz589z4MCBFk9/8OBBvjlZwo2d3P4VadR1jsu33Tt/4nPDavimsqbV61Pfz/pasz61Lutrzbp066/7wIEDzJo1i/nz5zNu3Dj2799PaWmp8++lpaX1xhhqiv79+xMUFHTF62vWrKH2YgUXire3um5vV3uxgpqaQCIiIlo8j6ysLOgUwNQBIS6szDv9/lAZnTt3bv36rFJrt05r1mdWVhZlLq7Hm11rXdpstqvuOLvtHMCpU6eYOXMmL774IuPGjQPgrrvu4vjx4xQXF1NbW0tOTg7Dhg1zVwkiItIIt7UAXnvtNWw2GxkZGc7XkpKSyMjIIDU1FZvNRnR0NLGxsS5ZXnBwMN+UX6JD+EiXzM+bXSjeTnBwsNFliIiHc1sAPPXUUzz11FMN/m3Lli3uWqyIiDSRBvUXETEpBYCIiEkZ28dPRKSZysvL+bamhs3nK4wuxXDf1tRgKS9v8fRqAYiImJRaACLiVYKDg3GcPs3Ezl2NLsVwm89XtKrHn1oAIiImpQAQETEpBYCIiEkpAERETEoBICJiUuoFJA0qLy/n28oafn9I4y5+U1lDTSv6Wot4KrUARERMSi0AaVBwcDABlWd0PwD+dj8Aja4qPkgBINIGysvLqamwcfZ/vza6FMPVVNgoD9IhNU+gQ0AiIiblUy0AT7glpL3mIgB+Ae0Nq6H2YgVwg2HLlysFBwdz2vYd1w+7yehSDHf2f7/WDYs8hM8EQK9evYwuAYDCwkIAevUycgN8g8esDxHxXD4TACkpKUaXAEB6ejoAixcvNrgSEZHG6RyAiIhJKQBEREzKZw4BiYh5fFtba/gdwS7Y7QB08DNuP/rb2lpac6WOAkBEvIqndHCo+FuHj58YWE8IrVsfCgAR8Srq8OE6OgcgImJSCgAREZNSAIiImJTOAchVfeMB9wOovHS5p0WnQOP2Vb6prKGzYUsXcR8FgDTIU3palP6tp0WPMOPq6Yxr1kft2UuGjgZqv1gLgF97f8NqgMvrgRsNLUH+RgEgDVJPC9fyhEB1jlN1o8G13OgZ60MUACJtwhMC1VfCVFxHJ4FFRExKASAiYlIKABERk3JrAFRWVjJ+/HhOnjwJwN69e4mLi2P06NEsXbrUnYsWEZFrcFsAHDx4kPvuu4+ioiIALl68yPz583nllVfYunUrBQUF7Nq1y12LFxGRa3BbAKxfv54FCxYQGhoKwKFDhwgPDycsLIyAgADi4uKwWq3uWryIiFyD27qB/va3v633/MyZM3Tv3t35PDQ0lNOnT7tr8SIicg1tdh2A3W7HYrE4nzscjnrPm6qgoMCVZbnc+fPnAThw4IDBlfgGrU/X0bp0LV9Yn20WADfeeCOlpaXO56Wlpc7DQ83Rv39/goKCXFmaS2VlZQEQERFhcL2uif0AAAejSURBVCW+QevTdbQuXctb1qfNZrvqjnObdQO96667OH78OMXFxdTW1pKTk8OwYcPaavEiIvIjbdYCCAoKIiMjg9TUVGw2G9HR0cTGxrbV4kVE5EfcHgB5eXnOx5GRkWzZssXdixQRkSbQlcAiIialABARMSkFgIiISSkARERMSjeEEbfJy8sjNze3VfOou4tV3c1MWmLUqFHExMS0qg4RX6QA+AFP2WCBNlp1QkJCjC5BxGcpAFxMG6y/i4mJUYiJeDAFwA9ogyUiZqKTwCIiJqUAEBExKQWAiIhJ6RyAiBdQDzVxBwWAiEmoh5r8mAJAxAuoh5q4g84BiIiYlAJARMSkFAAiIialABARMSkFgIiISSkARERMSgEgImJSCgAREZPShWAiYjoaWuMyBYCISAv4wtAaCgARMR0NrXGZzgGIiJiUAkBExKQUACIiJqUAEBExKQWAiIhJKQBERExKASAiYlJecx2Aw+EA4NKlSwZXIiLiPeq2mXXb0B/ymgCorq4G4OjRowZXIiLifaqrq2nfvn291yyOhmLBA9ntdqqqqmjXrh0Wi8XockREvILD4aC6upqOHTvi51f/qL/XBICIiLiWTgKLiJiUAkBExKQUACIiJqUAEBExKQWAiIhJKQBERExKASAiYlJecyWwp7BaraxevZqamhocDgcTJ07kX/7lX4wuy6s8++yzfPzxx1RXV1NSUsKtt94KwLlz50hISCA1NdXgCn3DyZMniY2Nda7fOqtWraJHjx7O5ykpKTz33HPccMMNbV2iV2jub379+vV06NCB8ePHt2GVLaMAaIbTp0/z/PPPk52dTXBwMFVVVSQnJ9OzZ09GjhxpdHleY8GCBcDlDdSDDz7I5s2bAVixYoWRZfmk0NBQ5/q9mjVr1rRRNd6nJb/5jz/+mMGDB7dxpS2jQ0DNUF5eTnV1NRcvXgSgY8eOZGRkcNtttxETE8PJkycByM/PJzk5GYDk5GSWLFnCr371K0aNGsWuXbsMq98bHDp0iKSkJEaMGOEMhOzsbNLS0pzvSU5OJj8/n/z8fCZPnkxCQgLz5s0zqmSvk5aWxowZMxgzZgx5eXn1vrtSX2O/+ffee48pU6YwYcIEYmNj+fjjj9m7dy95eXksX76cDz74wODqr00tgGbo168fI0eO5J577uH2229nyJAhxMXFER4e3uh01dXVrFu3jry8PJYtW0Z0dHQbVex9vvvuOzIzM6msrCQmJoapU6c2+v6ioiJ27NhB586d26hC73LmzBkmTpzofB4XFwdA165dWbVqFQDPPfecIbV5g6v95sPCwnjmmWdYtWoVISEhZGVlsXr1alatWkVMTAyDBw9m6NChRpd/TQqAZnr22Wd57LHH2L17N7t372bKlCm8+OKLjU5T90Xo3bs3FRUVbVGm1xo6dCiBgYGEhIQQHBzM2bNnG31/z549tfFvREOHgNLS0hgwYIBBFXmfq/3mV65cSV5eHsePH2f//v1XDLTmDRQAzbBz504uXLjA2LFjSUxMJDExkfXr15OVlQX8fbztmpqaetMFBQUBaBTTJggI+PtX0mKx4HA4nP/WqRsaHLhieFtpGq23prnab/6tt97id7/7HRMmTGDQoEH07duXt956y+hym837IstA7du357/+67+cx0sdDgd//etfuf322wkODubYsWMAbN++3cgyfU5wcDBffvklDoeDEydO8PnnnxtdkpjE1X7zgYGBWCwWZsyYwZAhQ8jNzaW2thYAf39/52NPpxZAM9x9993867/+KzNmzHDuhQ4dOpSZM2fyz//8zyxatIiXX36ZqKgogyv1LT//+c/505/+RGxsLD179iQiIsLoksQkrvabX7lyJWlpaYwZMwaLxUJUVBQHDhwALn9ff/e739G5c2diY2ONLP+adD8AERGT0iEgERGTUgCIiJiUAkBExKQUACIiJqUAEBExKQWASDNZrVbnWE8i3kwBICJiUgoAkSZYtmwZ99xzD5MnTyY3NxeA48ePM3XqVKZMmcKIESN49NFHsdlsbNmyhaSkJOe0X3/9NVFRUVy6dMmo8kUapAAQuYZt27bx/vvvs2nTJudIpXD5xh/x8fGsX7+e999/n5MnT7Jz505iY2MpKSnhiy++AGDDhg1MmjSJwMBAIz+GyBUUACLXsG/fPkaNGkWnTp0ICAggMTERgLlz5xISEsKaNWv4zW9+w5kzZ7hw4QKBgYH88pe/ZMOGDdTW1rJx40amTJli8KcQuZLGAhJpgh+OmOLv7w/AnDlzqK2tZcyYMQwfPpxTp04535eUlMTkyZMZPHgwvXv3JiwszJC6RRqjFoDINQwbNgyr1cq5c+ew2+3O8fV3797NzJkzGTt2LAAHDx50jgLZo0cPfvrTn/Kf//mf3HfffYbVLtIYtQBEriE6OprPP/+cxMREunTpQr9+/SgvL2f27NnMnDmTDh060KlTJwYNGkRJSYlzuoSEBBYtWqQ7wInH0migIm5gt9tZuHAhN910E9OmTTO6HJEG6RCQiItVVlYyZMgQTp06xYMPPmh0OSJXpRaAiIhJqQUgImJSCgAREZNSAIiImJQCQETEpBQAIiImpQAQETGp/wcFWePwBEMFegAAAABJRU5ErkJggg==\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = sns.load_dataset(\"tips\")\n", + "x = \"day\"\n", + "y = \"total_bill\"\n", + "order = ['Sun', 'Thur', 'Fri', 'Sat']\n", + "ax = sns.boxplot(data=df, x=x, y=y, order=order)\n", + "annot.new_plot(ax, pairs=[(\"Thur\", \"Fri\"),(\"Thur\", \"Sat\"), (\"Fri\", \"Sun\")],\n", + " data=df, x=x, y=y, order=order)\n", + "annot.configure(loc='outside')\n", + "annot.set_custom_annotations([\"first pair\", \"second pair\", \"third pair\"])\n", + "annot.annotate()\n", + "\n", + "plt.savefig('example_custom_text_annot.png', dpi=300, bbox_inches='tight')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "With a log-scale swarm plot\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "H1N1_Nonsynonymous vs. H1N1_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:5.014e-04 U_stat=2.624e+03\n", + "H3N2_Nonsynonymous vs. H3N2_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:1.294e-03 U_stat=1.535e+04\n", + "Influenza B_Nonsynonymous vs. Influenza B_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:2.026e-01 U_stat=3.340e+02\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtoAAAF2CAYAAABQ2D87AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3hUZfrw8e/0SWbSQwIhVOldigRCE1CkVwVRURR03eXnrrqK64si2HdXsSuouCsWRHpxAwgWOtJBSgBpIb0nk0w/7x+BgSGFAEkmJPfnurwuz3POec59ZpjMPc95ikpRFAUhhBBCCCFEhVL7OgAhhBBCCCFqIkm0hRBCCCGEqASSaAshhBBCCFEJJNEWQgghhBCiEkiiLYQQQgghRCXQ+jqAyuB2u7FYLOh0OlQqla/DEUIIIYQQNZCiKDgcDkwmE2p18fbrGploWywW4uPjfR2GEEIIIYSoBVq0aEFAQECx8hqZaOt0OqDopvV6vY+jEUIIIYQQNZHdbic+Pt6Te16pRibaF7uL6PV6DAaDj6MRQgghhBA1WWldlWUwpBBCCCGEEJVAEm0hhBBCCCEqgSTaQgghhBBCVIIa2UdbCCGEEKIqORwOEhISsFqtvg5FVBKj0Uh0dHSpAx9LIom2EEIIIcQNSkhIICAggMaNG8saHjWQoihkZGSQkJBAkyZNyn1etU20f/vtN77//nsUReG2227j7rvv9nVIQgghhBAlslqtkmTXYCqVirCwMNLS0q7pvGrbRzs3N5fZs2fz5ptvsmHDBl+HI4QQQghRJkmya7breX+rTYv2Z599xubNmz3b8+fPR1EU/v3vfzNp0iQfRiaEEEIIUXn27dvHW2+9RXZ2NoqiULduXaZPn07z5s19HRrPPfcc+/btY+nSpfj7+3vKb731VlatWkV0dLQPo6v+qk2iPWXKFKZMmeLZzs3N5fXXX2fixIm0b9/eh5EJIYQQQlQOu93OY489xvz582nbti0AK1asYOrUqWzYsAGNRuPjCOH8+fO8+uqrvPrqq74O5aZTbRLtK73yyiskJyfz3//+l3r16vH000/7OiRxgdVqxWKxMHPmTN566y0URWHBggU0bdqU2NhYjEajr0MUQgghbgqFhYXk5eVRUFDgKRsxYgRms5kZM2YQERHBk08+CRQl4OvWrWPSpEnMmTOHBg0acPz4cZxOJ7NmzaJLly7k5eUxa9Ysjh49ikqlonfv3jz11FNotVrat2/Po48+ypYtW0hNTWXKlClMnDjxqjFOmjSJFStWsHbtWgYNGlRs/48//sgHH3yA2+3GZDLxj3/8gw4dOvD+++9z/vx50tLSOH/+PJGRkfzrX/8iIiKCb775hoULF6LT6TAYDMyePZucnByefvppNm7ciFqtprCwkP79+7NmzRrGjRvH6NGj2bZtG0lJSYwcOZK//e1vAHz33XcsWLAAtVpNeHg4L7zwAk2aNOG5557DbDZz7NgxkpOTadmyJW+++SYmk6mC3r1yUCpZXl6eMnToUOXcuXOespUrVyqDBw9W7rjjDuWrr76q8GtarVZl165ditVqrfC6haIsW7ZMeeSRR5T+/fsrDz/8sPLAAw8oo0aNUiZOnKi89tprvg5PCCGEqHKHDx++7nPnz5+vdOjQQenfv7/y97//Xfn++++VgoIC5fDhw0psbKzicDgURVGUiRMnKr/++quyfft2pXXr1p5rfv7558p9992nKIqiPPvss8rLL7+suN1uxWazKQ8//LAyd+5cRVEUpUWLFsqCBQsURVGUgwcPKu3atbtqrjR9+nTls88+UzZt2qTcdtttSmJioqIoitKpUyfl3LlzyokTJ5SePXsqZ8+eVRRFUbZu3arExsYqeXl5ynvvvacMGDBAycvLUxRFUR577DHl3XffVZxOp9K2bVslJSVFUZSivGLhwoWKoijKiBEjlJ9//llRFEX5/vvvlSeffFJRFEW5/fbblTfeeENRFEVJTk5W2rdvr5w9e1bZunWrMnDgQCUjI0NRFEVZsmSJMnjwYMXtdivTp09Xxo8fr9hsNsVutyujRo1SFi9efN3vk6IUf5+vlnNWaov2/v37mTFjBqdPn/aUpaSkMGfOHJYuXYper2fChAl0796dZs2aVfj1Dx06VOF1CoiKiqKgoICoqCg6dOhA48aN+frrr7FYLHTr1o3du3f7OkQhhBCiSmm1WiwWy3Wde8899zB06FB2797Nnj17mDdvHvPmzePLL78kKiqKtWvX0rBhQ5KTk7n11lvZvXs39erVo2HDhlgsFpo2bcqSJUuwWCz88ssvfPHFF54W8lGjRvHNN99w3333AdCjRw8sFguNGzfGbreTnp5OcHBwqbE5nU7sdju33nor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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "samples = pd.read_csv('samples.tsv', sep = '\\t')\n", + "samples = samples.loc[samples.mutation_rate_samp < 1]\n", + "samples = samples.drop(columns=['mutation_rate_samp'])\n", + "samples = (\n", + " samples.melt(id_vars=['sampleID', 'subtype'],\n", + " value_vars=['nonsynon_mutation_rate_samp','synon_mutation_rate_samp'],\n", + " var_name='Synon_Nonsynon', value_name='mutation_rate_samp')\n", + " .replace('nonsynon_mutation_rate_samp', 'Nonsynonymous')\n", + " .replace('synon_mutation_rate_samp', 'Synonymous'))\n", + "\n", + "samples = samples.loc[samples.mutation_rate_samp > 0]\n", + "\n", + "significanceComparisons = [(('H3N2','Synonymous'), ('H3N2','Nonsynonymous')),\n", + " (('H1N1','Synonymous'), ('H1N1','Nonsynonymous')),\n", + " (('Influenza B','Synonymous'), ('Influenza B','Nonsynonymous'))]\n", + "\n", + "fig_args = {'x': 'subtype',\n", + " 'y': 'mutation_rate_samp',\n", + " 'hue':'Synon_Nonsynon',\n", + " 'data': samples,\n", + " 'order': ['H3N2', 'H1N1', 'Influenza B'],\n", + " 'hue_order':['Nonsynonymous','Synonymous'],\n", + " 'dodge': True}\n", + "\n", + "configuration = {'test':'Mann-Whitney',\n", + " 'comparisons_correction':None,\n", + " 'text_format':'star'}\n", + "\n", + "fig, ax = plt.subplots(1,1, figsize=(12,6))\n", + "ax.set_yscale('log')\n", + "\n", + "sns.stripplot(ax=ax, **fig_args)\n", + "annotator = Annotator(ax=ax, pairs=significanceComparisons,\n", + " **fig_args, plot='stripplot')\n", + "annotator.configure(**configuration).apply_test().annotate()\n", + "fig.savefig(f'flu_dataset_log_scale_in_axes_strip.svg', format='svg')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "With a horizontal orientation" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " ns: 5.00e-02 < p <= 1.00e+00\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "H1N1_Nonsynonymous vs. H1N1_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:5.014e-04 U_stat=2.624e+03\n", + "H3N2_Nonsynonymous vs. H3N2_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:1.294e-03 U_stat=1.535e+04\n", + "Influenza B_Nonsynonymous vs. Influenza B_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:2.026e-01 U_stat=3.340e+02\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(12,6))\n", + "fig_args_horiz = {\n", + " **fig_args,\n", + " 'y': 'subtype',\n", + " 'x': 'mutation_rate_samp'\n", + "}\n", + "ax.set_xscale('log')\n", + "sns.stripplot(ax=ax, orient='h', **fig_args_horiz)\n", + "annotator.new_plot(ax, plot='swarmplot', orient='h', **fig_args_horiz)\n", + "annotator.apply_and_annotate()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "#### Hide non significant results" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value annotation legend:\n", + " *: 1.00e-02 < p <= 5.00e-02\n", + " **: 1.00e-03 < p <= 1.00e-02\n", + " ***: 1.00e-04 < p <= 1.00e-03\n", + " ****: p <= 1.00e-04\n", + "\n", + "H1N1_Nonsynonymous vs. H1N1_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:5.014e-04 U_stat=2.624e+03\n", + "H3N2_Nonsynonymous vs. H3N2_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:1.294e-03 U_stat=1.535e+04\n" + ] + }, + { + "data": { + "text/plain": "(,\n [,\n ,\n ])" + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": "
", + "image/png": "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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(12,6))\n", + "fig_args_horiz = {\n", + " **fig_args,\n", + " 'y': 'subtype',\n", + " 'x': 'mutation_rate_samp'\n", + "}\n", + "ax.set_xscale('log')\n", + "sns.stripplot(ax=ax, orient='h', **fig_args_horiz)\n", + "annotator.new_plot(ax, plot='swarmplot', orient='h', **fig_args_horiz)\n", + "annotator.configure(\n", + " hide_non_significant=True,\n", + " pvalue_thresholds=[[1e-4, \"****\"], [1e-3, \"***\"], [1e-2, \"**\"], [0.05, \"*\"]], # removing ns as won't be shown\n", + ")\n", + "annotator.apply_and_annotate()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Back to vertical, with a different format for pvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H1N1_Nonsynonymous vs. H1N1_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:5.014e-04 U_stat=2.624e+03\n", + "H3N2_Nonsynonymous vs. H3N2_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:1.294e-03 U_stat=1.535e+04\n", + "Influenza B_Nonsynonymous vs. Influenza B_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:2.026e-01 U_stat=3.340e+02\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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tra2PPDAA+YORQghhLihI0eOYG9vf1f7HDhwIAMHDryrfV7p4opiDcWWLVvMHcJ1WVlZmcw/v9Hgbr1PYLny6VRFUW5r73jRuAUGBrJu3TpzhyGEEEIIcdvqPdH28vIiJyfHeJyTk4OHh0d9hyGEEEIIIUSdqvdEOygoiMTERPLz86moqCA+Pv6mlnoTQgghhBDiXlLny/tdydPTkxdffJEJEyag1WoZPXo0Xbt2re8whBBCCCGEqFP1kmhf3LL7ooiICCIiIurj1EIIIYQQQphFvY9oi/q1atUqNmzYYO4wGr1BgwYxatQoc4chhBBCAJCWlsaAAQNYtmwZ/fr1M5Y/9NBDxiWXRd2TRLuR27BhA8ePH8fPz8/coTRax48fB5BEWwghxC0xGBS2709jzfZT5BZW0sTFhuGhbQnt4YNafecrsllaWvLaa6+xdu1aHBwc7kLE4lZJon0f8PPzY+nSpeYOo9GaNm2auUMQQghxjzEYFP7x9W4OHM+hsloPQGFpFf9aeZBdhy7wysTed5xse3h4EBQUxPz583n77bdNXluyZAlr165Fo9HQr18/oqOjycjIYMaMGbRv354jR47g7u7ORx99hL29PbNnz+bEiRMAPP744wwZMoQBAwbwyy+/4ODgQFpaGtOmTWPp0qVX7cPFxYUtW7bw4YcfYjAYaNGiBW+99RZNmjThoYceIjIykp07d1JRUcH8+fNxdHRk4sSJbN68GbVaTXJyMl988QVTp05lyZIlWFpakpaWxkMPPYSdnR0JCQkALF26lCZNmlz3XBdH9JOTk/nkk0/49ttv+c9//sPq1atRq9V07dqVt956647e+4sayEbwQgghhBD3j+3700yS7Isqq/UcOJ7D9gPpd+U8s2bNYufOnezatevSubdvZ/PmzcTExLB69WrOnj3L8uXLATh69CiTJ09m3bp1ODk5ERcXx/79+ykqKiI2NpbPP/+cvXv34uDgQFhYmHF6amxsLCNGjLhmH3l5ebz++uv861//Ii4ujp49e5oksy4uLqxcuZJx48bx+eef06pVK2MyfLH/i3eODx48yJtvvklMTAz//e9/cXNzY9WqVfj7+7N+/fobnutKer2ezz//nJiYGFatWoVWqyUrK+uuvP+SaAshhBBC1LM120/VSrIvqqzWs2bbybtyHgcHB95++21ee+01SktLAUhK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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(12,6))\n", + "ax.set_yscale('log')\n", + "\n", + "sns.swarmplot(ax=ax, **fig_args)\n", + "annotator.new_plot(ax, plot='swarmplot', **fig_args)\n", + "annotator.reset_configuration() # undo hide_non_signif and pvalues\n", + "annotator.configure(**{**configuration, \"text_format\":\"simple\", \"text_offset\":6})\\\n", + " .apply_test().annotate()\n", + "fig.savefig(f'flu_dataset_log_scale_in_axes.svg', format='svg')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "As a violin plot" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H1N1_Nonsynonymous vs. H1N1_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:5.014e-04 U_stat=2.624e+03\n", + "H3N2_Nonsynonymous vs. H3N2_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:1.294e-03 U_stat=1.535e+04\n", + "Influenza B_Nonsynonymous vs. Influenza B_Synonymous: Mann-Whitney-Wilcoxon test two-sided, P_val:2.026e-01 U_stat=3.340e+02\n" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtoAAAF2CAYAAABQ2D87AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeVyU5fr48c/sw74poIC55FZo2aYpIOYpzVxyyyWzOmmnc47ftnNMK8vS0txSs2Nmpp1KU48oqyEqmkuAgiuJ4oILCCqgKPsy8/uDmJ8ICCrDsFzv14vXi3me+3mea4Zlrrmf+75uhdFoNCKEEEIIIYSoVUpLByCEEEIIIURjJIm2EEIIIYQQZiCJthBCCCGEEGYgibYQQgghhBBmIIm2EEIIIYQQZqC2dADmYDAYyMnJQaPRoFAoLB2OEEIIIYRohIxGI0VFRdjY2KBUVuy/bpSJdk5ODomJiZYOQwghhBBCNAEdOnTAzs6uwvZGmWhrNBqg9ElrtVoLRyOEEEIIIRqjwsJCEhMTTbnnrRplol02XESr1aLT6SwcjRBCCCGEaMyqGqoskyGFEEIIIYQwA0m0hRBCCCGEMANJtIUQQgghhDCDRjlGWwghhBCiLhUVFZGcnEx+fr6lQxFmotfr8fT0rHLiY2Uk0RZCCCGEuEfJycnY2dnRunVrWcOjETIajWRkZJCcnEybNm1qfJwMHRFCCCGEuEf5+fm4uLhIkt1IKRQKXFxc7viOhSTaQgghhBC1QJLsxu1ufr6SaAshhBBCWNChQ4d46aWXGDRoEAMHDmTChAmcPHnS0mEBMHXqVPr3709ubm657d26dSM5OdlCUTUckmgLIYQQQlhIYWEhf/vb35g6dSohISGEhoYyaNAgJk6cSElJiaXDAyAlJYXPP//c0mE0SDIZUgghhBDCQvLy8rhx40a5HuPBgwdja2vLtGnTcHV15Z133gEgKCiIiIgIxo8fz8KFC/Hy8uLkyZMUFxfz6aef8uijj3Ljxg0+/fRTjh8/jkKhwNfXl3fffRe1Wk2XLl14/fXX2bt3L5cvX2bChAmMHTu22hjHjx9PUFAQW7ZsoV+/fhX2b9u2ja+//hqDwYCNjQ3vv/8+Xbt2ZcmSJaSkpHDlyhVSUlJwc3Nj3rx5uLq6smbNGtauXYtGo0Gn0zFjxgyysrL417/+RWRkJEqlkry8PJ566inCwsIYMWIEQ4cOJSoqitTUVIYMGcLbb78NwLp16/jpp59QKpU0a9aMjz76iDZt2jB16lRsbW05ceIEaWlpdOzYkTlz5mBjY1NLP73qSY+2EEIIIYSFODg4MHnyZCZMmEDfvn2ZPHkyAQEB9OzZk/HjxxMQEEBxcTEA69evZ/To0QAcOXKEv/71rwQGBjJs2DAWLlwIwGeffYajoyMhISEEBARw4sQJVq5cCZT2njs5ObF27Vq++uorZs+eTUFBQbUxOjs788UXX/Dxxx+Tmppabt/p06eZPn06S5YsITg4mDfffJN//OMfZGdnAxAbG8vixYsJDw/HysqKtWvXUlJSwqxZs1ixYgUBAQG88MILxMXF8eijj+Lg4MDu3bsBCAsL48knn8TZ2RmA3NxcU4K+cuVKLly4QFRUFCtWrODHH38kODiYgQMH8s9//hOj0QhAfHw833//PZs3byYlJYXw8PB7/ZHdEUm0hRBCCCEs6NVXX2Xv3r1MmzaN5s2b89133/H888/j6emJp6cnO3fu5PTp01y+fBkfHx8AWrZsSefOnQF44IEHyMrKAmDXrl2MGzcOhUKBVqtl9OjR7Nq1y3Stvn37AvDggw9SWFhYYex1VXx8fBg6dCiTJ0/GYDCYtkdHR9OjRw+8vLwATIlxfHw8AE888QS2trbl4lSpVPTv35/Ro0czY8YM7O3tGTFiBAAvvvgi69evB0p7qseMGVMhdjc3N1xcXMjKymL37t0MGDDAlIwPGzaMS5cumcaP+/r6otVq0Wg0dOjQwfQ61RVJtIUQQgghLCQuLo4VK1Zga2tLnz59eO+99wgLC0OhULB3715efPFFAgIC2LBhAy+88IKp8oVerzedQ6FQmHpwDQZDueoYBoPB1CMOoNPpTMcApuNq4t133yUnJ4dly5aVO/+t1TiMRqPpmlXFOX/+fJYtW0arVq1Yvnw57777LgCDBg0iLi6O6OhocnNzefzxxyvEfvO5bk767+T6dUUSbSGEEEIIC3F2duabb74hNjbWtO3KlStkZ2fToUMH+vXrR0JCAlu2bGH48OHVns/Hx4eff/4Zo9FIYWEh69evp2fPnrUSq1arZcGCBaxcudJUT/rJJ59kz549XLhwAcA0hvqhhx6q8jyZmZn07t0bR0dHXnnlFd5++22OHj0KgJWVFYMHD+aDDz4wDZO5HV9fXzZv3kxmZiYAAQEBODo6ct99993r060VMhlSCCGEEMJC2rRpw3/+8x8WLlxIWloaOp0OOzs7Zs2aRdu2bQHo168f6enppuERtzNt2jQ+++wzBg0aRFFREb6+vrzxxhu1Fm/btm2ZMmUK06ZNA+D+++9n+vTpTJo0iZKSEvR6PcuWLcPOzq7Kczg7O/P3v/+dV155Bb1ej0ql4rPPPjPtHzZsGOvXr+f555+vNp5evXrxyiuv8PLLL2MwGHB2dubbb79FqawffckKY133odeBgoIC4uPj8fb2LnebQYj8/HyUSiVardbSoQghhGhEEhISTGOma1Nubi7jxo3j448/5uGHH67189c3RqOR7777jpSUFD799FNLh1PBrT/n6nLO+pHuC4tJTk6mY8eOjBs3rsK+qVOn0rFjR9PtmDJhYWEVPmWOGjUKX1/fcmOfJk6cyJo1a0yPDx06RPfu3cuNp3r33Xfx9vY2zU4G+OSTT5g3b949P7ebXbhwgTlz5vDUU09x9erVCvt37tzJoEGD6NevH2+++Wa5eO6kXWpqKr6+vhVeMyGEEOJO7d69G39/f3x9fc2WZEdHRzNkyJBKv2bNmmWWa95O3759iYyM5K233qrza5uDJNoCnU5HUlISKSkppm25ubkcOHCg0va9evXi1KlTXLt2DSgda3X58mVcXFxMY6yKi4uJi4ujd+/epuO6du0KwIkTJ0xtYmJi6N69u6mUD5T+0fv7+9/z8zIajezZs4c33niDl19+GRsbGzZt2oSbm1u5dpmZmbz//vssWbKELVu24OXlxfz58yucr7p2gYGBvPjii1y+fPmeYxdCCCF8fX3Zt2+fqY62OfTo0YOgoKBKvz744AOzXbcqkZGRrF27tkbDZBoCSbQFKpWKZ599lpCQENO2iIgIUxmdWzk6OuLt7W2auLFz5058fHzw9/cnMjISgMOHD+Ph4YGHh4fpOKVSiY+PDzExMUDpTOuOHTvSv39/03GXLl0iIyODbt26VRlvTEwMI0eO5K233mLQoEGMHDmS06dPV2j35Zdf8s477zB48GC2bt3KpEmTKiTZAHv27KFLly60bt0agDFjxhASElJhZvLt2l26dIlt27bx/fffVxm3EEIIIZoWSbQFAM8//zxBQUGmx4GBgQwdOrTK9r6+vqaEeceOHfj7+5dLtKOiosr1Zt983L59+8od17t3b3bt2kVJSQlRUVH4+PigVt9+nm58fDwvvfQSISEhDBs2jMmTJ1doM3ToUJ5++mnmzJnDggULTDOib5WWloa7u7vpsbu7O9nZ2eTk5NS4nZubG19//TVt2rS5bdxCCCGEaDok0RYAeHt7o1KpiI+PJzU1lZycHDp06FBlez8/P/bt20dhYSGxsbH07NmTrl27kp6eTnp6OjExMZUO//Dz8yMuLg6DwcCOHTvo06cPrq6ueHh4EB8fT3R0dKUJ+q06derEY489BsDw4cNJSEioMPa6bdu2zJo1i8DAQBwdHXn55ZeZOHEiN27cKNeushqgQIUZyzVtJ4QQQggBkmiLmwwePJjg4GCCgoIYMmTIbdt6e3uTkZHBtm3b8Pb2xsrKCqVSia+vL3v37iUpKanSiRvOzs54enoSERGBSqUyrSTl7+9PXFwc+/btw8/Pr9pYVSpVjbYBODk58frrr7N161aGDx9OSUlJuf0tWrQoN6760qVLODg4YG1tfVfthBBCCCGgHifa+/fv57333mPy5Mn873//s3Q4TcKQIUMIDw9n8+bNDBw48LZtFQoFPXv2ZNmyZeV6rv39/Vm5ciVPPPFElcM//Pz8WLp0aYXjgoKCaN68eY0mQBw/fpzjx48DpUu0duvWDXt7+3Jt5syZQ5cuXUxfDz/8MJMnT6agoKBcOx8fHw4fPszZs2cBWLt2baXj02vaTgghhBAC6vGCNdevX2fGjBlotVr+8Y9/MHLkSEuH1Oi5ubnRrl077OzscHR0rLB/4sSJjB492pRc+vn5ERQURJ8+fUxtfHx8mDx5Mq+++qpp24cffoi3tzdjxowxHbd06VI++ugjU5suXbqQnp7O2LFjTdsWL14MUGmJn2bNmrFo0SJSUlJwdnZm7ty5FdpMmTKFKVOmVPu8XVxcmD17Nm+++SZFRUW0atWKOXPmAHD06FGmTZtGUFDQbdsJIYQQt5r64cekZ1yr9fM2c3Hki89n3LZNcnIyffv2ZeXKlfTq1cu0/amnnuLHH3/E09Oz1uMSFdWbBWtWrFjBnj17TI9XrlyJ0WhkwYIF+Pj43NHyobJgTeMWExPDzJkzCQ0NtXQoQgghBFD5gjUT3niTXPvutX4t6+sxrFj21W3bJCcn079/f1xdXQkODsbW1haQRPte3emCNfWmR3vChAlMmDDB9Pj69evMnj2bsWPH0qVLFwtGJoQQQgjR8Li6utKzZ0/mzJnDzJkzy+1btmwZwcHBqFQqevXqxeTJk0lNTWXSpEm0b9+ehIQEXFxcWLx4MTY2NnzwwQecPHkSgLFjxzJgwAD69u3L9u3bsbW1JTk5mddff53ly5dXeg5HR0d27NjBokWLMBgMeHl5MWPGDJo1a8ZTTz3F4MGD2bNnD3l5ecyZMwc7OztefvllIiMjUSqVxMTE8N133zFx4kSWLVuGRqMhOTmZp556Cmtra7Zt2wbA8uXLadas2W2vVfZBIyYmhq+//pqffvqJVatWsWnTJpRKJV27dmXGjNvfMaipejtG+7PPPiMlJYX//ve/LFiwwNLhiHqke/fu0psthBBC1MDUqVPZs2cPe/fuNW3btWsXkZGRBAQEsGnTJs6dO8fatWuB0jlQr776KqGhodjb2xMSEsLBgwfJysoiMDCQb7/9ltjYWGxtbfH39yc8PBwoLQtctmp0ZefIyMjg448/5j//+Q8hISE88sgj5ZJZR0dHNmzYwOjRo/n222+57777TMlw2fmHDRsGlK7V8emnnxIQEMDq1atxdnZm48aNdOzYkbCwsGqvdauSkhK+/fZbAgIC2LhxI0VFRVy6dKlWXn+zJ9rZ2dkMHDiQ5ORk07aQkBAGDBjAM888w+rVqys9bu7cufz444/Mnz+ff/3rX+YOUwghhBCi0bG1tWXmzJl89NFHZGdnA6UrMD/33HNYWVmhVqsZPnw4UVFRQOm8pQceeACA9u3bk5WVRfv27UlKSuK1114jPDyc9957Dygtr1u2BkdoaKipYlll5zhy5Ahdu3Y1DVkZNWoU0dHRpjh9fX1N7ctWnh4+fDjBwcHk5eURHR1tmiPWoUMHWrRogZWVFU5OTjz55JMAtGzZkuvXr1d7rVupVCq6devGiBEj+Prrr3n11VcrXeDubpg10T58+DBjxowxVWmA0pJoCxcuZM2aNQQGBrJu3TpOnTplzjCEEEIIIZqssrluZRP4DQZDhTbFxcUA5cYZKxQKjEYjTk5OhIWFMW7cOJKSkhg6dCjXr1/n8ccf5/Lly0RERODp6WlKTis7x63XNBqNpmvefMzN61X079+fvXv3smXLFvz8/ExtNBpNuXPdWt63umuVTU+8edvSpUv55JNPMBqNTJgwwbS43r0y6xjt9evXM336dNMnH4Dff/+dHj16mKpa9OvXj/DwcCZNmlTr14+Pj6/1cwohhBBC3EqtVldYUdhYSUJbG4wGQ4Vr3SovLw/DTe3+7//+jxdeeIGMjAxefPFFgoODGThwIGq1mvXr1/Poo49WOKawsBCAzZs3s3nzZr744gseeeQRfv/9d86cOUP79u0ZMGAAM2fO5J133iEnJ6fKc7Rv355Dhw5x8uRJWrZsyU8//cRjjz1GTk4OBoOBvLw8cnJyyM/Pp6SkxHR8z549WbBgAfPmzat0/83H1uRaDg4OxMfH4+zsTHh4OCUlJSQnJ/Paa6/x888/M2HCBJKTkzl69CgPPvhghde1sLCQuLi4Gv+szJpof/755xW2Xb58mebNm5seu7q6cuTIEbNcX6qOCCGEEKIuJCQkYGNjU25b8+bOpGfE1Pq1mjV3rnCtW5UtJFfWzsbGhs8//5zXXnuNfv36UVBQwPjx4ykuLsbHx4fXXnuNtLS0csdotVoAnn76aX777TdeeOEFdDodQ4YMMS1KN3ToUH7++WcGDhyIVqutcN2yc7Rq1YqZM2cyefJkioqKaNmyJZ9//jk2NjYolUqsrKywsbFBr9ejUqlMxw8ZMoQjR47Qo0cPgAr7bz62Jtd6++23mTlzJitWrMDHx4ezZ8/i6enJmDFjGD9+PFZWVrRp04YxY8ZUuiCdVqvloYceMj0uqzpSlTop73fzDM9vvvmGgoIC3n77baC01zs+Pr7WZneClPerqY0bN5omMQjz6N+/v2nyhhBCiMarsvJ+jZ3BYOCXX34hKSmJadOm1fr5S0pKWLhwIS4uLuXW57CkOy3vV+dVR9zd3bly5Yrp8ZUrV3B1da3rMAQQHh5OYmKipcNotBITE+WDjBBCiEZr0qRJbNiwgX/84x9mOf/w4cP5448/TAveNUR1Xke7Z8+eLFmyhMzMTKysrIiIiKhQ21HUnQ4dOrB8+XJLh9Eovf7665YOQQghhDCbpUuXmvX8gYGBZj1/XajzRNvNzY133nmH8ePHU1RUxIgRI+jatWtdhyGEEEIIIYRZ1UmiHRkZWe7xoEGDGDRoUF1cWgghhBBCCIuotytDCiGEEEII0ZDV+dARUX8MHjzY0iE0avL6CiGEEE2bJNpN2MCBAy0dQqMmr68QQjRtM6a9T1Zmeq2f18G5GR9/NrvaduHh4Sxfvpzi4mKMRiNDhgxhwoQJtR6PqJok2kIIIYQQZpCVmc7Y1rW/XMmas9Un75cuXWLOnDls3LgRJycncnJyeOmll2jTpg19+/at9ZhE5STRFkIIIYRoZK5evUpRURH5+flA6cqQX3zxBQcOHGD06NGsXbsWKF287vDhwzz00EPs3r2brKwsLly4QK9evfjkk08AWLZsGcHBwahUKnr16sXkyZNJTU1l0qRJtG/fnoSEBFxcXFi8eDFbt24lOjqaBQsWALBkyRJ0Oh0FBQVcvHiRs2fPkpmZyd///neioqI4fPgwnTp1YuHChSgUiiqvNX78eFNxjSVLlgDwxhtv8MEHH3Dy5EkAxo4dywsvvFCXL3O1ZDKkEEIIIUQj06lTJ/r27ctf/vIXRowYwbx58zAYDIwaNYorV65w/vx5oLRWddkKxgcPHuSrr74iODiYHTt2cOLECX777TciIyMJCAhg06ZNnDt3zpSkHz9+nFdffZXQ0FDs7e0JCQlhwIABREVFkZ2dDUBoaChDhgwBShdy++mnn5g5cybvv/8+EydOJDQ0lGPHjlV7rcocPHiQrKwsAgMD+fbbb4mNjTXnS3pXJNEWQgghhGiEPv30UyIjIxkzZgwXL17khRdeYOvWrQwdOpTg4GAuXrxIRkYGDz30EADdunXD1tYWKysrvLy8yMrKIjo6mueeew4rKyvUajXDhw8nKioKABcXFx544AEA2rdvT1ZWFjY2NvTu3ZutW7cSGxuLl5cXbm5uAPTq1Qu1Wk3Lli1p3rw5999/P2q1Gjc3t2qvVZn27duTlJTEa6+9Rnh4OO+9956ZX9E7J0NHhBBCCCEamZ07d5Kbm8uAAQMYPnw4w4cPZ/369WzYsIHp06czYcIEtFqtqbcZQKfTmb5XKBQYjUYMBkOFcxcXF1fZHkqXTv/mm2/w9PQ09ZYDaDQa0/dqdcUUtKpr3Xzusm1qtRonJyfCwsLYu3cvv/32G0OHDiUsLAx7e/savUZ1QXq0hRBCCCEaGb1ez4IFC0hOTgbAaDSSkJBA586d8fDwwN3dnbVr15ZLtCvTo0cPwsLCyM/Pp7i4mICAAHr06HHbYx577DHS0tKIiYnhL3/5S41jrupa9vb2XLt2jczMTAoLC9m9ezcA27dvZ/Lkyfj7+zNt2jSsra1JTU2t8fXqgvRoCyGEqDX5+fkolUq0Wq2lQxGiSevRoweTJk3ijTfeoKioCABfX1/++c9/AjBgwAAiIiJMwzqq0qdPHxISEhg+fDjFxcX4+Pgwbtw40tLSbnvc008/zbVr1+7of0FV11Kr1UyYMIERI0bg7u5Oly5dAPDz8yMiIoLnnnsOnU7H4MGD6dixY42vVxcUxpv74huJgoIC4uPj8fb2LndbQwgh6lpycjJ9+/bl8ccf5+effy63b+rUqWzatImoqCicnZ1N28PCwvjuu+8IDAw0bRs1ahQXL15k165dKBQKACZOnEifPn0YO3YsAIcOHeJvf/sbUVFRKJWlNyzfffddIiIiiI6OxtbWFoBPPvkEGxsbJk+eXGvP88KFC6xZs4agoCA2bdpU4c17586dLFiwgMLCQjp27MisWbNM8dSkXUlJCV988QW7d++mpKSEv/71r4wZM6bcsRs2bGDbtm0sW7as1p6XEDVV1lt8M0vX0a5KcXEx7733Hv379+eZZ56pxchKe86Liop49dVX+eCDD3jwwQdr9fyWduvPubqcU3q0hRDCzHQ6HUlJSaSkpODh4QFAbm4uBw4cqLR9r169mDJlCteuXcPR0ZHMzEwuX76Mi4sLR48epWvXrhQXFxMXF2cqvwXQtWtXAE6cOEHnzp0pLi4mJiaG7t27s3v3bp599lkAoqOjmTlz5j0/L6PRyN69e/n5559JTExk2LBhlSbZmZmZvP/++/zyyy+0bt2aefPmMX/+/HKxV9du7dq1nD17ltDQUHJychg1ahQPPvggXbt25dq1a3z55ZeEhITwxBNP3PPzEqK23EsybC5GoxFfX1969ux5R8M6aurKlSs899xzjBw5stEl2XdDxmgLIYSZqVQqnn32WUJCQkzbIiIiqlw0wtHREW9vb1Opqp07d+Lj44O/v7+pjuzhw4fx8PAwJe4ASqUSHx8fYmJiAIiLi6Njx47079/fdNylS5fIyMigW7duVcYbExPDyJEjeeuttxg0aBAjR47k9OnTFdp9+eWXvPPOOwwePJitW7cyadKkSm9D79mzhy5dutC6dWsAxowZQ0hICLfeUL1du23btjFs2DDUajUODg4899xzBAcHA/Drr7/i6urKlClTqnxOQohSCoWCqKgoFixYYLrzVZtcXV3Zv39/vawAYgmSaAshRB14/vnnCQoKMj0ODAxk6NChVbb39fU1Jcw7duzA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\n" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1, figsize=(12,6))\n", + "ax.set_yscale('log')\n", + "\n", + "sns.violinplot(ax=ax, **fig_args)\n", + "# plt.legend(loc=\"lower right\")\n", + "annotator.new_plot(ax, plot='violinplot', **fig_args)\n", + "annotator.apply_test().annotate() # No need to `configure` to use the same parameters\n", + "y_lims = ax.get_ylim()\n", + "ax.set_ylim(y_lims[0], 1.25 * y_lims[1])\n", + "fig.savefig(f'flu_dataset_log_scale_in_axes_violin.png', format='png')" + ] + } + ], + "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.10" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 70f6f93..34650f1 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,12 +6,20 @@ Welcome to statannotations's documentation! =========================================== +The source code for this project can be found on the `GitHub Page `_. + .. toctree:: :maxdepth: 2 :caption: Contents: modules +.. toctree:: + :maxdepth: 1 + :caption: Tutorial: + + example + Indices and tables ================== diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt new file mode 100644 index 0000000..ba9ac46 --- /dev/null +++ b/docs/source/requirements.txt @@ -0,0 +1,4 @@ +sphinx +sphinx_rtd_theme +nbsphinx +statannotations \ No newline at end of file diff --git a/docs/source/setup.rst b/docs/source/setup.rst deleted file mode 100644 index 552eb49..0000000 --- a/docs/source/setup.rst +++ /dev/null @@ -1,7 +0,0 @@ -setup module -============ - -.. automodule:: setup - :members: - :undoc-members: - :show-inheritance: diff --git a/readthedocs.yaml b/readthedocs.yaml new file mode 100644 index 0000000..995441b --- /dev/null +++ b/readthedocs.yaml @@ -0,0 +1,13 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3" + +python: + install: + - requirements: docs/source/requirements.txt + +sphinx: + configuration: docs/source/conf.py diff --git a/requirements.txt b/requirements.txt index c7dd725..d4b3364 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ pandas>=0.23.0,<2.0.0 scipy>=1.1.0 statsmodels packaging +sphinx \ No newline at end of file diff --git a/statannotations/_Plotter.py b/statannotations/_Plotter.py index a14ff79..3c449c9 100644 --- a/statannotations/_Plotter.py +++ b/statannotations/_Plotter.py @@ -116,9 +116,9 @@ def _get_plotter(self, plot, x, y, hue, data, order, hue_order, self.fix_and_warn(dodge, hue, plot) if plot == 'boxplot': - plotter = sns.categorical._BoxPlotter( + plotter = sns.categorical.boxplot( - x, y, hue, data, order, hue_order, + x=x, y=y, hue=hue, data=data, order=order, hue_order=hue_order, orient=plot_params.get("orient"), width=plot_params.get("width", 0.8), dodge=True, @@ -178,6 +178,7 @@ def _get_plotter(self, plot, x, y, hue, data, order, hue_order, def _get_group_names_and_labels(self): if self.plotter.plot_hues is None: + print('hello') group_names = self.plotter.group_names labels = group_names