From 4ef741e7f77351d7c80c48d4dc617c3735e422eb Mon Sep 17 00:00:00 2001 From: meliurwen Date: Fri, 3 Feb 2023 13:18:32 +0100 Subject: [PATCH] Partially fixed the documentation --- .github/workflows/Build_Release.yml | 4 +- .github/workflows/python-PyCTBN-package.yml | 2 +- .gitignore | 3 + README.md | 14 + docs/Makefile | 20 - docs/PyCTBN.tests.estimators.rst | 45 - docs/PyCTBN.tests.optimizers.rst | 29 - docs/_build/doctrees/PyCTBN.PyCTBN.doctree | Bin 3707 -> 0 bytes .../doctrees/PyCTBN.PyCTBN.estimators.doctree | Bin 272060 -> 0 bytes .../doctrees/PyCTBN.PyCTBN.optimizers.doctree | Bin 60965 -> 0 bytes .../PyCTBN.PyCTBN.structure_graph.doctree | Bin 256188 -> 0 bytes .../doctrees/PyCTBN.PyCTBN.utility.doctree | Bin 189574 -> 0 bytes docs/_build/doctrees/PyCTBN.doctree | Bin 4323 -> 0 bytes docs/_build/doctrees/PyCTBN.tests.doctree | Bin 3691 -> 0 bytes .../doctrees/PyCTBN.tests.estimators.doctree | Bin 51965 -> 0 bytes .../doctrees/PyCTBN.tests.optimizers.doctree | Bin 18517 -> 0 bytes .../PyCTBN.tests.structure_graph.doctree | Bin 112918 -> 0 bytes .../doctrees/PyCTBN.tests.utility.doctree | Bin 45630 -> 0 bytes docs/_build/doctrees/basic_main.doctree | Bin 2373 -> 0 bytes docs/_build/doctrees/environment.pickle | Bin 162647 -> 0 bytes docs/_build/doctrees/example.doctree | Bin 2337 -> 0 bytes docs/_build/doctrees/examples.doctree | Bin 11423 -> 0 bytes docs/_build/doctrees/index.doctree | Bin 4946 -> 0 bytes docs/_build/doctrees/modules.doctree | Bin 2662 -> 0 bytes docs/_build/doctrees/setup.doctree | Bin 2327 -> 0 bytes docs/_build/html/.buildinfo | 4 - .../_build/html/PyCTBN.PyCTBN.estimators.html | 855 -- docs/_build/html/PyCTBN.PyCTBN.html | 243 - .../_build/html/PyCTBN.PyCTBN.optimizers.html | 334 - .../html/PyCTBN.PyCTBN.structure_graph.html | 1006 -- docs/_build/html/PyCTBN.PyCTBN.utility.html | 739 -- docs/_build/html/PyCTBN.html | 292 - docs/_build/html/PyCTBN.tests.estimators.html | 345 - docs/_build/html/PyCTBN.tests.html | 226 - docs/_build/html/PyCTBN.tests.optimizers.html | 235 - .../html/PyCTBN.tests.structure_graph.html | 566 - docs/_build/html/PyCTBN.tests.utility.html | 354 - .../_sources/PyCTBN.PyCTBN.estimators.rst.txt | 53 - .../_sources/PyCTBN.PyCTBN.optimizers.rst.txt | 45 - .../html/_sources/PyCTBN.PyCTBN.rst.txt | 21 - .../PyCTBN.PyCTBN.structure_graph.rst.txt | 77 - .../_sources/PyCTBN.PyCTBN.utility.rst.txt | 61 - docs/_build/html/_sources/PyCTBN.rst.txt | 38 - .../_build/html/_sources/PyCTBN.tests.rst.txt | 21 - .../PyCTBN.tests.structure_graph.rst.txt | 77 - .../_sources/PyCTBN.tests.utility.rst.txt | 37 - docs/_build/html/_sources/basic_main.rst.txt | 7 - docs/_build/html/_sources/example.rst.txt | 7 - docs/_build/html/_sources/examples.rst.txt | 121 - docs/_build/html/_sources/index.rst.txt | 23 - docs/_build/html/_sources/modules.rst.txt | 9 - docs/_build/html/_sources/setup.rst.txt | 7 - docs/_build/html/_static/basic.css | 856 -- docs/_build/html/_static/css/badge_only.css | 2 - docs/_build/html/_static/css/darker.css | 93 - docs/_build/html/_static/css/pdj.css | 494 - docs/_build/html/_static/css/theme.css | 5 - docs/_build/html/_static/doctools.js | 316 - .../html/_static/documentation_options.js | 12 - docs/_build/html/_static/file.png | Bin 286 -> 0 bytes .../_static/fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes .../_static/fonts/fontawesome-webfont.svg | 414 - .../_static/fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes .../_static/fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes docs/_build/html/_static/img/porao-branco.png | Bin 1127 -> 0 bytes docs/_build/html/_static/jquery-3.5.1.js | 10872 ---------------- docs/_build/html/_static/jquery.js | 2 - docs/_build/html/_static/js/pdj.js | 13 - docs/_build/html/_static/js/theme.js | 47 - docs/_build/html/_static/language_data.js | 297 - docs/_build/html/_static/minus.png | Bin 90 -> 0 bytes docs/_build/html/_static/plus.png | Bin 90 -> 0 bytes docs/_build/html/_static/pygments.css | 7 - docs/_build/html/_static/searchtools.js | 514 - docs/_build/html/_static/underscore-1.3.1.js | 999 -- docs/_build/html/_static/underscore.js | 31 - docs/_build/html/basic_main.html | 179 - docs/_build/html/example.html | 179 - docs/_build/html/examples.html | 303 - docs/_build/html/genindex.html | 1457 --- docs/_build/html/index.html | 257 - docs/_build/html/modules.html | 205 - docs/_build/html/objects.inv | Bin 3216 -> 0 bytes docs/_build/html/py-modindex.html | 447 - docs/_build/html/search.html | 195 - docs/_build/html/searchindex.js | 1 - docs/_build/html/setup.html | 179 - docs/examples.rst | 16 +- docs/{PyCTBN.rst => legacy.rst} | 14 +- docs/{PyCTBN.tests.rst => legacy.tests.rst} | 12 +- docs/make.bat | 35 - docs/modules.rst | 4 +- ...ators.rst => pyctbn.legacy.estimators.rst} | 0 ...izers.rst => pyctbn.legacy.optimizers.rst} | 0 docs/{PyCTBN.PyCTBN.rst => pyctbn.legacy.rst} | 0 ....rst => pyctbn.legacy.structure_graph.rst} | 0 ....utility.rst => pyctbn.legacy.utility.rst} | 0 ...stimators.rst.txt => tests.estimators.rst} | 20 +- ...ptimizers.rst.txt => tests.optimizers.rst} | 12 +- ...re_graph.rst => tests.structure_graph.rst} | 36 +- ...BN.tests.utility.rst => tests.utility.rst} | 16 +- 101 files changed, 85 insertions(+), 24376 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/PyCTBN.tests.estimators.rst delete mode 100644 docs/PyCTBN.tests.optimizers.rst delete mode 100644 docs/_build/doctrees/PyCTBN.PyCTBN.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.PyCTBN.optimizers.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.PyCTBN.structure_graph.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.PyCTBN.utility.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.tests.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.tests.estimators.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.tests.optimizers.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.tests.structure_graph.doctree delete mode 100644 docs/_build/doctrees/PyCTBN.tests.utility.doctree delete mode 100644 docs/_build/doctrees/basic_main.doctree delete mode 100644 docs/_build/doctrees/environment.pickle delete mode 100644 docs/_build/doctrees/example.doctree delete mode 100644 docs/_build/doctrees/examples.doctree delete mode 100644 docs/_build/doctrees/index.doctree delete mode 100644 docs/_build/doctrees/modules.doctree delete mode 100644 docs/_build/doctrees/setup.doctree delete mode 100644 docs/_build/html/.buildinfo delete mode 100644 docs/_build/html/PyCTBN.PyCTBN.estimators.html delete mode 100644 docs/_build/html/PyCTBN.PyCTBN.html delete mode 100644 docs/_build/html/PyCTBN.PyCTBN.optimizers.html delete mode 100644 docs/_build/html/PyCTBN.PyCTBN.structure_graph.html delete mode 100644 docs/_build/html/PyCTBN.PyCTBN.utility.html delete mode 100644 docs/_build/html/PyCTBN.html delete mode 100644 docs/_build/html/PyCTBN.tests.estimators.html delete mode 100644 docs/_build/html/PyCTBN.tests.html delete mode 100644 docs/_build/html/PyCTBN.tests.optimizers.html delete mode 100644 docs/_build/html/PyCTBN.tests.structure_graph.html delete mode 100644 docs/_build/html/PyCTBN.tests.utility.html delete mode 100644 docs/_build/html/_sources/PyCTBN.PyCTBN.estimators.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.PyCTBN.optimizers.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.PyCTBN.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.tests.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt delete mode 100644 docs/_build/html/_sources/PyCTBN.tests.utility.rst.txt delete mode 100644 docs/_build/html/_sources/basic_main.rst.txt delete mode 100644 docs/_build/html/_sources/example.rst.txt delete mode 100644 docs/_build/html/_sources/examples.rst.txt delete mode 100644 docs/_build/html/_sources/index.rst.txt delete mode 100644 docs/_build/html/_sources/modules.rst.txt delete mode 100644 docs/_build/html/_sources/setup.rst.txt delete mode 100644 docs/_build/html/_static/basic.css delete mode 100644 docs/_build/html/_static/css/badge_only.css delete mode 100644 docs/_build/html/_static/css/darker.css delete mode 100644 docs/_build/html/_static/css/pdj.css delete mode 100644 docs/_build/html/_static/css/theme.css delete mode 100644 docs/_build/html/_static/doctools.js delete mode 100644 docs/_build/html/_static/documentation_options.js delete mode 100644 docs/_build/html/_static/file.png delete mode 100644 docs/_build/html/_static/fonts/fontawesome-webfont.eot delete mode 100644 docs/_build/html/_static/fonts/fontawesome-webfont.svg delete mode 100644 docs/_build/html/_static/fonts/fontawesome-webfont.ttf delete mode 100644 docs/_build/html/_static/fonts/fontawesome-webfont.woff delete mode 100644 docs/_build/html/_static/img/porao-branco.png delete mode 100644 docs/_build/html/_static/jquery-3.5.1.js delete mode 100644 docs/_build/html/_static/jquery.js delete mode 100644 docs/_build/html/_static/js/pdj.js delete mode 100644 docs/_build/html/_static/js/theme.js delete mode 100644 docs/_build/html/_static/language_data.js delete mode 100644 docs/_build/html/_static/minus.png delete mode 100644 docs/_build/html/_static/plus.png delete mode 100644 docs/_build/html/_static/pygments.css delete mode 100644 docs/_build/html/_static/searchtools.js delete mode 100644 docs/_build/html/_static/underscore-1.3.1.js delete mode 100644 docs/_build/html/_static/underscore.js delete mode 100644 docs/_build/html/basic_main.html delete mode 100644 docs/_build/html/example.html delete mode 100644 docs/_build/html/examples.html delete mode 100644 docs/_build/html/genindex.html delete mode 100644 docs/_build/html/index.html delete mode 100644 docs/_build/html/modules.html delete mode 100644 docs/_build/html/objects.inv delete mode 100644 docs/_build/html/py-modindex.html delete mode 100644 docs/_build/html/search.html delete mode 100644 docs/_build/html/searchindex.js delete mode 100644 docs/_build/html/setup.html rename docs/{PyCTBN.rst => legacy.rst} (68%) rename docs/{PyCTBN.tests.rst => legacy.tests.rst} (50%) delete mode 100644 docs/make.bat rename docs/{PyCTBN.PyCTBN.estimators.rst => pyctbn.legacy.estimators.rst} (100%) rename docs/{PyCTBN.PyCTBN.optimizers.rst => pyctbn.legacy.optimizers.rst} (100%) rename docs/{PyCTBN.PyCTBN.rst => pyctbn.legacy.rst} (100%) rename docs/{PyCTBN.PyCTBN.structure_graph.rst => pyctbn.legacy.structure_graph.rst} (100%) rename docs/{PyCTBN.PyCTBN.utility.rst => pyctbn.legacy.utility.rst} (100%) rename docs/{_build/html/_sources/PyCTBN.tests.estimators.rst.txt => tests.estimators.rst} (50%) rename docs/{_build/html/_sources/PyCTBN.tests.optimizers.rst.txt => tests.optimizers.rst} (54%) rename docs/{PyCTBN.tests.structure_graph.rst => tests.structure_graph.rst} (50%) rename docs/{PyCTBN.tests.utility.rst => tests.utility.rst} (54%) diff --git a/.github/workflows/Build_Release.yml b/.github/workflows/Build_Release.yml index 1c1f4ed..a79a15b 100644 --- a/.github/workflows/Build_Release.yml +++ b/.github/workflows/Build_Release.yml @@ -26,7 +26,7 @@ jobs: run: | python -m pip install --upgrade pip python -m pip install flake8 pytest - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + if [ -f setup-requirements.txt ]; then pip install -r setup-requirements.txt; pip install -r lint-requirements.txt; pip install -r test-requirements.txt; fi - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names @@ -35,7 +35,7 @@ jobs: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | - pytest PyCTBN/tests/ + pytest tests/ - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/.github/workflows/python-PyCTBN-package.yml b/.github/workflows/python-PyCTBN-package.yml index 4d624d0..f82cd04 100644 --- a/.github/workflows/python-PyCTBN-package.yml +++ b/.github/workflows/python-PyCTBN-package.yml @@ -42,7 +42,7 @@ jobs: run: | pip install pytest pip install pytest-cov - pytest PyCTBN/tests/ --cov='./' --cov-report=xml + pytest tests/ --cov='./' --cov-report=xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: diff --git a/.gitignore b/.gitignore index f386f3d..bd0f0f8 100644 --- a/.gitignore +++ b/.gitignore @@ -16,5 +16,8 @@ coverage/ .pytest_cache/ test.json +# Docs +_build_docs/ + # Other .vscode diff --git a/README.md b/README.md index e68a331..abc50e1 100644 --- a/README.md +++ b/README.md @@ -118,3 +118,17 @@ To launch **pylint**: ```sh pylint --output-format=text --rcfile=setup.cfg src/ test/ *.py ``` + +## Documentation + +Install these dependencies for **linting**: + +```sh +pip3 install -r lint-requirements.txt +``` + +To generate the documentation: + +```sh +sphinx-build -M html docs/ _build_docs/ +``` diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index d4bb2cb..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/PyCTBN.tests.estimators.rst b/docs/PyCTBN.tests.estimators.rst deleted file mode 100644 index b3ae86b..0000000 --- a/docs/PyCTBN.tests.estimators.rst +++ /dev/null @@ -1,45 +0,0 @@ -PyCTBN.tests.estimators package -=============================== - -Submodules ----------- - -PyCTBN.tests.estimators.test\_parameters\_estimator module ----------------------------------------------------------- - -.. automodule:: PyCTBN.tests.estimators.test_parameters_estimator - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.estimators.test\_structure\_constraint\_based\_estimator module ----------------------------------------------------------------------------- - -.. automodule:: PyCTBN.tests.estimators.test_structure_constraint_based_estimator - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.estimators.test\_structure\_estimator module ---------------------------------------------------------- - -.. automodule:: PyCTBN.tests.estimators.test_structure_estimator - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.estimators.test\_structure\_score\_based\_estimator module ------------------------------------------------------------------------ - -.. automodule:: PyCTBN.tests.estimators.test_structure_score_based_estimator - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: PyCTBN.tests.estimators - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/PyCTBN.tests.optimizers.rst b/docs/PyCTBN.tests.optimizers.rst deleted file mode 100644 index 0df8f6c..0000000 --- a/docs/PyCTBN.tests.optimizers.rst +++ /dev/null @@ -1,29 +0,0 @@ -PyCTBN.tests.optimizers package -=============================== - -Submodules ----------- - -PyCTBN.tests.optimizers.test\_hill\_climbing\_search module ------------------------------------------------------------ - -.. automodule:: PyCTBN.tests.optimizers.test_hill_climbing_search - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.optimizers.test\_tabu\_search module -------------------------------------------------- - -.. automodule:: PyCTBN.tests.optimizers.test_tabu_search - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: PyCTBN.tests.optimizers - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/doctrees/PyCTBN.PyCTBN.doctree b/docs/_build/doctrees/PyCTBN.PyCTBN.doctree deleted file mode 100644 index 6ba6774aa70997147fde2dd43a18d0553b2717d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3707 zcmcIn-D_jV75Au2Y8+;*hlzLLR~fO6fkDh_>0bPhl9{JJL*j@6647 z*is;nKoT}EZ=OIPFM<3u`LFt$`=yU%Tl!Fgu;$E}ne*{GzjO3;=f`5OQ~vp(DY%e} z5lvI6Qf7ibNLAu;CT+M2?|l=#3Kzbo>8(*tCoK3KXe3-@sb(^K9{eDxTalSjeSY7t z#0n+b70dl0Q!3`*diM8I<@aY zX(66?=(`1lO*ZgT-y^LPeAjnt+b4c66Ox6An^J#Bt<_@cEPReW?uyhzfA*7%8UrD| zcO=cLZwIL>R*NZ&)NB@YoZq)}9=8G?^2hv`KjFLl%s(4*m9w#SQZhZhRr-2ddD#4e zf#y;`-c zJ^bZwBffvY=N)|B#pgZv!rw1_xUAIqQy9{LAw6VV<%M!GUCUgRRK9}%sKjcvp4EEq zbr12!zQ2)ngdLgFq73%M#Q$z%cf^bpIkifg@O^k?R~6V5U$T1lZ1b$K+9lR$M&_Cp zyu4r&bE61fVVBrq{#eK)b19pNtTKlGm4C+n&i~2$K~5JbD=ZIJdw>bWvp_jOHP6&E z{NTG>q$!Hx2j8zRX$1$;G?R@!R z9qr3oxKl74=ynSKh;wTxM9Nv4a(`sjkV6{;Y>U?bakv6?3yA-K%;Bdhbs0NPl(cZG zMdvH>6+#zy;pTrss98hk2@tyDJ3^*x@hUuD2f+=%`MrV)4U)-A<3BmyfKc#nRPxJB zG4D=npfO|L!h_l*|Kh(DesxJh1B3`EEFq&}`7BZbia^fK)ojZIRN}q$JYMiSKdh~4 zL(STB)?2GA(DfSMPAMX|hLA_aGO<&6+5D>sd4-i)0TxHSma$)XVs|Y`;Ir5BPD{}I zX^iGQKS-R8R8CsrK5irxf%^l)tVN{IuTI+rG}9&M(%`%QpqWGcHXV!)C%!jlpyJ3P zsM%ghLHw5H1r|ruGX!^EV|iFFozAf8quxj){J4wfIxgZS(4$@5k7 z?>RfW{P@xce1EdJNto736HaBCfqIZQ_?Fn;ZCu>4?6Y_HA|FE3AmeqBxDlX%*1z5H#7K% zaEO!?=;vY)c-If8vx=-l{=NXB`l-tc(xMJgEd>HBrzOqeg~L*U&`J|?zY-OOxm1xw z9`SU-7KJhlWxqOELL{-|Mi^1yb4XHQ=roIt)K=~{)xe+nV>pAJC~4h-`n4Kq+LnJa ze#0Y%>8OMB#@kZl`v?uET>_t{v7`VSIR^?ebW$5WJ$cs;3RVyV1zk%fWx$T3WJ+Os ztPFq7tu4&6@%Z-k7F=Mtk|U+(QvC*IUMVHgrpl<5+0amFledz55~UK5s6kr52(nw7)p zOTWwHO`K%?LB$RzM}P}mPyp_hSgPj?Y=bHG6b}I`7Gn;8fYBxny#B$4w3=-p#%;59 z(Tzocu^96GD6GC;@L%~ayx=+ing8T`FYef7fvCl~^4AG3Cj94#<8R01FPMmPj3Ymx zLEd4K>{f=Yn7RIO&`v1)uI)5U&q8xI=yl;Gy2HPY@9pehzW)EU*`}Afsq_7HD3x*O zCjvYh1BuvFlE@d0UKQ|lNu`H00DAdUWi2{O)i<_;t#)tY#$NMkdFa8${os9VW21Sr zeOJAMi4$y=V0;H?gFi}CmH{I00qt!6c`d&~_Pz^$Lq+0e6lxqld<=-Rdaxz64e?Pc aF2Q$HPray?dBoje8hN*-s5lF_>FD266p>Q^ diff --git a/docs/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree b/docs/_build/doctrees/PyCTBN.PyCTBN.estimators.doctree deleted file mode 100644 index 3d2f9915cec65a4f8baaef5172f7bcad9bac1b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272060 zcmeEv37p+kb$cl^L}?f z=X>rw_ndR@y?N;?7cE-62>+KI*qW`?XLgQOCMISY6V=vywql|&-kGk>wCC@bU;D@N zH_i`dE1Q)atwyIgUY*YtL5}fSeQKgvoteLOK05%jx9d}_QC@y|t2*AUH)dq<+S1yx z+VX4XhifadrR{oqs;VSq$)$4}H=nabw0wd>QBcB9!!W-H^@Rkl^m26DoP%FH1RD`Ps<2b9st%Jem3 zt?@>)dd=8)Woo=Lg#bzz0mS%&#TT*SiyXxzt+HSZp$-hzo?ec`=P4v!0gPUhEv?T? zRCg+J!$iusXjha~OyB`rOJLp~x3Dz~DFf7K3aVBZLr4@ly&KkbJQA;y8)PR_>gh z+R%cf0;s-Xwpndeo7<~2SG^EwxtZ0n2cQn7ULf0kjBKzL^ZeQnQslzL(3R(6?-gc`H)h(Z zvL#k?)RtC)?o!#-tjyL_EUY=F0-DH%WCOLgVM}9c3L4iIE_-XTO9$$g3|D&pI2n8c&9P}R+gZb<*-+Va_nk?p-uGDAdYv0V4!>{(- zEKD7ociAfVQr$T_RUfan=WnG9J1Wf?_;V#JHA18K5O$PNXTEkXRobpJw^iHonIHhN z{R^P+?Fs80f}*okkqU?A_X&XTuQ`N2$|3wou}Egmcv_{Ev}@I*U1?p1>#$J6a9PIh zLf$d0lHg7u**ceWaJ_`z=TzpZt$Jl9Atf%E?98wo1P9du)h@*&-4`}PwZU{T{zHm- zj4lim*;BYH7}k|mQ|n~U2565>3f*vcZ8GeWF!ypKxS#7;$#k_{YfON0v#HmrMzzkt z^sB0!H1gUIS9NX>fMr_UaP21XA-mS@qh9gwczqfs-I>nx?A&Oj*{sa11GIO>c6K%- zlT(dKJ2@jcVf4gxNo8ubR?$A6DDVyQqtkj|3tusXnk(B->p#e&ClA+U#2y`CR>~sbz;ZV$um70K1jT;Qsjnp>x&|d$s(X%%cFNVH7eJ22$fXo z3eR*3xyaWZ&{k@#xxn(yR`S7g68d23AL+&LG0ZCevdYCY-GGA|Oi!iy)6?J|L7MCk z#|*>pr;~RX%O@Bve(FTL9oz9PZ^5D5#`<=-+P46{UKeiZIgo4-jRTCe1Zc1ThAC?I zbqXw{IoJm+o~qO1okoRmph|Z_v0QUBK*bx1fYUpmno@8IQ-

RrnYX?1328_o7uYr4{GU*BnL*EcsAw>qFGKS5 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 diff --git a/docs/_build/doctrees/PyCTBN.PyCTBN.optimizers.doctree b/docs/_build/doctrees/PyCTBN.PyCTBN.optimizers.doctree deleted file mode 100644 index fc9270a39a3eb097be9d6bf7952ffd58d6d1e71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60965 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 diff --git a/docs/_build/doctrees/PyCTBN.PyCTBN.structure_graph.doctree b/docs/_build/doctrees/PyCTBN.PyCTBN.structure_graph.doctree deleted file mode 100644 index ff37c2f4eb77606310a7777d34838e7d2279fe07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256188 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 z 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 diff --git a/docs/_build/doctrees/PyCTBN.tests.doctree b/docs/_build/doctrees/PyCTBN.tests.doctree deleted file mode 100644 index a108437136f1ce7516764208a8947dce5cbd990a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3691 zcmcIn-D@ky75BZiWXqN%`+lSk*G?Tmh(oWWQ2NlOP)hHkiD;9weG1dj?npEB?#y;R zY^hLap(!^oZ=OORFM<3u{jd6)-PLNP%WdgH4Z@mp&dmAxoe%xB^UpsF_R2p$GzAxO zIi_hURmx28N2y9&&ZG?w;iJEWzl3Yw)AZgbrxOXIeg(wg4gD==J+VK{t zuR>`b6g>6ag2Eyj__^}ybdblrA6TLZ1GHMKn z_}-B;uf83nuGk!Auu-#llyUyh(nVwiKIAWWpI`8Oe(8TU;VNen?WAOSa2S{eO%cz|a(uGka&R@ci4h-ob-6}7XlW8k$RYv(9{8x$9tew)D z_clfRh3~g>j-VrNT9l!_p86lOnPZ?r^1-b#JMW$xq zYv1J}O;HSA`_uZ7hHxZZK4Y4t;bzYtm)JK-W-G`Zqoy`~$LPP}mu1usk+fg#rpgcN zK#%U>O~G`ayV?5%?zOUqY_lfY{=~FEL)XdQCAY9}yn%Crh5rD`;ioEf8M{i9v~a5d z<{R`4IG50H_rHPDw7_`=aPIkzkSSZfiOjd5ZwqYxprAsdyX2+uKfh`NDEOxpd9+34 z-Kh;U=IigUzc$E!_TLJ=dSg;{xd|ac3QNeiSbY*Z0njfOS8Bek9|icRox^MX;D@zI zO_*7e%9^#w0Bx7{ZaNXY7CN34tHjRas5Ec1Zo(Uw)cl<${f2`5R(jCH-rj7Qrp#Z) zNIvp|#Oc_+Nz<(RYf9C${gGkTB21W2=gr8O>k@8h@ZI0h%%O7EGm8(WzPDg#zp;6s zT6-yt-qF0k;iOVS@b)c^$MwD$82Tn@9dM&O6jO zSr7g+W9m~SaV}HzP z)*L(joGpPLcw?Pe3w3-aWiz*cy1_lw60w4WW;6$-XEjY&bSk{|10f4%36qIRAr*Yj z+4<_9lsMv(!J*(!Gb$GjD+9uv;`|tm*gw@QQ932)+6?VMCULk-eHT?ThmQz{ zNJ)ViE|!6J{eU{F$cE$}3n1z=b$LM=)FG-RL7=~BNwfIiu%sZg(!|_vNQGf8Rb-h* zJe{#+p$tRKZ*GF~PfzR_;Qh<$I0EHPQs12W_U z!(VZ03-ifja({o1)@8YpW2G09l-*4rX(quxk2gv~aD!NuBTW`*IRbt3!N)&ATnBod z?5K&9jhc(K8mko6O2O>BRKsnaK}FBf844(k^Z3YL0**OpDzh=47<4g)IeTVS($Xd2 zV!<q17hfFB48tJxE?vYKU zzt7}d++O`r)g4fd02k(;0NgFHR4*914K~+vC<0h4790QpOHEvI{gW+fwanZML&Y!k{R7T-6 z5$LipjEGD{iQQr?SB1MxspOCZ056}Ztifg}`fP{TNcXm0?5(wym!53BkFKw695c^% z->Ny-G||fvZ0vw+@F$7NG5`cVV3-}gs_75N-B;l=)FXa4p~CS~$DoZ?3Y(U;MLucB aCG<|}Z5Oq&h^RYGW7n-4RNMsIZ2WIXc$6am diff --git a/docs/_build/doctrees/PyCTBN.tests.estimators.doctree b/docs/_build/doctrees/PyCTBN.tests.estimators.doctree deleted file mode 100644 index 0616973dfb38868deb33f7b38092a26be979dd05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51965 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 JKyt$}_kSq@W2pcD diff --git a/docs/_build/doctrees/PyCTBN.tests.optimizers.doctree b/docs/_build/doctrees/PyCTBN.tests.optimizers.doctree deleted file mode 100644 index 299905efea22b616582b47c726de32a548069d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18517 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 diff --git a/docs/_build/doctrees/PyCTBN.tests.utility.doctree b/docs/_build/doctrees/PyCTBN.tests.utility.doctree deleted file mode 100644 index c8f358ba7687e93d612a7bb1458acf2fb5c92a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45630 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 N1H&{C(QtH}`+u}@7fApB diff --git a/docs/_build/doctrees/basic_main.doctree b/docs/_build/doctrees/basic_main.doctree deleted file mode 100644 index bf49862c0e4ed141ae4757196b35fcb4aa2862fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 zcmZuz-D_Jn6i<`bjuXd8+I25Wwo>-djX5rKu+hi$G0con27?tLU&)q;u5>5q#?C`w zdnmM^w`%|Ie!5?Y%>p4;N9Xf*e&;BE_x^o3+^K%Ti7SNE>r2X*HjKL%4w%WxoNFIH z#&7?LZ{xEtv~=Z6X)_+f4m2_$6|-E&H!+Npx|hmbHueL@GcS$q%tcT1#o$d8!_f26 zD}L`LJe*S}vp-2rrGAndR^qx*-ha*4DTzjBXG7;*tWp!b|Md|11x0>7inA~zT|r_m z^qV?nVP8qjzIy%hto?%o-NclBT7gm3d1)Q8 z|Ke&F`H3e;N<2jpXO+Svfi-EsqT)+H`*nA@ff5zZaQPil6W@zNq_kJ3BqrOgTQ99a z2b7p3+XrEsl{P_2Isiwlqy{n^IPSgFOK|9{BgMiR?YU+#^na(S1cEKA#K|lSmmH8# zZ*0VYQ8d8Qyujh84nyGk8pp%tSXzbCu{Rk>z^7Y;>me_D3!*HH@!EKP@AB$FI8Kbz zWlq)$WAg~f*rDGA$xNPz?%?vXTEZ2tBxEJMAZ_~*u`y`)FbgBg3u8S|{D!M|wHpov zRo$@{&iGmaD^GptTBTm-F+MMs2sd6)tAQ0XET=gnLvLxuQ&I7K7)xE0o^YKR2CW!| zrC&^bnmCE?^UX`btu>Yis+r;zIHy!IAHxY4wdti-d5Pg->t@S^_#=#Kr*{dorsta% zTbAK872tr906q!@#c-^sUY2yp0XM^W7keW-vOF`E5ylIU17ReXF$?|7=mly79Fma& zb0ybN^uw5z-jF*{*p*<^F)QUS*t6l2-ov3iUWQMHs#HUlf zE{x;kzGX#`%#$1GWX;bL!la{fl?rLH9JJFQCSinP9QaSG5-e0Qmp=Y-`b`)YydVIDV-T|nuu+m=DR7b|BRmn_ z7w+YBx>~I+i(4;@zBG0@W&CCeO*f6TVayq zF3fow#v6mhFS%b-VT8{WLJU2fV}O_!@#-L4fQ~uoCbLVQxFYf6LpXJ}+S4@=aw!yk zLEU|266;4Ur1kHL z2XMz^QZK-Ob|*YcTf&v|O}$f|&pE@G-XfOZ+{4@BOc{DjIM%QtcsMPu9*Os1kL#QC zqJ)EbJ763^E~%LW-97QtE;+VM+SLdIvUt3lAOcJ8$6M^L4Qc(xKn!n-?$A#|f#(VG zK@!&A;)Qtb!Y~Q^Z2_>}M)6|i#8dozE=DdK-)}%=eVj>brxYF@Ye|~2R&GtrTWR1u+tuHcpSD-E2D=S{;@5sPwV;dwy)-9Cmdo2WTs3L9>Y;)lmf7* z0gu4oRU`k1;@`#Jz+?OqfXTqK?XZ68fZZzC5Fd5os%1w~XR2hFK(kEUI%H{EHG`dA I&~kqHALUlGkpKVy diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle deleted file mode 100644 index 314ec31469f476f73f7dc270699c6c1a560c4ba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162647 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 w9X!VFM`vJLJB*(uU^faj#0Qo9)XV%`c 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 diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree deleted file mode 100644 index ae88b93ee58ab0584179608282cd9ec080ce7516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4946 zcmds5?TZ{q8Q)|xJ1_gbF*%M)uyfp*&6(LraygLwA{s$txlxXAhf3(wbk|JPZg*E- zRrSuy2jN5_St(RVA9#M&f5E>%L^$xXpYM+l5d?o#-96JYYc_ZI&A@D?s-CK+>iPYi zxA~;;>G!X$xPN9_rHm(&0}_Ub2&u|VD-=N%(?sVl@;g7zf0pl?wj^UEG8xd^tUw}Q zJPIXE@+Vl_vhtco>YzNJ8HjjcKWmuJe>8pc_`7|tI-6)N5-%o7Q|S$PMDKcmq(sxu z8%#UJow^@qJUCIBNbN!RBdonor02cs-G6xa-o3+z54{KX9^60Z{8(gOKoXCHB-Nf~ zT)87X+#`*srqR^X!kgj&Uc^s$GP>&xGVO8gDJHTg^oaH%io0|Ik!ZpboIyP)g!Z0l z5ok&2Q!nI_2AZGJgPb*=DtijgIT1tSj&e=vbAf`jKmK>G? zODro^d8ohu(+nb_6ejV#k&w9f)(W$9J{XYTMAD&?X;0$lP^HAOsg+8qs63^4W}2Fe z?2epu*mbsQ+J42B9HX_0fDd|1#Iz@~B%!i57V@N5kgNI+yHr`ot6X0O4t>~#?A4Sa6m^L2b~J;^inHtRwBZXwS0*`1@N zdrr&pTx3aDyL9m$wgRIT1U|p^GDYmVX*kOPS%5FO!*joHHjBp}6#wPF%=@NAC&c=g z!ibs;o&-@AQtQta>3#MAdrVC$CXIa#**w-@aWoahWEb8B4CqpL+Xod$Z4bXB)vu8VUxumsb*SqfV&6~gDa zMCy>g1J$cbkbkoX%X8M=t0v6e50a1vRCy!`JxvA{2p6t)|LfA6iDT%=z8Vu{?OInI z6W0e>gn;Wu96ncNkNGv*rfpYzu4!CbHrs~?4Tn!hG;zFpS_RlP!Veh%6jqaF#=U37 zY@`%#O-B9%yUz=>%^FXf*Vism?A@I&z#1&@`B z%kOZ`r^_U(3z;?S13_~3Lu6L_HAc?K*&j_4BRx$K7gz1kW*vX&B#n5$HF$29$3!Oi zbGHwPaYPZ@=8v&le^GM%8m{r%i>_gXe_a#))vJV`Y(~5i!&m?kMBNg@ z-&E`DFAlY`pa3O`@n=ixK&Coj37NlLfDHS?mjdPUiyrtgQ2zeqL1BNY-M$XRbr|li z7b&kpVTJ$vD&Y&E*eu*hQ6d9&4v2p)0a1+SKosL$p9`l8 znPm^IWP^DZ!Ms}r^LZ+%R_meu!qkBnebLp*`ikva6I?P|K_+eS=a=(+vr)~ssEXvT zsMZL;=oxlxzH>dmP`a#+2)Xtli87?0S@`YsO&f8SN}`2C@z4%Y@1wkrQw-J%HAo%F z35K0=n8^sEO=M`_mXLN8>KZoNPjj<3M2(&ZO>2usm&~TE?@%uIlcA7tj+rfmIwtkY z#zf)BH;Ne=QQN90f6O)Wt3nnU%ME2^i^ofv3W?N4Pid4NT{ay?qS>%vcIkw}R+{Kc zRYDEZ2_fC8$U-Vjxs&$eygiEzTa3} z^r@6W`V6FqP^`dF@wNbYU>h~>;wcSxN^Wj0tt=gJ{8Q^%TgAEaJ5;-GEG{fHXl?T?8Vt!Qto9p%)l%U74 zRWA^>r-gug9YyPG2#W4nuL5(D5r`P^7#aWlo!e$BrKxYr0Qe$80d9`ECk5Yeck3L+ zV_K)`u-6-p#|P%iIJbV}ItHv+Mgs*LP-i)D(^O#AkfO zB79tjCM@wcRE&P#|2TtJE12o38y7=A5&qXmZW4>u8i|_kPu;}CY)MeeSpTc!iU-tZ3ORKAfHEG4Xoj{E{o2yxOuD^rV!P7nHtj8(?|%2OvHRNc zS>+14KtzWCjW0-mS~(EtJzQUp4AFd4&cA@wp5-5a;b4!aPS|_8DeAr diff --git a/docs/_build/doctrees/modules.doctree b/docs/_build/doctrees/modules.doctree deleted file mode 100644 index 7725a085ef91df92268d09ffef3f7c7a23b47a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2662 zcmZ8jOK%%D5O!?qX-R&h=_Pg_D1ta>Y!yWgMNdW2n^B=Cf*w*B3u;M;gt_FF*~$h*OL%6ps@dzEu-f~{vnhxz{q3Y&I!D_z>j?|X~N`tzFkK*@%vIJ z7AD1%_&#yYh-u-FRm@^fP#Yueq>@+*A>LbxWYt@j7Ww^RO41v{W>Kf`9Y^MIEAT`9 zln?kR-{WWg)tKvyjZL8xGvkFeH{&Xm^&bMX7rJocOw&R#duc2}|Ke)5m?F_`socwXRn>N~X`WC)OqDDyg>G)Vp%CfHe$ zEJp?6qGg#Ya=bD>5Gs`gWix?5k@PwLiNEGQGvCd~lCs?KaJ3KQNM4o}IM1b?hCAQp zf>JQy&JSx7ji9TFY|0Fy;cCbC%fef&jQObP5i*HTpO22cFSbA+Vy=- zWV3AfW408)$`M!CwNlHsD4P~@xEn2qQNRishLH@Co--t6F{$v;kA%t#moSxT3a#LK zg_~XcaA5`BPq#M{W{froCyGi?2Zcj!sSExP&ADx*Ray!D?7_|h6Z{`Ps*K(Tus(Xa zz473rKZ*%hpu~ZXL_)z2B~kN&%o*UOSnr~p{A0sXZD@kt13BO(wljJ;)oO+u0f(ST zju9o6fw%pL6iz4iBEKuZs39$~JZV@5R7-&X;fx|O8ayl|fL7U9`+HGtSwVHO%p#wT z*fQ6aC7UNpili>N6;@RIJWQytWGZ7Kb(EcTH}IE!fMhKAPwEjetkshB(D9$gH#o7( zL>-hjTBE4<0R~311V4{sOMy0O4i-w02^W4jdhSO#%M*ZtsiV>outAhe31W|(;lJX} z<@U$%c(GVq<}1gwy3}SqrtEeMO*;<$Njy;of)j~j7?)@}+C7hl#O9G7cmBw(lq1W8i#eBg zK;3<*BkKn?Bj~X|3$(NaOpnWTwM?W=Nj1&=S;`5z2W78X4H%aI;`9w}fV=V*FDG<8 z0x-@op@f=&0qdD?5~qYMrrUZ)3`3rxO;_;68FR4qB$b-nBrGFBCit>2th{eO`aPy@ zmQA&6YFes(_CVNZ_qHtd)?Uj)CtLP0Escxg`N>0D^$zY?%zzZ16)1J^2dS14 zz#<1+0-ZOt{1cM@5Pk!X@jZpkz!#9k_^BK=qhL#X(1^>D9n^O{I5v;f>eD!_>c);Y IXfeI~A9m3ptN;K2 diff --git a/docs/_build/doctrees/setup.doctree b/docs/_build/doctrees/setup.doctree deleted file mode 100644 index 785f8caf1c333792f3dab19b4d49adda7e1a42f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2327 zcmZ8iO>Y}F5KZhzvTRwllcty0ZGs|5gW6UR^icHJ9E}P^5fr@y1hu3@!d!C84@*7- zXb%ArfVZ&!w~xE4wIu_Fmc#ktn>RE6^!^(SAJl*G$W=n>)g@(28^&FVd(0G}Gi+qL;5}rEnPYjY{64}0F6RO#Vpt9eTw6(?xk{45BgcKHo|lFNT(oMB-tkoqzjgaD)#b;e-;PJrxpk2vaPJU1*>Kugl?rB;!UwbT6cZV4*t}UNuoe&3}F7j0pN8*_n ziBqvF&f=SiFeRVZpf$IXrLotO-*4Z(`*phhL4xkW1V5=?dubgK|K@53sfllqk9dLj z4H6eE5>$K##9nstH9}Opg8Vgd5kH81me_Do8sfSFHhogE!<(6n7*T zb;v?lk&bmhwH8Pa&T6W%!=qXPXtm3=zY|rC2WH5s%zQfLtI9Y|?pxLrDLlE6PB#2J zB1}3uQ~4onmVv0Ckv}$B7RWm8R&R+=PxXn5!Z}!Ge?*oj??g)OK z@EP1Oh17E}U_BEa=PBXB zY*X);mov`LrniVCIQQ`Ov`~g#6JAoO2v(ux^;Y;4ce%dFDicrVeU_(H+t_)7hS}x+ERdrX diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo deleted file mode 100644 index 4fdfc94..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: 3f0152b696cb3a36d5c6900a5a35540e -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/PyCTBN.PyCTBN.estimators.html b/docs/_build/html/PyCTBN.PyCTBN.estimators.html deleted file mode 100644 index abc5b0a..0000000 --- a/docs/_build/html/PyCTBN.PyCTBN.estimators.html +++ /dev/null @@ -1,855 +0,0 @@ - - - - - - - - - - - pyctbn.legacy.estimators package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

pyctbn.legacy.estimators package

-
-

Submodules

-
-
-

pyctbn.legacy.estimators.fam_score_calculator module

-
-
-class pyctbn.legacy.estimators.fam_score_calculator.FamScoreCalculator
-

Bases: object

-

Has the task of calculating the FamScore of a node by using a Bayesian score function

-
-
-get_fam_score(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)
-

Calculate the FamScore value of the node

-
-
Parameters
-
    -
  • cims (np.array) – np.array with all the node’s cims

  • -
  • tau_xu (float, optional) – hyperparameter over the CTBN’s q parameters, default to 0.1

  • -
  • alpha_xu (float, optional) – hyperparameter over the CTBN’s q parameters, default to 1

  • -
-
-
Returns
-

the FamScore value of the node

-
-
Return type
-

float

-
-
-
- -
-
-marginal_likelihood_q(cims: numpy.array, tau_xu: float = 0.1, alpha_xu: float = 1)
-

Calculate the value of the marginal likelihood over q of the node identified by the label node_id

-
-
Parameters
-
    -
  • cims (np.array) – np.array with all the node’s cims

  • -
  • tau_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over q

-
-
Return type
-

float

-
-
-
- -
-
-marginal_likelihood_theta(cims: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)
-

Calculate the FamScore value of the node identified by the label node_id

-
-
Parameters
-
    -
  • cims (np.array) – np.array with all the node’s cims

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters, default to 0.1

  • -
  • alpha_xxu (float) – distribuited hyperparameter over the CTBN’s theta parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over theta

-
-
Return type
-

float

-
-
-
- -
-
-single_cim_xu_marginal_likelihood_q(M_xu_suff_stats: float, T_xu_suff_stats: float, tau_xu: float = 0.1, alpha_xu: float = 1)
-

Calculate the marginal likelihood on q of the node when assumes a specif value -and a specif parents’s assignment

-
-
Parameters
-
    -
  • M_xu_suff_stats – value of the suffucient statistic M[x|u]

  • -
  • T_xu_suff_stats (float) – value of the suffucient statistic T[x|u]

  • -
  • cim (class:'ConditionalIntensityMatrix') – A conditional_intensity_matrix object with the sufficient statistics

  • -
  • tau_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
-
-
Returns
-

the value of the marginal likelihood of the node when assumes a specif value

-
-
Return type
-

float

-
-
-
- -
-
-single_cim_xu_marginal_likelihood_theta(index: int, cim: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)
-

Calculate the marginal likelihood on q of the node when assumes a specif value -and a specif parents’s assignment

-
-
Parameters
-
    -
  • cim (class:'ConditionalIntensityMatrix') – A conditional_intensity_matrix object with the sufficient statistics

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
  • alpha_xxu (float) – distribuited hyperparameter over the CTBN’s theta parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over theta when the node assumes a specif value

-
-
Return type
-

float

-
-
-
- -
-
-single_internal_cim_xxu_marginal_likelihood_theta(M_xxu_suff_stats: float, alpha_xxu: float = 1)
-

Calculate the second part of the marginal likelihood over theta formula

-
-
Parameters
-
    -
  • M_xxu_suff_stats (float) – value of the suffucient statistic M[xx’|u]

  • -
  • alpha_xxu (float) – distribuited hyperparameter over the CTBN’s theta parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over theta when the node assumes a specif value

-
-
Return type
-

float

-
-
-
- -
-
-variable_cim_xu_marginal_likelihood_q(cim: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, tau_xu: float = 0.1, alpha_xu: float = 1)
-

Calculate the value of the marginal likelihood over q given a cim

-
-
Parameters
-
    -
  • cim (class:'ConditionalIntensityMatrix') – A conditional_intensity_matrix object with the sufficient statistics

  • -
  • tau_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over q

-
-
Return type
-

float

-
-
-
- -
-
-variable_cim_xu_marginal_likelihood_theta(cim: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, alpha_xu: float, alpha_xxu: float)
-

Calculate the value of the marginal likelihood over theta given a cim

-
-
Parameters
-
    -
  • cim (class:'ConditionalIntensityMatrix') – A conditional_intensity_matrix object with the sufficient statistics

  • -
  • alpha_xu (float) – hyperparameter over the CTBN’s q parameters, default to 0.1

  • -
  • alpha_xxu (float) – distribuited hyperparameter over the CTBN’s theta parameters

  • -
-
-
Returns
-

the value of the marginal likelihood over theta

-
-
Return type
-

float

-
-
-
- -
- -
-
-

pyctbn.legacy.estimators.parameters_estimator module

-
-
-class pyctbn.legacy.estimators.parameters_estimator.ParametersEstimator(trajectories: pyctbn.legacy.structure_graph.trajectory.Trajectory, net_graph: pyctbn.legacy.structure_graph.network_graph.NetworkGraph)
-

Bases: object

-

Has the task of computing the cims of particular node given the trajectories and the net structure -in the graph _net_graph.

-
-
Parameters
-
-
-
_single_set_of_cims
-

the set of cims object that will hold the cims of the node

-
-
-
-
-compute_parameters_for_node(node_id: str)pyctbn.legacy.structure_graph.set_of_cims.SetOfCims
-

Compute the CIMS of the node identified by the label node_id.

-
-
Parameters
-

node_id (string) – the node label

-
-
Returns
-

A SetOfCims object filled with the computed CIMS

-
-
Return type
-

SetOfCims

-
-
-
- -
-
-static compute_state_res_time_for_node(times: numpy.ndarray, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexes_struct: numpy.ndarray, T: numpy.ndarray) → None
-

Compute the state residence times for a node and fill the matrix T with the results

-
-
Parameters
-
    -
  • node_indx (int) – the index of the node

  • -
  • times (numpy.array) – the times deltas vector

  • -
  • trajectory (numpy.ndArray) – the trajectory

  • -
  • cols_filter (numpy.array) – the columns filtering structure

  • -
  • scalar_indexes_struct (numpy.array) – the indexing structure

  • -
  • T (numpy.ndArray) – the state residence times vectors

  • -
-
-
-
- -
-
-static compute_state_transitions_for_a_node(node_indx: int, trajectory: numpy.ndarray, cols_filter: numpy.ndarray, scalar_indexing: numpy.ndarray, M: numpy.ndarray) → None
-

Compute the state residence times for a node and fill the matrices M with the results.

-
-
Parameters
-
    -
  • node_indx (int) – the index of the node

  • -
  • trajectory (numpy.ndArray) – the trajectory

  • -
  • cols_filter (numpy.array) – the columns filtering structure

  • -
  • scalar_indexing (numpy.array) – the indexing structure

  • -
  • M (numpy.ndArray) – the state transitions matrices

  • -
-
-
-
- -
-
-fast_init(node_id: str) → None
-

Initializes all the necessary structures for the parameters estimation for the node node_id.

-
-
Parameters
-

node_id (string) – the node label

-
-
-
- -
- -
-
-

pyctbn.legacy.estimators.structure_constraint_based_estimator module

-
-
-class pyctbn.legacy.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator(sample_path: pyctbn.legacy.structure_graph.sample_path.SamplePath, exp_test_alfa: float, chi_test_alfa: float, known_edges: List = [], thumb_threshold: int = 25)
-

Bases: pyctbn.legacy.estimators.structure_estimator.StructureEstimator

-

Has the task of estimating the network structure given the trajectories in samplepath by using a constraint-based approach.

-
-
Parameters
-
    -
  • sample_path (SamplePath) – the _sample_path object containing the trajectories and the real structure

  • -
  • exp_test_alfa (float) – the significance level for the exponential Hp test

  • -
  • chi_test_alfa (float) – the significance level for the chi Hp test

  • -
  • known_edges (List) – the prior known edges in the net structure if present

  • -
  • thumb_threshold (int) – the threshold value to consider a valid independence test

  • -
-
-
_nodes
-

the nodes labels

-
-
_nodes_vals
-

the nodes cardinalities

-
-
_nodes_indxs
-

the nodes indexes

-
-
_complete_graph
-

the complete directed graph built using the nodes labels in _nodes

-
-
_cache
-

the Cache object

-
-
-
-
-complete_test(test_parent: str, test_child: str, parent_set: List, child_states_numb: int, tot_vars_count: int, parent_indx, child_indx) → bool
-

Performs a complete independence test on the directed graphs G1 = {test_child U parent_set} -G2 = {G1 U test_parent} (added as an additional parent of the test_child). -Generates all the necessary structures and datas to perform the tests.

-
-
Parameters
-
    -
  • test_parent (string) – the node label of the test parent

  • -
  • test_child (string) – the node label of the child

  • -
  • parent_set (List) – the common parent set

  • -
  • child_states_numb (int) – the cardinality of the test_child

  • -
  • tot_vars_count (int) – the total number of variables in the net

  • -
-
-
Returns
-

True iff test_child and test_parent are independent given the sep_set parent_set. False otherwise

-
-
Return type
-

bool

-
-
-
- -
-
-compute_thumb_value(parent_val, child_val, parent_set_vals)
-

Compute the value to test against the thumb_threshold.

-
-
Parameters
-
    -
  • parent_val (int) – test parent’s variable cardinality

  • -
  • child_val (int) – test child’s variable cardinality

  • -
  • parent_set_vals (List) – the cardinalities of the nodes in the current sep-set

  • -
-
-
Returns
-

the thumb value for the current independence test

-
-
Return type
-

int

-
-
-
- -
-
-ctpc_algorithm(disable_multiprocessing: bool = False, processes_number: int = None)
-

Compute the CTPC algorithm over the entire net.

-
-
Parameters
-
    -
  • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

  • -
  • processes_number – if disable_multiprocessing is false indicates

  • -
-
-
-

the maximum number of process; if None it will be automatically set, default to None -:type processes_number: int, optional

-
- -
-
-estimate_structure(disable_multiprocessing: bool = False, processes_number: int = None)
-

Compute the constraint-based algorithm to find the optimal structure

-
-
Parameters
-
    -
  • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

  • -
  • processes_number – if disable_multiprocessing is false indicates

  • -
-
-
-

the maximum number of process; if None it will be automatically set, default to None -:type processes_number: int, optional

-
- -
-
-independence_test(child_states_numb: int, cim1: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, cim2: pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix, thumb_value: float, parent_indx, child_indx) → bool
-

Compute the actual independence test using two cims. -It is performed first the exponential test and if the null hypothesis is not rejected, -it is performed also the chi_test.

-
-
Parameters
-
-
-
Returns
-

True iff both tests do NOT reject the null hypothesis of independence. False otherwise.

-
-
Return type
-

bool

-
-
-
- -
-
-one_iteration_of_CTPC_algorithm(var_id: str, tot_vars_count: int) → List
-

Performs an iteration of the CTPC algorithm using the node var_id as test_child.

-
-
Parameters
-

var_id (string) – the node label of the test child

-
-
-
- -
- -
-
-

pyctbn.legacy.estimators.structure_estimator module

-
-
-class pyctbn.legacy.estimators.structure_estimator.StructureEstimator(sample_path: pyctbn.legacy.structure_graph.sample_path.SamplePath, known_edges: List = None)
-

Bases: object

-

Has the task of estimating the network structure given the trajectories in samplepath.

-
-
Parameters
-
    -
  • sample_path (SamplePath) – the _sample_path object containing the trajectories and the real structure

  • -
  • known_edges (List) – the prior known edges in the net structure if present

  • -
-
-
_nodes
-

the nodes labels

-
-
_nodes_vals
-

the nodes cardinalities

-
-
_nodes_indxs
-

the nodes indexes

-
-
_complete_graph
-

the complete directed graph built using the nodes labels in _nodes

-
-
-
-
-adjacency_matrix() → numpy.ndarray
-

Converts the estimated structure _complete_graph to a boolean adjacency matrix representation.

-
-
Returns
-

The adjacency matrix of the graph _complete_graph

-
-
Return type
-

numpy.ndArray

-
-
-
- -
-
-static build_complete_graph(node_ids: List) → networkx.classes.digraph.DiGraph
-

Builds a complete directed graph (no self loops) given the nodes labels in the list node_ids:

-
-
Parameters
-

node_ids (List) – the list of nodes labels

-
-
Returns
-

a complete Digraph Object

-
-
Return type
-

networkx.DiGraph

-
-
-
- -
-
-build_removable_edges_matrix(known_edges: List)
-

Builds a boolean matrix who shows if a edge could be removed or not, based on prior knowledge given:

-
-
Parameters
-

known_edges (List) – the list of nodes labels

-
-
Returns
-

a boolean matrix

-
-
Return type
-

np.ndarray

-
-
-
- -
-
-abstract estimate_structure() → List
-

Abstract method to estimate the structure

-
-
Returns
-

List of estimated edges

-
-
Return type
-

Typing.List

-
-
-
- -
-
-static generate_possible_sub_sets_of_size(u: List, size: int, parent_label: str)
-

Creates a list containing all possible subsets of the list u of size size, -that do not contains a the node identified by parent_label.

-
-
Parameters
-
    -
  • u (List) – the list of nodes

  • -
  • size (int) – the size of the subsets

  • -
  • parent_label (string) – the node to exclude in the subsets generation

  • -
-
-
Returns
-

an Iterator Object containing a list of lists

-
-
Return type
-

Iterator

-
-
-
- -
-
-save_plot_estimated_structure_graph(file_path: str) → None
-

Plot the estimated structure in a graphical model style, use .png extension.

-
-
Parameters
-

file_path – path to save the file to

-
-
Type
-

string

-
-
-
- -
-
-save_results(file_path: str) → None
-

Save the estimated Structure to a .json file in file_path.

-
-
Parameters
-

file_path (string) – the path including the file name with .json extension

-
-
-
- -
-
-spurious_edges() → List
-
-
Return the spurious edges present in the estimated structure, if a prior net structure is present in

_sample_path.structure.

-
-
-
-
Returns
-

A list containing the spurious edges

-
-
Return type
-

List

-
-
-
- -
- -
-
-

pyctbn.legacy.estimators.structure_score_based_estimator module

-
-
-class pyctbn.legacy.estimators.structure_score_based_estimator.StructureScoreBasedEstimator(sample_path: pyctbn.legacy.structure_graph.sample_path.SamplePath, tau_xu: int = 0.1, alpha_xu: int = 1, known_edges: List = [])
-

Bases: pyctbn.legacy.estimators.structure_estimator.StructureEstimator

-

Has the task of estimating the network structure given the trajectories in samplepath by -using a score based approach and differt kinds of optimization algorithms.

-
-
Parameters
-
    -
  • sample_path (SamplePath) – the _sample_path object containing the trajectories and the real structure

  • -
  • tau_xu (float, optional) – hyperparameter over the CTBN’s q parameters, default to 0.1

  • -
  • alpha_xu (float, optional) – hyperparameter over the CTBN’s q parameters, default to 1

  • -
  • known_edges (List, optional) – List of known edges, default to []

  • -
-
-
-
-
-estimate_parents(node_id: str, max_parents: int = None, iterations_number: int = 40, patience: int = 10, tabu_length: int = None, tabu_rules_duration: int = 5, optimizer: str = 'hill')
-

Use the FamScore of a node in order to find the best parent nodes

-
-
Parameters
-
    -
  • node_id (string) – current node’s id

  • -
  • max_parents (int, optional) – maximum number of parents for each variable. If None, disabled, default to None

  • -
  • iterations_number (int, optional) – maximum number of optimization algorithm’s iteration, default to 40

  • -
  • patience (int, optional) – number of iteration without any improvement before to stop the search.If None, disabled, default to None

  • -
  • tabu_length (int, optional) – maximum lenght of the data structures used in the optimization process, default to None

  • -
  • tabu_rules_duration (int, optional) – number of iterations in which each rule keeps its value, default to None

  • -
  • optimizer (string, optional) – name of the optimizer algorithm. Possible values: ‘hill’ (Hill climbing),’tabu’ (tabu search), defualt to ‘tabu’

  • -
-
-
Returns
-

A list of the best edges for the currente node

-
-
Return type
-

List

-
-
-
- -
-
-estimate_structure(max_parents: int = None, iterations_number: int = 40, patience: int = None, tabu_length: int = None, tabu_rules_duration: int = None, optimizer: str = 'tabu', disable_multiprocessing: bool = False, processes_number: int = None)
-

Compute the score-based algorithm to find the optimal structure

-
-
Parameters
-
    -
  • max_parents (int, optional) – maximum number of parents for each variable. If None, disabled, default to None

  • -
  • iterations_number (int, optional) – maximum number of optimization algorithm’s iteration, default to 40

  • -
  • patience (int, optional) – number of iteration without any improvement before to stop the search.If None, disabled, default to None

  • -
  • tabu_length (int, optional) – maximum lenght of the data structures used in the optimization process, default to None

  • -
  • tabu_rules_duration (int, optional) – number of iterations in which each rule keeps its value, default to None

  • -
  • optimizer (string, optional) – name of the optimizer algorithm. Possible values: ‘hill’ (Hill climbing),’tabu’ (tabu search), defualt to ‘tabu’

  • -
  • disable_multiprocessing (Boolean, optional) – true if you desire to disable the multiprocessing operations, default to False

  • -
  • processes_number – if disable_multiprocessing is false indicates

  • -
-
-
-

the maximum number of process; if None it will be automatically set, default to None -:type processes_number: int, optional

-
- -
-
-get_score_from_graph(graph: pyctbn.legacy.structure_graph.network_graph.NetworkGraph, node_id: str)
-

Get the FamScore of a node

-
-
Parameters
-
    -
  • node_id (string) – current node’s id

  • -
  • graph (class:'NetworkGraph') – current graph to be computed

  • -
-
-
Returns
-

The FamSCore for this graph structure

-
-
Return type
-

float

-
-
-
- -
- -
-
-

Module contents

-
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.PyCTBN.html b/docs/_build/html/PyCTBN.PyCTBN.html deleted file mode 100644 index 4f020cc..0000000 --- a/docs/_build/html/PyCTBN.PyCTBN.html +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - - - - pyctbn.legacy package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

pyctbn.legacy package

-
-

Subpackages

- -
-
-

Module contents

-
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.PyCTBN.optimizers.html b/docs/_build/html/PyCTBN.PyCTBN.optimizers.html deleted file mode 100644 index 28421ad..0000000 --- a/docs/_build/html/PyCTBN.PyCTBN.optimizers.html +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - - - - - pyctbn.legacy.optimizers package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

pyctbn.legacy.optimizers package

-
-

Submodules

-
-
-

pyctbn.legacy.optimizers.constraint_based_optimizer module

-
-
-class pyctbn.legacy.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer(node_id: str, structure_estimator: pyctbn.legacy.estimators.structure_estimator.StructureEstimator, tot_vars_count: int)
-

Bases: pyctbn.legacy.optimizers.optimizer.Optimizer

-

Optimizer class that implement a CTPC Algorithm

-
-
Parameters
-
    -
  • node_id (string) – current node’s id

  • -
  • structure_estimator (class:'StructureEstimator') – a structure estimator object with the information about the net

  • -
  • tot_vars_count (int) – number of variables in the dataset

  • -
-
-
-
-
-optimize_structure()
-

Compute Optimization process for a structure_estimator by using a CTPC Algorithm

-
-
Returns
-

the estimated structure for the node

-
-
Return type
-

List

-
-
-
- -
- -
- -
-

pyctbn.legacy.optimizers.optimizer module

-
-
-class pyctbn.legacy.optimizers.optimizer.Optimizer(node_id: str, structure_estimator: pyctbn.legacy.estimators.structure_estimator.StructureEstimator)
-

Bases: abc.ABC

-

Interface class for all the optimizer’s child PyCTBN

-
-
Parameters
-
    -
  • node_id (string) – the node label

  • -
  • structure_estimator (class:'StructureEstimator') – A structureEstimator Object to predict the structure

  • -
-
-
-
-
-abstract optimize_structure() → List
-

Compute Optimization process for a structure_estimator

-
-
Returns
-

the estimated structure for the node

-
-
Return type
-

List

-
-
-
- -
- -
- -
-

Module contents

-
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.PyCTBN.structure_graph.html b/docs/_build/html/PyCTBN.PyCTBN.structure_graph.html deleted file mode 100644 index 6098489..0000000 --- a/docs/_build/html/PyCTBN.PyCTBN.structure_graph.html +++ /dev/null @@ -1,1006 +0,0 @@ - - - - - - - - - - - pyctbn.legacy.structure_graph package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

pyctbn.legacy.structure_graph package

-
-

Submodules

-
-
-

pyctbn.legacy.structure_graph.conditional_intensity_matrix module

-
-
-class pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix(state_residence_times: numpy.array = None, state_transition_matrix: numpy.array = None, cim: numpy.array = None)
-

Bases: object

-

Abstracts the Conditional Intesity matrix of a node as aggregation of the state residence times vector -and state transition matrix and the actual CIM matrix.

-
-
Parameters
-
    -
  • state_residence_times (numpy.array) – state residence times vector

  • -
  • state_transition_matrix (numpy.ndArray) – the transitions count matrix

  • -
-
-
_cim
-

the actual cim of the node

-
-
-
-
-property cim
-
- -
-
-compute_cim_coefficients() → None
-

Compute the coefficients of the matrix _cim by using the following equality q_xx’ = M[x, x’] / T[x]. -The class member _cim will contain the computed cim

-
- -
-
-property state_residence_times
-
- -
-
-property state_transition_matrix
-
- -
- -
-
-

pyctbn.legacy.structure_graph.network_generator module

-
-
-class pyctbn.legacy.structure_graph.network_generator.NetworkGenerator(labels, vals)
-

Bases: object

-

Provides the methods to generate a network graph and the CIMs related to it -Items in _labels, _vals and _indxs are related, and therefore respect the same order

-
-
Parameters
-
    -
  • _labels (List) – List of variables labels that will be part of the network

  • -
  • _vals (List) – List of cardinalities of the variables in network (defined in the same order as _labels)

  • -
  • _indxs (List) – List of the nodes indexes

  • -
  • _cims (Dict) – It contains, for each variable label (the key), the SetOfCims object related to it

  • -
  • _graph (NetworkGraph) – The NetworkGraph object representing the generated structure

  • -
-
-
-
-
-property cims
-
- -
-
-property dyn_str
-
- -
-
-generate_cims(min_val, max_val)
-
-
For each node, generate the corresponding SetOfCims. The objective is to group the CIMs

(actually generated by private method __generate_cim) according to parents possibles states of every node. -This method must obviously be executed after the graph has been generated.

-
-
-
-
Parameters
-
    -
  • min_val (float) – Minimum value allowed for the coefficients in the CIMs

  • -
  • max_val (float) – Maximum value allowed for the coefficients in the CIMs

  • -
-
-
-
- -
-
-generate_graph(density, fixed: bool = False)
-
-
Generate the edges according to specified density, and then instantiate the NetworkGraph object

to represent the network

-
-
-
-
Parameters
-
    -
  • density (float) – Probability of an edge between two nodes to exist

  • -
  • fixed (bool) – Specifies whether the required density is mandatory or it’s just a probability

  • -
-
-
-
- -
-
-property graph
-
- -
-
-property variables
-
- -
- -
-
-

pyctbn.legacy.structure_graph.network_graph module

-
-
-class pyctbn.legacy.structure_graph.network_graph.NetworkGraph(graph_struct: pyctbn.legacy.structure_graph.structure.Structure)
-

Bases: object

-

Abstracts the infos contained in the Structure class in the form of a directed graph. -Has the task of creating all the necessary filtering and indexing structures for parameters estimation

-
-
Parameters
-

graph_struct (Structure) – the Structure object from which infos about the net will be extracted

-
-
_graph
-

directed graph

-
-
_aggregated_info_about_nodes_parents
-

a structure that contains all the necessary infos -about every parents of the node of which all the indexing and filtering structures will be constructed.

-
-
_time_scalar_indexing_structure
-

the indexing structure for state res time estimation

-
-
_transition_scalar_indexing_structure
-

the indexing structure for transition computation

-
-
_time_filtering
-

the columns filtering structure used in the computation of the state res times

-
-
_transition_filtering
-

the columns filtering structure used in the computation of the transition -from one state to another

-
-
_p_combs_structure
-

all the possible parents states combination for the node of interest

-
-
-
-
-add_edges(list_of_edges: List) → None
-

Add the edges to the _graph contained in the list list_of_edges.

-
-
Parameters
-

list_of_edges (List) – the list containing of tuples containing the edges

-
-
-
- -
-
-add_nodes(list_of_nodes: List) → None
-

Adds the nodes to the _graph contained in the list of nodes list_of_nodes. -Sets all the properties that identify a nodes (index, positional index, cardinality)

-
-
Parameters
-

list_of_nodes (List) – the nodes to add to _graph

-
-
-
- -
-
-static build_p_comb_structure_for_a_node(parents_values: List) → numpy.ndarray
-

Builds the combinatorial structure that contains the combinations of all the values contained in -parents_values.

-
-
Parameters
-

parents_values (List) – the cardinalities of the nodes

-
-
Returns
-

A numpy matrix containing a grid of the combinations

-
-
Return type
-

numpy.ndArray

-
-
-
- -
-
-static build_time_columns_filtering_for_a_node(node_indx: int, p_indxs: List) → numpy.ndarray
-

Builds the necessary structure to filter the desired columns indicated by node_indx and p_indxs -in the dataset. -This structute will be used in the computation of the state res times. -:param node_indx: the index of the node -:type node_indx: int -:param p_indxs: the indexes of the node’s parents -:type p_indxs: List -:return: The filtering structure for times estimation -:rtype: numpy.ndArray

-
- -
-
-static build_time_scalar_indexing_structure_for_a_node(node_states: int, parents_vals: List) → numpy.ndarray
-

Builds an indexing structure for the computation of state residence times values.

-
-
Parameters
-
    -
  • node_states (int) – the node cardinality

  • -
  • parents_vals (List) – the caridinalites of the node’s parents

  • -
-
-
Returns
-

The time indexing structure

-
-
Return type
-

numpy.ndArray

-
-
-
- -
-
-static build_transition_filtering_for_a_node(node_indx: int, p_indxs: List, nodes_number: int) → numpy.ndarray
-

Builds the necessary structure to filter the desired columns indicated by node_indx and p_indxs -in the dataset. -This structure will be used in the computation of the state transitions values. -:param node_indx: the index of the node -:type node_indx: int -:param p_indxs: the indexes of the node’s parents -:type p_indxs: List -:param nodes_number: the total number of nodes in the dataset -:type nodes_number: int -:return: The filtering structure for transitions estimation -:rtype: numpy.ndArray

-
- -
-
-static build_transition_scalar_indexing_structure_for_a_node(node_states_number: int, parents_vals: List) → numpy.ndarray
-

Builds an indexing structure for the computation of state transitions values.

-
-
Parameters
-
    -
  • node_states_number (int) – the node cardinality

  • -
  • parents_vals (List) – the caridinalites of the node’s parents

  • -
-
-
Returns
-

The transition indexing structure

-
-
Return type
-

numpy.ndArray

-
-
-
- -
-
-clear_indexing_filtering_structures() → None
-

Initialize all the filtering/indexing structures.

-
- -
-
-property edges
-
- -
-
-fast_init(node_id: str) → None
-

Initializes all the necessary structures for parameters estimation of the node identified by the label -node_id

-
-
Parameters
-

node_id (string) – the label of the node

-
-
-
- -
-
-get_node_indx(node_id) → int
-
- -
-
-get_ordered_by_indx_set_of_parents(node: str) → Tuple
-

Builds the aggregated structure that holds all the infos relative to the parent set of the node, namely -(parents_labels, parents_indexes, parents_cardinalities).

-
-
Parameters
-

node (string) – the label of the node

-
-
Returns
-

a tuple containing all the parent set infos

-
-
Return type
-

Tuple

-
-
-
- -
-
-get_parents_by_id(node_id) → List
-

Returns a list of labels of the parents of the node node_id

-
-
Parameters
-

node_id (string) – the node label

-
-
Returns
-

a List of labels of the parents

-
-
Return type
-

List

-
-
-
- -
-
-get_positional_node_indx(node_id) → int
-
- -
-
-get_states_number(node_id) → int
-
- -
-
-has_edge(edge: tuple) → bool
-

Check if the graph contains a specific edge

-
-
Parameters:

edge: a tuple that rappresents the edge

-
-
Returns:

bool

-
-
-
- -
-
-property nodes
-
- -
-
-property nodes_indexes
-
- -
-
-property nodes_values
-
- -
-
-property p_combs
-
- -
-
-remove_edges(list_of_edges: List) → None
-

Remove the edges to the graph contained in the list list_of_edges.

-
-
Parameters
-

list_of_edges (List) – The edges to remove from the graph

-
-
-
- -
-
-remove_node(node_id: str) → None
-

Remove the node node_id from all the class members. -Initialize all the filtering/indexing structures.

-
- -
-
-property time_filtering
-
- -
-
-property time_scalar_indexing_strucure
-
- -
-
-property transition_filtering
-
- -
-
-property transition_scalar_indexing_structure
-
- -
- -
-
-

pyctbn.legacy.structure_graph.sample_path module

-
-
-class pyctbn.legacy.structure_graph.sample_path.SamplePath(importer: pyctbn.legacy.utility.abstract_importer.AbstractImporter)
-

Bases: object

-

Aggregates all the informations about the trajectories, the real structure of the sampled net and variables -cardinalites. Has the task of creating the objects Trajectory and Structure that will -contain the mentioned data.

-
-
Parameters
-

importer (AbstractImporter) – the Importer object which contains the imported and processed data

-
-
_trajectories
-

the Trajectory object that will contain all the concatenated trajectories

-
-
_structure
-

the Structure Object that will contain all the structural infos about the net

-
-
_total_variables_count
-

the number of variables in the net

-
-
-
-
-build_structure() → None
-

Builds the Structure object that aggregates all the infos about the net.

-
- -
-
-build_trajectories() → None
-

Builds the Trajectory object that will contain all the trajectories. -Clears all the unused dataframes in _importer Object

-
- -
-
-clear_memory()
-
- -
-
-property has_prior_net_structure
-
- -
-
-property structure
-
- -
-
-property total_variables_count
-
- -
-
-property trajectories
-
- -
- -
-
-

pyctbn.legacy.structure_graph.set_of_cims module

-
-
-class pyctbn.legacy.structure_graph.set_of_cims.SetOfCims(node_id: str, parents_states_number: List, node_states_number: int, p_combs: numpy.ndarray, cims: numpy.ndarray = None)
-

Bases: object

-

Aggregates all the CIMS of the node identified by the label _node_id.

-
-
Parameters
-
    -
  • node_id – the node label

  • -
  • parents_states_number (List) – the cardinalities of the parents

  • -
  • node_states_number (int) – the caridinality of the node

  • -
  • p_combs (numpy.ndArray) – the p_comb structure bound to this node

  • -
-
-
_state_residence_time
-

matrix containing all the state residence time vectors for the node

-
-
_transition_matrices
-

matrix containing all the transition matrices for the node

-
-
_actual_cims
-

the cims of the node

-
-
-
-
-property actual_cims
-
- -
-
-build_cims(state_res_times: numpy.ndarray, transition_matrices: numpy.ndarray) → None
-

Build the ConditionalIntensityMatrix objects given the state residence times and transitions matrices. -Compute the cim coefficients.The class member _actual_cims will contain the computed cims.

-
-
Parameters
-
    -
  • state_res_times (numpy.ndArray) – the state residence times matrix

  • -
  • transition_matrices (numpy.ndArray) – the transition matrices

  • -
-
-
-
- -
-
-build_times_and_transitions_structures() → None
-

Initializes at the correct dimensions the state residence times matrix and the state transition matrices.

-
- -
-
-filter_cims_with_mask(mask_arr: numpy.ndarray, comb: List) → numpy.ndarray
-

Filter the cims contained in the array _actual_cims given the boolean mask mask_arr and the index -comb.

-
-
Parameters
-
    -
  • mask_arr (numpy.array) – the boolean mask that indicates which parent to consider

  • -
  • comb (numpy.array) – the state/s of the filtered parents

  • -
-
-
Returns
-

Array of ConditionalIntensityMatrix objects

-
-
Return type
-

numpy.array

-
-
-
- -
-
-get_cims_number()
-
- -
-
-property p_combs
-
- -
- -
-
-

pyctbn.legacy.structure_graph.structure module

-
-
-class pyctbn.legacy.structure_graph.structure.Structure(nodes_labels_list: List, nodes_indexes_arr: numpy.ndarray, nodes_vals_arr: numpy.ndarray, edges_list: List, total_variables_number: int)
-

Bases: object

-

Contains all the infos about the network structure(nodes labels, nodes caridinalites, edges, indexes)

-
-
Parameters
-
    -
  • nodes_labels_list (List) – the symbolic names of the variables

  • -
  • nodes_indexes_arr (numpy.ndArray) – the indexes of the nodes

  • -
  • nodes_vals_arr (numpy.ndArray) – the cardinalites of the nodes

  • -
  • edges_list (List) – the edges of the network

  • -
  • total_variables_number (int) – the total number of variables in the dataset

  • -
-
-
-
-
-add_edge(edge: tuple)
-
- -
-
-clean_structure_edges()
-
- -
-
-contains_edge(edge: tuple) → bool
-
- -
-
-property edges
-
- -
-
-get_node_id(node_indx: int) → str
-

Given the node_index returns the node label.

-
-
Parameters
-

node_indx (int) – the node index

-
-
Returns
-

the node label

-
-
Return type
-

string

-
-
-
- -
-
-get_node_indx(node_id: str) → int
-

Given the node_index returns the node label.

-
-
Parameters
-

node_id (string) – the node label

-
-
Returns
-

the node index

-
-
Return type
-

int

-
-
-
- -
-
-get_positional_node_indx(node_id: str) → int
-
- -
-
-get_states_number(node: str) → int
-

Given the node label node returns the cardinality of the node.

-
-
Parameters
-

node (string) – the node label

-
-
Returns
-

the node cardinality

-
-
Return type
-

int

-
-
-
- -
-
-property nodes_indexes
-
- -
-
-property nodes_labels
-
- -
-
-property nodes_values
-
- -
-
-remove_edge(edge: tuple)
-
- -
-
-remove_node(node_id: str) → None
-

Remove the node node_id from all the class members. -The class member _total_variables_number since it refers to the total number of variables in the dataset.

-
- -
-
-property total_variables_number
-
- -
- -
-
-

pyctbn.legacy.structure_graph.trajectory module

-
-
-class pyctbn.legacy.structure_graph.trajectory.Trajectory(list_of_columns: List, original_cols_number: int)
-

Bases: object

-

Abstracts the infos about a complete set of trajectories, represented as a numpy array of doubles -(the time deltas) and a numpy matrix of ints (the changes of states).

-
-
Parameters
-
    -
  • list_of_columns (List) – the list containing the times array and values matrix

  • -
  • original_cols_number (int) – total number of cols in the data

  • -
-
-
_actual_trajectory
-

the trajectory containing also the duplicated/shifted values

-
-
_times
-

the array containing the time deltas

-
-
-
-
-property complete_trajectory
-
- -
-
-size()
-
- -
-
-property times
-
- -
-
-property trajectory
-
- -
- -
-
-

pyctbn.legacy.structure_graph.trajectory_generator module

-
-
-class pyctbn.legacy.structure_graph.trajectory_generator.TrajectoryGenerator(importer: pyctbn.legacy.utility.abstract_importer.AbstractImporter = None, variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)
-

Bases: object

-

Provides the methods to generate a trajectory basing on the network defined -in the importer.

-
-
Parameters
-
    -
  • _importer (AbstractImporter) – the Importer object which contains the imported and processed data

  • -
  • _vnames (List) – List of the variables labels that belong to the network

  • -
  • _parents (Dict) – It contains, for each variable label (the key), the list of related parents labels

  • -
  • _cims (Dict) – It contains, for each variable label (the key), the SetOfCims object related to it

  • -
  • _generated_trajectory (pandas.DataFrame) – Result of the execution of CTBN_Sample, contains the output trajectory

  • -
-
-
-
-
-CTBN_Sample(t_end=- 1, max_tr=- 1)
-
-
This method implements the generation of a trajectory, basing on the network structure and

on the coefficients defined in the CIMs. -The variables are initialized with value 0, and the method takes care of adding the -conventional last row made up of -1.

-
-
-
-
Parameters
-
    -
  • t_end (float) – If defined, the sampling ends when end time is reached

  • -
  • max_tr (int) – Parameter taken in consideration in case that t_end isn’t defined. It specifies the number of transitions to execute

  • -
-
-
-
- -
-
-multi_trajectory(t_ends: list = None, max_trs: list = None)
-

Generate n trajectories in parallel, where n is the number of items in -t_ends, if defined, or the number of items in max_trs otherwise

-
-
Parameters
-
    -
  • t_ends (list) – List of t_end values for the trajectories that will be generated

  • -
  • max_trs (list) – List of max_tr values for the trajectories that will be generated

  • -
-
-
-
- -
-
-worker(t_end, max_tr, trajectories)
-

Single process that will be executed in parallel in order to generate one trajectory.

-
-
Parameters
-
    -
  • t_end (float) – If defined, the sampling ends when end time is reached

  • -
  • max_tr (int) – Parameter taken in consideration in case that t_end isn’t defined. It specifies the number of transitions to execute

  • -
  • trajectories (list) – Shared list that contains to which the generated trajectory is added

  • -
-
-
-
- -
- -
-
-

Module contents

-
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.PyCTBN.utility.html b/docs/_build/html/PyCTBN.PyCTBN.utility.html deleted file mode 100644 index 5ce433a..0000000 --- a/docs/_build/html/PyCTBN.PyCTBN.utility.html +++ /dev/null @@ -1,739 +0,0 @@ - - - - - - - - - - - pyctbn.legacy.utility package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

pyctbn.legacy.utility package

-
-

Submodules

-
-
-

pyctbn.legacy.utility.abstract_exporter module

-
-
-class pyctbn.legacy.utility.abstract_exporter.AbstractExporter(variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)
-

Bases: abc.ABC

-

Abstract class that exposes the methods to save in json format a network information -along with one or more trajectories generated basing on it

-
-
Parameters
-
    -
  • _variables (pandas.DataFrame) – Dataframe containing the nodes labels and cardinalities

  • -
  • _dyn_str (pandas.DataFrame) – Dataframe containing the structure of the network (edges)

  • -
  • _dyn_cims (dict) – It contains, for every variable (label is the key), the SetOfCims object related to it

  • -
  • _trajectories (List) – List of trajectories, that can be added subsequently

  • -
-
-
-
-
-add_trajectory(trajectory: list)
-

Add a new trajectory to the current list

-
-
Parameters
-

trajectory (pandas.DataFrame) – The trajectory to add

-
-
-
- -
-
-abstract out_file(filename)
-
-
Create a file in current directory and write on it the previously added data

(variables, dyn_str, dyn_cims and trajectories)

-
-
-
-
Parameters
-

filename (string) – Name of the output file (it must include json extension)

-
-
-
- -
- -
-
-

pyctbn.legacy.utility.abstract_importer module

-
-
-class pyctbn.legacy.utility.abstract_importer.AbstractImporter(file_path: str = None, trajectory_list: Union[pandas.core.frame.DataFrame, numpy.ndarray] = None, variables: pandas.core.frame.DataFrame = None, prior_net_structure: pandas.core.frame.DataFrame = None)
-

Bases: abc.ABC

-

Abstract class that exposes all the necessary methods to process the trajectories and the net structure.

-
-
Parameters
-
    -
  • file_path (str) – the file path, or dataset name if you import already processed data

  • -
  • trajectory_list (typing.Union[pandas.DataFrame, numpy.ndarray]) – Dataframe or numpy array containing the concatenation of all the processed trajectories

  • -
  • variables (pandas.DataFrame) – Dataframe containing the nodes labels and cardinalities

  • -
-
-
Prior_net_structure
-

Dataframe containing the structure of the network (edges)

-
-
_sorter
-

A list containing the variables labels in the SAME order as the columns in concatenated_samples

-
-
-
-

Warning

-

The parameters variables and prior_net_structure HAVE to be properly constructed -as Pandas Dataframes with the following structure: -Header of _df_structure = [From_Node | To_Node] -Header of _df_variables = [Variable_Label | Variable_Cardinality] -See the tutorial on how to construct a correct concatenated_samples Dataframe/ndarray.

-
-
-

Note

-

See :class:JsonImporter for an example implementation

-
-
-
-build_list_of_samples_array(concatenated_sample: pandas.core.frame.DataFrame) → List
-

Builds a List containing the the delta times numpy array, and the complete transitions matrix

-
-
Parameters
-

concatenated_sample (pandas.Dataframe) – the dataframe/array from which the time, and transitions matrix have to be extracted -and converted

-
-
Returns
-

the resulting list of numpy arrays

-
-
Return type
-

List

-
-
-
- -
-
-abstract build_sorter(trajecory_header: object) → List
-

Initializes the _sorter class member from a trajectory dataframe, exctracting the header of the frame -and keeping ONLY the variables symbolic labels, cutting out the time label in the header.

-
-
Parameters
-

trajecory_header (object) – an object that will be used to define the header

-
-
Returns
-

A list containing the processed header.

-
-
Return type
-

List

-
-
-
- -
-
-clear_concatenated_frame() → None
-

Removes all values in the dataframe concatenated_samples.

-
- -
-
-compute_row_delta_in_all_samples_frames(df_samples_list: List) → None
-

Calls the method compute_row_delta_sigle_samples_frame on every dataframe present in the list -df_samples_list. -Concatenates the result in the dataframe concatanated_samples

-
-
Parameters
-

df_samples_list (List) – the datframe’s list to be processed and concatenated

-
-
-
-

Warning

-

The Dataframe sample_frame has to follow the column structure of this header: -Header of sample_frame = [Time | Variable values] -The class member self._sorter HAS to be properly INITIALIZED (See class members definition doc)

-
-
-

Note

-

After the call of this method the class member concatanated_samples will contain all processed -and merged trajectories

-
-
- -
-
-compute_row_delta_sigle_samples_frame(sample_frame: pandas.core.frame.DataFrame, columns_header: List, shifted_cols_header: List) → pandas.core.frame.DataFrame
-

Computes the difference between each value present in th time column. -Copies and shift by one position up all the values present in the remaining columns.

-
-
Parameters
-
    -
  • sample_frame (pandas.Dataframe) – the traj to be processed

  • -
  • columns_header (List) – the original header of sample_frame

  • -
  • shifted_cols_header (List) – a copy of columns_header with changed names of the contents

  • -
-
-
Returns
-

The processed dataframe

-
-
Return type
-

pandas.Dataframe

-
-
-
-

Warning

-

the Dataframe sample_frame has to follow the column structure of this header: -Header of sample_frame = [Time | Variable values]

-
-
- -
-
-property concatenated_samples
-
- -
-
-abstract dataset_id() → object
-

If the original dataset contains multiple dataset, this method returns a unique id to identify the current -dataset

-
- -
-
-property file_path
-
- -
-
-property sorter
-
- -
-
-property structure
-
- -
-
-property variables
-
- -
- -
-
-

pyctbn.legacy.utility.cache module

-
-
-class pyctbn.legacy.utility.cache.Cache
-

Bases: object

-

This class acts as a cache of SetOfCims objects for a node.

-
-
__list_of_sets_of_parents
-

a list of Sets objects of the parents to which the cim in cache at SAME -index is related

-
-
__actual_cache
-

a list of setOfCims objects

-
-
-
-
-clear()
-

Clear the contents both of __actual_cache and __list_of_sets_of_parents.

-
- -
-
-find(parents_comb: Set)
-

Tries to find in cache given the symbolic parents combination parents_comb the SetOfCims -related to that parents_comb.

-
-
Parameters
-

parents_comb (Set) – the parents related to that SetOfCims

-
-
Returns
-

A SetOfCims object if the parents_comb index is found in __list_of_sets_of_parents. -None otherwise.

-
-
Return type
-

SetOfCims

-
-
-
- -
-
-put(parents_comb: Set, socim: pyctbn.legacy.structure_graph.set_of_cims.SetOfCims)
-

Place in cache the SetOfCims object, and the related symbolic index parents_comb in -__list_of_sets_of_parents.

-
-
Parameters
-
    -
  • parents_comb (Set) – the symbolic set index

  • -
  • socim (SetOfCims) – the related SetOfCims object

  • -
-
-
-
- -
- -
-
-

pyctbn.legacy.utility.json_exporter module

-
-
-class pyctbn.legacy.utility.json_exporter.JsonExporter(variables: pandas.core.frame.DataFrame = None, dyn_str: pandas.core.frame.DataFrame = None, dyn_cims: dict = None)
-

Bases: pyctbn.legacy.utility.abstract_exporter.AbstractExporter

-

Provides the methods to save in json format a network information -along with one or more trajectories generated basing on it

-
-
Parameters
-
    -
  • _variables (pandas.DataFrame) – Dataframe containing the nodes labels and cardinalities

  • -
  • _dyn_str (pandas.DataFrame) – Dataframe containing the structure of the network (edges)

  • -
  • _dyn_cims (dict) – It contains, for every variable (label is the key), the SetOfCims object related to it

  • -
  • _trajectories (List) – List of trajectories, that can be added subsequently

  • -
-
-
-
-
-cims_to_json() → dict
-
- -
-
-out_file(filename)
-
-
Create a file in current directory and write on it the previously added data

(variables, dyn_str, dyn_cims and trajectories)

-
-
-
-
Parameters
-

filename (string) – Name of the output file (it must include json extension)

-
-
-
- -
- -
-
-

pyctbn.legacy.utility.json_importer module

-
-
-class pyctbn.legacy.utility.json_importer.JsonImporter(file_path: str, samples_label: str, structure_label: str, variables_label: str, time_key: str, variables_key: str, cims_label: str = None)
-

Bases: pyctbn.legacy.utility.abstract_importer.AbstractImporter

-

Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare -the data in json extension.

-
-
Parameters
-
    -
  • file_path (string) – the path of the file that contains tha data to be imported

  • -
  • samples_label (string) – the reference key for the samples in the trajectories

  • -
  • structure_label (string) – the reference key for the structure of the network data

  • -
  • variables_label (string) – the reference key for the cardinalites of the nodes data

  • -
  • time_key (string) – the key used to identify the timestamps in each trajectory

  • -
  • variables_key (string) – the key used to identify the names of the variables in the net

  • -
-
-
_array_indx
-

the index of the outer JsonArray to extract the data from

-
-
_df_samples_list
-

a Dataframe list in which every dataframe contains a trajectory

-
-
_raw_data
-

The raw contents of the json file to import

-
-
-
-
-build_sorter(sample_frame: pandas.core.frame.DataFrame) → List
-

Implements the abstract method build_sorter of the AbstractImporter for this dataset.

-
- -
-
-clear_data_frame_list() → None
-

Removes all values present in the dataframes in the list _df_samples_list.

-
- -
-
-dataset_id() → object
-

If the original dataset contains multiple dataset, this method returns a unique id to identify the current -dataset

-
- -
-
-import_data(indx: int = 0) → None
-

Implements the abstract method of AbstractImporter.

-
-
Parameters
-

indx (int) – the index of the outer JsonArray to extract the data from, default to 0

-
-
-
- -
-
-import_sampled_cims(raw_data: List, indx: int, cims_key: str) → Dict
-

Imports the synthetic CIMS in the dataset in a dictionary, using variables labels -as keys for the set of CIMS of a particular node.

-
-
Parameters
-
    -
  • raw_data (List) – List of Dicts

  • -
  • indx (int) – The index of the array from which the data have to be extracted

  • -
  • cims_key (string) – the key where the json object cims are placed

  • -
-
-
Returns
-

a dictionary containing the sampled CIMS for all the variables in the net

-
-
Return type
-

Dictionary

-
-
-
- -
-
-import_structure(raw_data: List) → pandas.core.frame.DataFrame
-

Imports in a dataframe the data in the list raw_data at the key _structure_label

-
-
Parameters
-

raw_data (List) – List of Dicts

-
-
Returns
-

Dataframe containg the starting node a ending node of every arc of the network

-
-
Return type
-

pandas.Dataframe

-
-
-
- -
-
-import_trajectories(raw_data: List) → List
-

Imports the trajectories from the list of dicts raw_data.

-
-
Parameters
-

raw_data (List) – List of Dicts

-
-
Returns
-

List of dataframes containing all the trajectories

-
-
Return type
-

List

-
-
-
- -
-
-import_variables(raw_data: List) → pandas.core.frame.DataFrame
-

Imports the data in raw_data at the key _variables_label.

-
-
Parameters
-

raw_data (List) – List of Dicts

-
-
Returns
-

Datframe containg the variables simbolic labels and their cardinalities

-
-
Return type
-

pandas.Dataframe

-
-
-
- -
-
-normalize_trajectories(raw_data: List, indx: int, trajectories_key: str) → List
-

Extracts the trajectories in raw_data at the index index at the key trajectories key.

-
-
Parameters
-
    -
  • raw_data (List) – List of Dicts

  • -
  • indx (int) – The index of the array from which the data have to be extracted

  • -
  • trajectories_key (string) – the key of the trajectories objects

  • -
-
-
Returns
-

A list of daframes containg the trajectories

-
-
Return type
-

List

-
-
-
- -
-
-one_level_normalizing(raw_data: List, indx: int, key: str) → pandas.core.frame.DataFrame
-

Extracts the one-level nested data in the list raw_data at the index indx at the key key.

-
-
Parameters
-
    -
  • raw_data (List) – List of Dicts

  • -
  • indx (int) – The index of the array from which the data have to be extracted

  • -
  • key (string) – the key for the Dicts from which exctract data

  • -
-
-
Returns
-

A normalized dataframe

-
-
Return type
-

pandas.Datframe

-
-
-
- -
-
-read_json_file() → List
-

Reads the JSON file in the path self.filePath.

-
-
Returns
-

The contents of the json file

-
-
Return type
-

List

-
-
-
- -
- -
-
-

pyctbn.legacy.utility.sample_importer module

-
-
-class pyctbn.legacy.utility.sample_importer.SampleImporter(trajectory_list: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None, variables: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None, prior_net_structure: Union[pandas.core.frame.DataFrame, numpy.ndarray, List] = None)
-

Bases: pyctbn.legacy.utility.abstract_importer.AbstractImporter

-

Implements the abstracts methods of AbstractImporter and adds all the necessary methods to process and prepare -the data loaded directly by using DataFrame

-
-
Parameters
-
    -
  • trajectory_list (typing.Union[pd.DataFrame, np.ndarray, typing.List]) – the data that describes the trajectories

  • -
  • variables (typing.Union[pd.DataFrame, np.ndarray, typing.List]) – the data that describes the variables with name and cardinality

  • -
  • prior_net_structure (typing.Union[pd.DataFrame, np.ndarray, typing.List]) – the data of the real structure, if it exists

  • -
-
-
_df_samples_list
-

a Dataframe list in which every dataframe contains a trajectory

-
-
_raw_data
-

The raw contents of the json file to import

-
-
-
-
-build_sorter(sample_frame: pandas.core.frame.DataFrame) → List
-

Implements the abstract method build_sorter of the AbstractImporter in order to get the ordered variables list.

-
- -
-
-dataset_id() → str
-

If the original dataset contains multiple dataset, this method returns a unique id to identify the current -dataset

-
- -
-
-import_data(header_column=None)
-
- -
- -
-
-

Module contents

-
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.html b/docs/_build/html/PyCTBN.html deleted file mode 100644 index 8fbf841..0000000 --- a/docs/_build/html/PyCTBN.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - PyCTBN package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN package

-
-

Subpackages

-
- -
-
-
-

Submodules

-
-
-

PyCTBN.basic_main module

-
-
-

PyCTBN.setup module

-
-
-

Module contents

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.tests.estimators.html b/docs/_build/html/PyCTBN.tests.estimators.html deleted file mode 100644 index 8d7868f..0000000 --- a/docs/_build/html/PyCTBN.tests.estimators.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - - - - PyCTBN.tests.estimators package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN.tests.estimators package

-
-

Submodules

-
-
-

PyCTBN.tests.estimators.test_parameters_estimator module

-
-
-class PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-aux_import_sampled_cims(cims_label)
-
- -
-
-cim_equality_test(cim1, cim2)
-
- -
-
-equality_of_cims_of_node(sampled_cims, estimated_cims)
-
- -
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_compute_parameters_for_node()
-
- -
-
-test_fast_init()
-
- -
- -
-
-

PyCTBN.tests.estimators.test_structure_constraint_based_estimator module

-
-
-class PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass()
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_structure_1()
-
- -
-
-test_structure_2()
-
- -
-
-test_structure_3()
-
- -
- -
-
-

PyCTBN.tests.estimators.test_structure_estimator module

-
-
-class PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass()
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_adjacency_matrix()
-
- -
-
-test_build_complete_graph()
-
- -
-
-test_build_removable_edges_matrix()
-
- -
-
-test_generate_possible_sub_sets_of_size()
-
- -
-
-test_init()
-
- -
-
-test_save_plot_estimated_graph()
-
- -
-
-test_save_results()
-
- -
-
-test_time()
-
- -
- -
-
-

PyCTBN.tests.estimators.test_structure_score_based_estimator module

-
-
-class PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass()
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_structure_1()
-
- -
-
-test_structure_2()
-
- -
-
-test_structure_3()
-
- -
-
-test_structure_monoprocesso()
-
- -
- -
-
-

Module contents

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.tests.html b/docs/_build/html/PyCTBN.tests.html deleted file mode 100644 index 4d2042d..0000000 --- a/docs/_build/html/PyCTBN.tests.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - PyCTBN.tests package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.tests.optimizers.html b/docs/_build/html/PyCTBN.tests.optimizers.html deleted file mode 100644 index da694c5..0000000 --- a/docs/_build/html/PyCTBN.tests.optimizers.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - PyCTBN.tests.optimizers package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN.tests.optimizers package

-
-

Submodules

-
- - -
-

Module contents

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.tests.structure_graph.html b/docs/_build/html/PyCTBN.tests.structure_graph.html deleted file mode 100644 index 18d43c7..0000000 --- a/docs/_build/html/PyCTBN.tests.structure_graph.html +++ /dev/null @@ -1,566 +0,0 @@ - - - - - - - - - - - PyCTBN.tests.structure_graph package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN.tests.structure_graph package

-
-

Submodules

-
-
-

PyCTBN.tests.structure_graph.test_cim module

-
-
-class PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_compute_cim_coefficients()
-
- -
-
-test_init()
-
- -
-
-test_repr()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_networkgenerator module

-
-
-class PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-test_generate_cims()
-
- -
-
-test_generate_graph()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_networkgraph module

-
-
-class PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-aux_build_p_combs_structure(graph, p_vals)
-
- -
-
-aux_build_time_columns_filtering_structure_for_a_node(graph, node_id, p_indxs)
-
- -
-
-aux_build_time_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_vals)
-
- -
-
-aux_build_transition_columns_filtering_structure(graph, node_id, p_indxs)
-
- -
-
-aux_build_transition_scalar_indexing_structure_for_a_node(graph, node_id, parents_indxs, parents_labels, parents_values)
-
- -
-
-classmethod setUpClass()
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_add_edges()
-
- -
-
-test_add_nodes()
-
- -
-
-test_build_p_combs_structure()
-
- -
-
-test_build_time_columns_filtering_structure_for_a_node()
-
- -
-
-test_build_time_scalar_indexing_structure_for_a_node()
-
- -
-
-test_build_transition_columns_filtering_structure()
-
- -
-
-test_build_transition_scalar_indexing_structure_for_a_node()
-
- -
-
-test_fast_init()
-
- -
-
-test_get_node_indx()
-
- -
-
-test_get_ordered_by_indx_set_of_parents()
-
- -
-
-test_get_parents_by_id()
-
- -
-
-test_get_states_number()
-
- -
-
-test_init()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_sample_path module

-
-
-class PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_buid_samplepath_no_concatenated_samples()
-
- -
-
-test_buid_samplepath_no_variables()
-
- -
-
-test_build_saplepath_no_prior_net_structure()
-
- -
-
-test_build_structure()
-
- -
-
-test_build_structure_bad_sorter()
-
- -
-
-test_build_trajectories()
-
- -
-
-test_init()
-
- -
-
-test_init_not_filled_dataframse()
-
- -
-
-test_init_not_initialized_importer()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_setofcims module

-
-
-class PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-another_filtering_method(p_combs, mask, parent_value)
-
- -
-
-aux_test_build_cims(node_id, p_values, node_states, p_combs)
-
- -
-
-aux_test_init(node_id, parents_states_number, node_states_number, p_combs)
-
- -
-
-build_p_comb_structure_for_a_node(parents_values)
-

Builds the combinatory structure that contains the combinations of all the values contained in parents_values.

-
-
Parameters:

parents_values: the cardinalities of the nodes

-
-
Returns:

a numpy matrix containing a grid of the combinations

-
-
-
- -
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_build_cims()
-
- -
-
-test_filter_cims_with_mask()
-
- -
-
-test_init()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_structure module

-
-
-class PyCTBN.tests.structure_graph.test_structure.TestStructure(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass()
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_edges_operations()
-
- -
-
-test_equality()
-
- -
-
-test_get_node_id()
-
- -
-
-test_get_node_indx()
-
- -
-
-test_get_positional_node_indx()
-
- -
-
-test_get_states_number()
-
- -
-
-test_init()
-
- -
-
-test_repr()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_trajectory module

-
-
-class PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_init()
-
- -
- -
-
-

PyCTBN.tests.structure_graph.test_trajectorygenerator module

-
-
-class PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_generated_trajectory()
-
- -
-
-test_generated_trajectory_max_tr()
-
- -
-
-test_init()
-
- -
-
-test_multi_trajectory()
-
- -
- -
-
-

Module contents

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/PyCTBN.tests.utility.html b/docs/_build/html/PyCTBN.tests.utility.html deleted file mode 100644 index e4ab041..0000000 --- a/docs/_build/html/PyCTBN.tests.utility.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - - - - - PyCTBN.tests.utility package — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN.tests.utility package

-
-

Submodules

-
-
-

PyCTBN.tests.utility.test_cache module

-
-
-class PyCTBN.tests.utility.test_cache.TestCache(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-test_clear()
-
- -
-
-test_find()
-
- -
-
-test_init()
-
- -
-
-test_put()
-
- -
- -
-
-

PyCTBN.tests.utility.test_json_importer module

-
-
-class PyCTBN.tests.utility.test_json_importer.TestJsonImporter(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-ordered(obj)
-
- -
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_build_sorter()
-
- -
-
-test_clear_concatenated_frame()
-
- -
-
-test_clear_data_frame_list()
-
- -
-
-test_compute_row_delta_in_all_frames()
-
- -
-
-test_compute_row_delta_in_all_frames_not_init_sorter()
-
- -
-
-test_compute_row_delta_single_samples_frame()
-
- -
-
-test_dataset_id()
-
- -
-
-test_file_path()
-
- -
-
-test_import_data()
-
- -
-
-test_import_sampled_cims()
-
- -
-
-test_import_structure()
-
- -
-
-test_import_variables()
-
- -
-
-test_init()
-
- -
-
-test_normalize_trajectories()
-
- -
-
-test_normalize_trajectories_wrong_indx()
-
- -
-
-test_normalize_trajectories_wrong_key()
-
- -
-
-test_read_json_file_found()
-
- -
-
-test_read_json_file_not_found()
-
- -
- -
-
-

PyCTBN.tests.utility.test_sample_importer module

-
-
-class PyCTBN.tests.utility.test_sample_importer.TestSampleImporter(methodName='runTest')
-

Bases: unittest.case.TestCase

-
-
-ordered(obj)
-
- -
-
-classmethod setUpClass() → None
-

Hook method for setting up class fixture before running tests in the class.

-
- -
-
-test_init()
-
- -
-
-test_order()
-
- -
- -
-
-

Module contents

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/_sources/PyCTBN.PyCTBN.estimators.rst.txt b/docs/_build/html/_sources/PyCTBN.PyCTBN.estimators.rst.txt deleted file mode 100644 index 2340868..0000000 --- a/docs/_build/html/_sources/PyCTBN.PyCTBN.estimators.rst.txt +++ /dev/null @@ -1,53 +0,0 @@ -pyctbn.legacy.estimators package -================================ - -Submodules ----------- - -pyctbn.legacy.estimators.fam\_score\_calculator module ------------------------------------------------------- - -.. automodule:: pyctbn.legacy.estimators.fam_score_calculator - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.estimators.parameters\_estimator module ------------------------------------------------------ - -.. automodule:: pyctbn.legacy.estimators.parameters_estimator - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.estimators.structure\_constraint\_based\_estimator module ------------------------------------------------------------------------ - -.. automodule:: pyctbn.legacy.estimators.structure_constraint_based_estimator - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.estimators.structure\_estimator module ----------------------------------------------------- - -.. automodule:: pyctbn.legacy.estimators.structure_estimator - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.estimators.structure\_score\_based\_estimator module ------------------------------------------------------------------- - -.. automodule:: pyctbn.legacy.estimators.structure_score_based_estimator - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: pyctbn.legacy.estimators - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.PyCTBN.optimizers.rst.txt b/docs/_build/html/_sources/PyCTBN.PyCTBN.optimizers.rst.txt deleted file mode 100644 index 4d4733d..0000000 --- a/docs/_build/html/_sources/PyCTBN.PyCTBN.optimizers.rst.txt +++ /dev/null @@ -1,45 +0,0 @@ -pyctbn.legacy.optimizers package -================================ - -Submodules ----------- - -pyctbn.legacy.optimizers.constraint\_based\_optimizer module ------------------------------------------------------------- - -.. automodule:: pyctbn.legacy.optimizers.constraint_based_optimizer - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.optimizers.hill\_climbing\_search module ------------------------------------------------------- - -.. automodule:: pyctbn.legacy.optimizers.hill_climbing_search - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.optimizers.optimizer module ------------------------------------------ - -.. automodule:: pyctbn.legacy.optimizers.optimizer - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.optimizers.tabu\_search module --------------------------------------------- - -.. automodule:: pyctbn.legacy.optimizers.tabu_search - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: pyctbn.legacy.optimizers - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.PyCTBN.rst.txt b/docs/_build/html/_sources/PyCTBN.PyCTBN.rst.txt deleted file mode 100644 index 2182764..0000000 --- a/docs/_build/html/_sources/PyCTBN.PyCTBN.rst.txt +++ /dev/null @@ -1,21 +0,0 @@ -pyctbn.legacy package -===================== - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - pyctbn.legacy.estimators - pyctbn.legacy.optimizers - pyctbn.legacy.structure_graph - pyctbn.legacy.utility - -Module contents ---------------- - -.. automodule:: pyctbn.legacy - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt b/docs/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt deleted file mode 100644 index 4b9aca2..0000000 --- a/docs/_build/html/_sources/PyCTBN.PyCTBN.structure_graph.rst.txt +++ /dev/null @@ -1,77 +0,0 @@ -pyctbn.legacy.structure\_graph package -====================================== - -Submodules ----------- - -pyctbn.legacy.structure\_graph.conditional\_intensity\_matrix module --------------------------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.conditional_intensity_matrix - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.network\_generator module --------------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.network_generator - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.network\_graph module ----------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.network_graph - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.sample\_path module --------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.sample_path - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.set\_of\_cims module ---------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.set_of_cims - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.structure module ------------------------------------------------ - -.. automodule:: pyctbn.legacy.structure_graph.structure - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.trajectory module ------------------------------------------------- - -.. automodule:: pyctbn.legacy.structure_graph.trajectory - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.structure\_graph.trajectory\_generator module ------------------------------------------------------------ - -.. automodule:: pyctbn.legacy.structure_graph.trajectory_generator - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: pyctbn.legacy.structure_graph - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt b/docs/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt deleted file mode 100644 index e661b1b..0000000 --- a/docs/_build/html/_sources/PyCTBN.PyCTBN.utility.rst.txt +++ /dev/null @@ -1,61 +0,0 @@ -pyctbn.legacy.utility package -============================= - -Submodules ----------- - -pyctbn.legacy.utility.abstract\_exporter module ------------------------------------------------ - -.. automodule:: pyctbn.legacy.utility.abstract_exporter - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.utility.abstract\_importer module ------------------------------------------------ - -.. automodule:: pyctbn.legacy.utility.abstract_importer - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.utility.cache module ----------------------------------- - -.. automodule:: pyctbn.legacy.utility.cache - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.utility.json\_exporter module -------------------------------------------- - -.. automodule:: pyctbn.legacy.utility.json_exporter - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.utility.json\_importer module -------------------------------------------- - -.. automodule:: pyctbn.legacy.utility.json_importer - :members: - :undoc-members: - :show-inheritance: - -pyctbn.legacy.utility.sample\_importer module ---------------------------------------------- - -.. automodule:: pyctbn.legacy.utility.sample_importer - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: pyctbn.legacy.utility - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.rst.txt b/docs/_build/html/_sources/PyCTBN.rst.txt deleted file mode 100644 index 258a0a8..0000000 --- a/docs/_build/html/_sources/PyCTBN.rst.txt +++ /dev/null @@ -1,38 +0,0 @@ -PyCTBN package -============== - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - pyctbn.legacy - PyCTBN.tests - -Submodules ----------- - -PyCTBN.basic\_main module -------------------------- - -.. automodule:: PyCTBN.basic_main - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.setup module -------------------- - -.. automodule:: PyCTBN.setup - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: PyCTBN - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.tests.rst.txt b/docs/_build/html/_sources/PyCTBN.tests.rst.txt deleted file mode 100644 index 5fa24d0..0000000 --- a/docs/_build/html/_sources/PyCTBN.tests.rst.txt +++ /dev/null @@ -1,21 +0,0 @@ -PyCTBN.tests package -==================== - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - PyCTBN.tests.estimators - PyCTBN.tests.optimizers - PyCTBN.tests.structure_graph - PyCTBN.tests.utility - -Module contents ---------------- - -.. automodule:: PyCTBN.tests - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt b/docs/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt deleted file mode 100644 index 7240498..0000000 --- a/docs/_build/html/_sources/PyCTBN.tests.structure_graph.rst.txt +++ /dev/null @@ -1,77 +0,0 @@ -PyCTBN.tests.structure\_graph package -===================================== - -Submodules ----------- - -PyCTBN.tests.structure\_graph.test\_cim module ----------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_cim - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_networkgenerator module ------------------------------------------------------------ - -.. automodule:: PyCTBN.tests.structure_graph.test_networkgenerator - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_networkgraph module -------------------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_networkgraph - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_sample\_path module -------------------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_sample_path - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_setofcims module ----------------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_setofcims - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_structure module ----------------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_structure - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_trajectory module ------------------------------------------------------ - -.. automodule:: PyCTBN.tests.structure_graph.test_trajectory - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.structure\_graph.test\_trajectorygenerator module --------------------------------------------------------------- - -.. automodule:: PyCTBN.tests.structure_graph.test_trajectorygenerator - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: PyCTBN.tests.structure_graph - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.tests.utility.rst.txt b/docs/_build/html/_sources/PyCTBN.tests.utility.rst.txt deleted file mode 100644 index b514c30..0000000 --- a/docs/_build/html/_sources/PyCTBN.tests.utility.rst.txt +++ /dev/null @@ -1,37 +0,0 @@ -PyCTBN.tests.utility package -============================ - -Submodules ----------- - -PyCTBN.tests.utility.test\_cache module ---------------------------------------- - -.. automodule:: PyCTBN.tests.utility.test_cache - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.utility.test\_json\_importer module ------------------------------------------------- - -.. automodule:: PyCTBN.tests.utility.test_json_importer - :members: - :undoc-members: - :show-inheritance: - -PyCTBN.tests.utility.test\_sample\_importer module --------------------------------------------------- - -.. automodule:: PyCTBN.tests.utility.test_sample_importer - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: PyCTBN.tests.utility - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/basic_main.rst.txt b/docs/_build/html/_sources/basic_main.rst.txt deleted file mode 100644 index 2bf930a..0000000 --- a/docs/_build/html/_sources/basic_main.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -basic\_main module -================== - -.. automodule:: basic_main - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/example.rst.txt b/docs/_build/html/_sources/example.rst.txt deleted file mode 100644 index 7789de1..0000000 --- a/docs/_build/html/_sources/example.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -example module -============== - -.. automodule:: example - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/_build/html/_sources/examples.rst.txt b/docs/_build/html/_sources/examples.rst.txt deleted file mode 100644 index 5386451..0000000 --- a/docs/_build/html/_sources/examples.rst.txt +++ /dev/null @@ -1,121 +0,0 @@ -Examples -======== - -Installation/Usage -****************** -Download the latest release in .tar.gz or .whl format and simply use pip install to install it:: - - $pip install PyCTBN-2.2.tar.gz - - -Implementing your own data importer -*********************************** -.. code-block:: python - - """This example demonstrates the implementation of a simple data importer the extends the class abstract importer to import data in csv format. - The net in exam has three ternary nodes and no prior net structure. - """ - - from PyCTBN import AbstractImporter - - class CSVImporter(AbstractImporter): - - def __init__(self, file_path): - self._df_samples_list = None - super(CSVImporter, self).__init__(file_path) - - def import_data(self): - self.read_csv_file() - self._sorter = self.build_sorter(self._df_samples_list[0]) - self.import_variables() - self.compute_row_delta_in_all_samples_frames(self._df_samples_list) - - def read_csv_file(self): - df = pd.read_csv(self._file_path) - df.drop(df.columns[[0]], axis=1, inplace=True) - self._df_samples_list = [df] - - def import_variables(self): - values_list = [3 for var in self._sorter] - # initialize dict of lists - data = {'Name':self._sorter, 'Value':values_list} - # Create the pandas DataFrame - self._df_variables = pd.DataFrame(data) - - def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List: - return list(sample_frame.columns)[1:] - - def dataset_id(self) -> object: - pass - -Parameters Estimation Example -***************************** - -.. code-block:: python - - from PyCTBN import JsonImporter - from PyCTBN import SamplePath - from PyCTBN import NetworkGraph - from PyCTBN import ParametersEstimator - - - def main(): - read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir - #import data - importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - importer.import_data(0) - #Create a SamplePath Obj passing an already filled AbstractImporter object - s1 = SamplePath(importer) - #Build The trajectries and the structural infos - s1.build_trajectories() - s1.build_structure() - print(s1.structure.edges) - print(s1.structure.nodes_values) - #From The Structure Object build the Graph - g = NetworkGraph(s1.structure) - #Select a node you want to estimate the parameters - node = g.nodes[2] - print("Node", node) - #Init the _graph specifically for THIS node - g.fast_init(node) - #Use SamplePath and Grpah to create a ParametersEstimator Object - p1 = ParametersEstimator(s1.trajectories, g) - #Init the peEst specifically for THIS node - p1.fast_init(node) - #Compute the parameters - sofc1 = p1.compute_parameters_for_node(node) - #The est CIMS are inside the resultant SetOfCIms Obj - print(sofc1.actual_cims) - -Structure Estimation Example -**************************** - -.. code-block:: python - - from PyCTBN import JsonImporter - from PyCTBN import SamplePath - from PyCTBN import StructureEstimator - - def structure_estimation_example(): - - # read the json files in ./data path - read_files = glob.glob(os.path.join('./data', "*.json")) - # initialize a JsonImporter object for the first file - importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name') - # import the data at index 0 of the outer json array - importer.import_data(0) - # construct a SamplePath Object passing a filled AbstractImporter - s1 = SamplePath(importer) - # build the trajectories - s1.build_trajectories() - # build the real structure - s1.build_structure() - # construct a StructureEstimator object - se1 = StructureEstimator(s1, 0.1, 0.1) - # call the ctpc algorithm - se1.ctpc_algorithm() - # the adjacency matrix of the estimated structure - print(se1.adjacency_matrix()) - # save results to a json file - se1.save_results() - diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt deleted file mode 100644 index 5bee55b..0000000 --- a/docs/_build/html/_sources/index.rst.txt +++ /dev/null @@ -1,23 +0,0 @@ -.. PyCTBN documentation master file, created by - sphinx-quickstart on Wed Mar 3 14:50:44 2021. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to PyCTBN's documentation! -================================== - -.. toctree:: - :maxdepth: 4 - :caption: Contents: - - pyctbn.legacy - examples - - - -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 aa7e7d5..0000000 --- a/docs/_build/html/_sources/modules.rst.txt +++ /dev/null @@ -1,9 +0,0 @@ -PyCTBN -====== - -.. toctree:: - :maxdepth: 4 - - PyCTBN - example - setup 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/_static/basic.css b/docs/_build/html/_static/basic.css deleted file mode 100644 index 24a49f0..0000000 --- a/docs/_build/html/_static/basic.css +++ /dev/null @@ -1,856 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2020 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 div.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, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.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 { - 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, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.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 { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- 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; -} - - -/* -- 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; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.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; -} - -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.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -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/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css deleted file mode 100644 index 7e17fb1..0000000 --- a/docs/_build/html/_static/css/badge_only.css +++ /dev/null @@ -1,2 +0,0 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}} -/*# sourceMappingURL=badge_only.css.map */ diff --git a/docs/_build/html/_static/css/darker.css b/docs/_build/html/_static/css/darker.css deleted file mode 100644 index ff14f7b..0000000 --- a/docs/_build/html/_static/css/darker.css +++ /dev/null @@ -1,93 +0,0 @@ -body, .entry-container, -.wy-nav-side, -.wy-side-nav-search, -.fundo-claro, -.wy-menu-vertical li.current, -.rst-content dl:not(.docutils) dt, -code, .rst-content tt, -.wy-side-nav-search > a:hover, .wy-side-nav-search .wy-dropdown > a:hover, -.wy-nav-content{ - background-color: rgb(24, 26, 27) !important; -} - -h2 a, h2 a:visited, h2 a:hover { - color: rgb(209, 206, 199); -} - -body { - color: rgb(209, 206, 199); -} - - -a, a:hover, a:visited { - color: rgb(113, 178, 234); -} - -.wy-menu-vertical a { - color: #b3b3b3; -} - -code, .rst-content tt { - color: #fff8f8; - border: 0; -} - -codeblock, pre.literal-block, .rst-content .literal-block, .rst-content pre.literal-block, div[class^="highlight"] { - border: 1px solid #000; - } - -.rst-content dl:not(.docutils) dl dt { - background: rgb(24, 26, 27) !important; -} - -.wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a { - color: #fcfcfc; -} - - -.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo, -.admonition.note code{ - background: #535050 !important; -} - -@media screen and (min-width: 768px) { -.wy-nav-side{ - width: 224px; -} -.wy-nav-content-wrap{ - margin-left: 200px; - background:rgb(24, 26, 27); -} -} - -.wy-nav-content-wrap{ - margin-left: 200px; - background: #343131; -} - -.hentry { - border-bottom: 2px solid rgb(24, 26, 27); -} - -.wy-alert.wy-alert-danger .wy-alert-title, .rst-content .wy-alert-danger.note .wy-alert-title, .rst-content .wy-alert-danger.attention .wy-alert-title, .rst-content .wy-alert-danger.caution .wy-alert-title, .rst-content .danger .wy-alert-title, .rst-content .error .wy-alert-title, .rst-content .wy-alert-danger.hint .wy-alert-title, .rst-content .wy-alert-danger.important .wy-alert-title, .rst-content .wy-alert-danger.tip .wy-alert-title, .rst-content .wy-alert-danger.warning .wy-alert-title, .rst-content .wy-alert-danger.seealso .wy-alert-title, .rst-content .wy-alert-danger.admonition-todo .wy-alert-title, .wy-alert.wy-alert-danger .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-danger .admonition-title, .rst-content .wy-alert-danger.note .admonition-title, .rst-content .wy-alert-danger.attention .admonition-title, .rst-content .wy-alert-danger.caution .admonition-title, .rst-content .danger .admonition-title, .rst-content .error .admonition-title, .rst-content .wy-alert-danger.hint .admonition-title, .rst-content .wy-alert-danger.important .admonition-title, .rst-content .wy-alert-danger.tip .admonition-title, .rst-content .wy-alert-danger.warning .admonition-title, .rst-content .wy-alert-danger.seealso .admonition-title, .rst-content .wy-alert-danger.admonition-todo .admonition-title { - background: #db655a; -} - -.wy-alert.wy-alert-danger, .rst-content .wy-alert-danger.note, .rst-content .wy-alert-danger.attention, .rst-content .wy-alert-danger.caution, .rst-content .danger, .rst-content .error, .rst-content .wy-alert-danger.hint, .rst-content .wy-alert-danger.important, .rst-content .wy-alert-danger.tip, .rst-content .wy-alert-danger.warning, .rst-content .wy-alert-danger.seealso, .rst-content .wy-alert-danger.admonition-todo { - background: #e18279; - color: #fff; -} - -.wy-alert.wy-alert-warning, .rst-content .wy-alert-warning.note, .rst-content .attention, .rst-content .caution, .rst-content .wy-alert-warning.danger, .rst-content .wy-alert-warning.error, .rst-content .wy-alert-warning.hint, .rst-content .wy-alert-warning.important, .rst-content .wy-alert-warning.tip, .rst-content .warning, .rst-content .wy-alert-warning.seealso, .rst-content .admonition-todo { - background: #ca9f52; - color: #fff; -} - -.wy-alert.wy-alert-warning .wy-alert-title, .rst-content .wy-alert-warning.note .wy-alert-title, .rst-content .attention .wy-alert-title, .rst-content .caution .wy-alert-title, .rst-content .wy-alert-warning.danger .wy-alert-title, .rst-content .wy-alert-warning.error .wy-alert-title, .rst-content .wy-alert-warning.hint .wy-alert-title, .rst-content .wy-alert-warning.important .wy-alert-title, .rst-content .wy-alert-warning.tip .wy-alert-title, .rst-content .warning .wy-alert-title, .rst-content .wy-alert-warning.seealso .wy-alert-title, .rst-content .admonition-todo .wy-alert-title, .wy-alert.wy-alert-warning .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-warning .admonition-title, .rst-content .wy-alert-warning.note .admonition-title, .rst-content .attention .admonition-title, .rst-content .caution .admonition-title, .rst-content .wy-alert-warning.danger .admonition-title, .rst-content .wy-alert-warning.error .admonition-title, .rst-content .wy-alert-warning.hint .admonition-title, .rst-content .wy-alert-warning.important .admonition-title, .rst-content .wy-alert-warning.tip .admonition-title, .rst-content .warning .admonition-title, .rst-content .wy-alert-warning.seealso .admonition-title, .rst-content .admonition-todo .admonition-title { - background: #ca7a35; -} - - -.wy-body-for-nav { - background-image: none !important; -} diff --git a/docs/_build/html/_static/css/pdj.css b/docs/_build/html/_static/css/pdj.css deleted file mode 100644 index 8445eca..0000000 --- a/docs/_build/html/_static/css/pdj.css +++ /dev/null @@ -1,494 +0,0 @@ -@import url("theme.css"); - -.wy-side-nav-search{ - background-color: #595C5E; -} - -.wy-side-nav-search input[type=text] { - border-color: #595C5E; -} - -@media screen and (min-width: 768px) { -.wy-nav-side{ - width: 224px; -} -.wy-nav-content-wrap{ - margin-left: 200px; - background: #343131; -} -} -@media screen and (max-width: 768px) { - .wy-nav-content{ - background-color: #343131; - } -} - -.wy-nav-top{ - background-color: #595C5E; -} -.wy-nav-content{ - padding-top: 1%; - max-width: 100%; - background-color: #343131; -} - -.rst-content{ - margin-left: -3%; -} - -pre{ - font-size: 0.9em; - padding: 1%; -} - -pre > span, -pre > p{ - margin: 0; - font-size: 1em; -} - -pre > span{ - margin: 0; -} - -.hentry{ - padding-top: 2%; - padding-bottom: 5%; - padding-left: 3%; - padding-right: 3%; - border-bottom: 2px solid #343131; -} - -.entry-container{ - background-color: #fff; /*#EAEAEA; */ - border-radius: 3px; - /* -webkit-box-shadow: 0 0 10px 8px rgba(50, 50, 50, 0.75); */ - /* -moz-box-shadow: 0 0 10px 8px rgba(50, 50, 50, 0.75); */ - /* box-shadow: 0 0 10px 8px rgba(50, 50, 50, 0.75); */ - -webkit-box-shadow: 0 0 10px 8px rgba(2, 2, 2, 0.36); - -moz-box-shadow: 0 0 10px 8px rgba(2, 2, 2, 0.36); - box-shadow: 0 0 10px 8px rgba(2, 2, 2, 0.36); - position: relative; - z-index: 210; -} - -.entry-content{ - margin-right: 3%; -} - -.wy-side-nav-search{ - padding:0.639em -} - - -.wy-menu-vertical a:hover{ - -webkit-box-shadow: 0 0 5px 5px rgba(20, 20, 20, 0.30); - -moz-box-shadow: 0 0 5px 5px rgba(20, 20, 20, 0.30); - box-shadow: 0 0 5px 5px rgba(20, 20, 20, 0.30); -} - -.wy-menu-vertical a{ - width: 90% -} - -#comments, -#comment-form{ - padding: 20px; -} - - -@media screen and (max-width: 1330px) { - .fancybox img{ - width: 310px; /* 88px / 633px */ - height: 206px; - } -} - -@media screen and (max-width: 1241px) { - .fancybox img{ - width: 280px; - height: 186px; - } -} - -@media screen and (max-width: 1154px) { - .fancybox img{ - width: 260px; - height: 173px; - } -} - -.expander { - position: absolute; - top: 5px; - left: 5px; - width: 16px; - height: 16px; - padding: 4px; - background: white url(/static/blog/img/fsbtn.png) center center no-repeat; - z-index: 99999; - cursor: pointer; -} - -/* 340 */ -/* .rst-content img { */ -/* margin-top: 8px; */ -/* margin-left: 10px; */ -/* margin-bottom: 5px; */ -/* } */ - -/* 260 */ -.rst-content .row img { - margin-top: 8px; - margin-left: 5px; - border-radius: 3px; - -webkit-box-shadow: 0 0 10px 5px rgba(2, 2, 2, 0.36); - -moz-box-shadow: 0 0 10px 5px /*rgba(50, 50, 50, 0.75)*/ rgba(2, 2, 2, 0.36); - box-shadow: 0 0 10px 5px rgba(2, 2, 2, 0.36); - -} - -.rst-content{ - z-index: 210; - margin-top: -60px; -} - -h2 a, -h2 a:visited, -h2 a:hover{ - color: #404040; -} - -.wy-menu-vertical li.on a, .wy-menu-vertical li.current>a { - color: #b3b3b3; - background: #4e4a4a; - box-shadow: 0 0 5px 5px rgba(20, 20, 20, 0.30); - border: none; -} - -.wy-menu-vertical li.current { - background: #343131; - border: none; -} - -.wy-menu-vertical li.current a{ - border:none -} - -.wy-alert.wy-alert-info .wy-alert-title, .rst-content .note .wy-alert-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .rst-content .note .admonition-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .seealso .admonition-title, .rst-content .wy-alert-info.admonition-todo .admonition-title { - background: #47494a; -} - -.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo { - background: #ececec; -} - -.wy-alert.wy-alert-danger, .rst-content .wy-alert-danger.note, .rst-content .wy-alert-danger.attention, .rst-content .wy-alert-danger.caution, .rst-content .danger, .rst-content .error, .rst-content .wy-alert-danger.hint, .rst-content .wy-alert-danger.important, .rst-content .wy-alert-danger.tip, .rst-content .wy-alert-danger.warning, .rst-content .wy-alert-danger.seealso, .rst-content .wy-alert-danger.admonition-todo { - background: #f0d5d2; -} - -.wy-menu-vertical li.on a:hover, -.wy-menu-vertical li.current>a:hover { - background: #4e4a4a; - -} - -.wy-menu-vertical li.current a:hover { - background: #4e4a4a; -} - -wy-menu-vertical li.toctree-l2.current>a { - color: #343131 !important; -} - -.wy-menu-vertical li.toctree-l2.current>a { - background: #343131; - padding: 0.4045em 2.427em; - box-shadow: none; -} - -.highlight{ - background: #000 !important; -} - -.highlight pre, -.highlight .mi, -.highlight .go{ - color: #57de4e !important; - font-size: 0.9em !important; -} - -.highlight .nt{ - color: #8080ec; -} - -.highlight .n, .highlight .nn, -.highlight .p, .highlight .o, -.highlight .nv, -.highlight .gp{ - color: #57de4e; -} - -.highlight .kn{ - color: #47ffff !important; -} - -.highlight .nc, -.highlight .nd{ - color: #1c909e; - font-weight: normal; -} - - -.highlight .k, .highlight .bp{ - color: #47ffff !important; -} - -.highlight .kc { - color: #ae39ff; - font-weight: normal !important; -} - -.highlight .nf, -.highlight .nb{ - color: #87CEFA; -} - -.highlight .s1, .highlight .s2, .highlight .s, -.highlight .sd, .highlight .si, -.highlight .se{ - color: #FDF5E6; -} - -.highlight .ow{ - color: #47ffff; -} - -.highlight .c1, -.highlight .c{ - color: #d80e04; -} - -.fundo-claro{ - height: 88px; - background-color: #595C5E; - margin-left: -10%; - margin-top: -1.1%; - margin-right: -10%; -} - - -@media screen and (max-width: 980px) { - pre{ - overflow-x: scroll; - } -} - - -@media screen and (max-width: 768px){ - .fundo-claro{ - display:none; - } - - .rst-content{ - z-index: 210; - margin-top: -20px; - } - -} - -.page{ - width: 3%; - float:left; -} - -.previous{ - width: 10% -} - -.paginator{ - margin-top: 50px; - padding-bottom: 25px; - padding-left: 20px; -} - -blockquote { - font-style: italic; - margin: 0 4.5em; - position: relative; -} - -blockquote, q { - quotes: "" ""; -} - -blockquote:before { - color: #807f7f; - content: "\201C"; - display: block; - font-family: "Droid Serif", "Times New Roman", serif; - font-size: 48px; - font-size: 4.8rem; - font-style: normal; - font-weight: bold; - line-height: 1; - position: absolute; - top: -15px; - left: -40px; -} - -.flatpage{ - -} - -.bkg-escuro{ - background-color: #343131; - color: #b3b3b3; -} - -.search-topo{ - float: right; - padding-right: 7%; - margin-top: -1.5; -} - -.fa-home:before, .icon-home:before { - content: url('../img/porao-branco.png'); -} - - -/* fundo preto */ - -.entry-container-escuro{ - background-color: #343131; - color: #b3b3b3; - padding: 15px; -} - -.entry-container-escuro h2, -.entry-container-escuro h2 a, -.entry-container-escuro h2 a:visited, -.entry-container-escuro h2 a:hover, -.entry-container-escuro h4, -.entry-container-escuro .entry-info abbr{ - color: #F9F4F4; -} - - -/* fim fundo preto */ - -.classe-correio textarea{ - width: 60%; - min-height: 300px; - margin-left: -39.5%; - border-radius: 15px; -} -.classe-correio { - background-color: #343131; -} - -.classe-correio .nome-email{ - width: 30%; - margin-bottom: 10px; -} - -/* cor dos links */ -a:visited{ - color: #2980B9; -} - -.wy-menu-vertical a { - color: #b3b3b3; -} - -.wy-side-nav-search>a, .wy-side-nav-search .wy-dropdown>a { - color: #fcfcfc; -} - -.highlight-yaml .nt{ - color: #eac648; -} - - -/* .rst-content dl:not(.docutils) { */ -/* margin-bottom: 24px; */ -/* background-color: #000; */ -/* } */ - -/* .rst-content dl:not(.docutils) code{ */ -/* color: #1bb41b; */ -/* border: none; */ -/* background-color: #000; */ -/* } */ - -.rst-content dl:not(.docutils) dt{ - background-color: #dcdfe2 !important; - border-top: 3px solid #969798; -} - -/* dl.method > dt{ */ -/* background-color: #000 !important; */ -/* color: #17deb0 !important; */ -/* border: 1px solid #858181 !important; */ -/* border-left: 3px solid #858181 !important; */ -/* } */ - -/* .sig-name{ */ -/* background-color: #000; */ -/* border: none; */ -/* color: #1bb41b; */ -/* font-size: 1.0em; */ -/* } */ - -/* .rst-content dl p, .rst-content dl table, .rst-content dl ul, .rst-content dl ol { */ -/* color: #FDF5E6 !important; */ -/* font-size: 0.95em !important; */ -/* } */ - -code, .rst-content tt { - color: #000; - font-weight: bold; - font-size: 85%; - border-color: #92989a; - } - -.reference code{ - color: #2980B9; - font-weight: bold; - font-size: 85%; - } - -.highlight-sh .nb, .highlight-sh .se{ - color: #57de4e !important; -} - -#rtd-search-form { - width: 85%; -} - -footer { - color: #999; - z-index: 211; - position: relative; - margin-top: 10px; -} - -.highlight-cfg .k, .highlight .bp { - color: #57de4e !important; - font-weight: normal; -} - -.highlight-cfg .na { - color: #eac648; -} - -.highlight-cfg .n, -.highlight-cfg .nn, -.highlight-cfg .p, -.highlight-cfg .o, -.highlight-cfg .nv, -.highlight-cfg .gp, -.highlight-cfg .s { - color: #57de4e; - font-weight: normal; -} diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css deleted file mode 100644 index 390d706..0000000 --- a/docs/_build/html/_static/css/theme.css +++ /dev/null @@ -1,5 +0,0 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! - * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:0.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{width:36px;height:12px;margin:12px 0;position:relative;border-radius:4px;background:#ccc;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:before{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.wy-switch:after{content:"false";position:absolute;left:48px;display:block;font-size:12px;color:#ccc}.wy-switch.active{background:#1e8449}.wy-switch.active:before{left:24px;background:#27AE60}.wy-switch.active:after{content:"true"}.wy-switch.disabled,.wy-switch.active.disabled{cursor:not-allowed}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9B59B6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#EAF2F5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980B9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980B9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:fixed;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center} -/*# sourceMappingURL=theme.css.map */ diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js deleted file mode 100644 index 7d88f80..0000000 --- a/docs/_build/html/_static/doctools.js +++ /dev/null @@ -1,316 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2020 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 - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * 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 a7d0fd2..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: '2.0', - 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 a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/fonts/fontawesome-webfont.eot deleted file mode 100644 index 7c79c6a6bc9a128a2a8eaffbe49a4338625fdbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38205 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 E0QL`y%>V!Z diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/fonts/fontawesome-webfont.svg deleted file mode 100644 index 45fdf33..0000000 --- a/docs/_build/html/_static/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/_static/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/fonts/fontawesome-webfont.ttf deleted file mode 100644 index e89738de5eaf8fca33a2f2cdc5cb4929caa62b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80652 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 qx{Kk=rVu5YQ9XR<GPS>b$X_& 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 z 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
V$fDV|Iw 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 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( " - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

basic_main module

-
- - -
-
- - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/example.html b/docs/_build/html/example.html deleted file mode 100644 index cacfcd3..0000000 --- a/docs/_build/html/example.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - example module — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

example module

-
- - -
-
- - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/examples.html b/docs/_build/html/examples.html deleted file mode 100644 index f14c572..0000000 --- a/docs/_build/html/examples.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - Examples — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

Examples

-
-

Installation/Usage

-

Download the latest release in .tar.gz or .whl format and simply use pip install to install it:

-
$pip install PyCTBN-2.2.tar.gz
-
-
-
-
-

Implementing your own data importer

-
"""This example demonstrates the implementation of a simple data importer the extends the class abstract importer to import data in csv format.
-The net in exam has three ternary nodes and no prior net structure.
-"""
-
-from PyCTBN import AbstractImporter
-
-class CSVImporter(AbstractImporter):
-
-    def __init__(self, file_path):
-        self._df_samples_list = None
-        super(CSVImporter, self).__init__(file_path)
-
-    def import_data(self):
-        self.read_csv_file()
-        self._sorter = self.build_sorter(self._df_samples_list[0])
-        self.import_variables()
-        self.compute_row_delta_in_all_samples_frames(self._df_samples_list)
-
-    def read_csv_file(self):
-        df = pd.read_csv(self._file_path)
-        df.drop(df.columns[[0]], axis=1, inplace=True)
-        self._df_samples_list = [df]
-
-    def import_variables(self):
-        values_list = [3 for var in self._sorter]
-        # initialize dict of lists
-        data = {'Name':self._sorter, 'Value':values_list}
-        # Create the pandas DataFrame
-        self._df_variables = pd.DataFrame(data)
-
-    def build_sorter(self, sample_frame: pd.DataFrame) -> typing.List:
-        return list(sample_frame.columns)[1:]
-
-    def dataset_id(self) -> object:
-        pass
-
-
-
-
-

Parameters Estimation Example

-
from PyCTBN import JsonImporter
-from PyCTBN import SamplePath
-from PyCTBN import NetworkGraph
-from PyCTBN import ParametersEstimator
-
-
-def main():
-    read_files = glob.glob(os.path.join('./data', "*.json")) #Take all json files in this dir
-    #import data
-    importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name')
-    importer.import_data(0)
-    #Create a SamplePath Obj passing an already filled AbstractImporter object
-    s1 = SamplePath(importer)
-    #Build The trajectries and the structural infos
-    s1.build_trajectories()
-    s1.build_structure()
-    print(s1.structure.edges)
-    print(s1.structure.nodes_values)
-    #From The Structure Object build the Graph
-    g = NetworkGraph(s1.structure)
-    #Select a node you want to estimate the parameters
-    node = g.nodes[2]
-    print("Node", node)
-    #Init the _graph specifically for THIS node
-    g.fast_init(node)
-    #Use SamplePath and Grpah to create a ParametersEstimator Object
-    p1 = ParametersEstimator(s1.trajectories, g)
-    #Init the peEst specifically for THIS node
-    p1.fast_init(node)
-    #Compute the parameters
-    sofc1 = p1.compute_parameters_for_node(node)
-    #The est CIMS are inside the resultant SetOfCIms Obj
-    print(sofc1.actual_cims)
-
-
-
-
-

Structure Estimation Example

-
from PyCTBN import JsonImporter
-from PyCTBN import SamplePath
-from PyCTBN import StructureEstimator
-
-def structure_estimation_example():
-
-    # read the json files in ./data path
-    read_files = glob.glob(os.path.join('./data', "*.json"))
-    # initialize a JsonImporter object for the first file
-    importer = JsonImporter(read_files[0], 'samples', 'dyn.str', 'variables', 'Time', 'Name')
-    # import the data at index 0 of the outer json array
-    importer.import_data(0)
-    # construct a SamplePath Object passing a filled AbstractImporter
-    s1 = SamplePath(importer)
-    # build the trajectories
-    s1.build_trajectories()
-    # build the real structure
-    s1.build_structure()
-    # construct a StructureEstimator object
-    se1 = StructureEstimator(s1, 0.1, 0.1)
-    # call the ctpc algorithm
-    se1.ctpc_algorithm()
-    # the adjacency matrix of the estimated structure
-    print(se1.adjacency_matrix())
-    # save results to a json file
-    se1.save_results()
-
-
-
-
- - -
-
- - - - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html deleted file mode 100644 index f5e50fc..0000000 --- a/docs/_build/html/genindex.html +++ /dev/null @@ -1,1457 +0,0 @@ - - - - - - - - - - - Index — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
- -

Index

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

A

- - - -
- -

B

- - - -
- -

C

- - - -
- -

D

- - - -
- -

E

- - - -
- -

F

- - - -
- -

G

- - - -
- -

H

- - - -
- -

I

- - - -
- -

J

- - - -
- -

M

- - - -
- -

N

- - - -
- -

O

- - - -
- -

P

- - - -
    -
  • - pyctbn.legacy.utility.cache - -
  • -
  • - pyctbn.legacy.utility.json_exporter - -
  • -
  • - pyctbn.legacy.utility.json_importer - -
  • -
  • - pyctbn.legacy.utility.sample_importer - -
  • -
  • - PyCTBN.tests - -
  • -
  • - PyCTBN.tests.estimators - -
  • -
  • - PyCTBN.tests.estimators.test_parameters_estimator - -
  • -
  • - PyCTBN.tests.estimators.test_structure_constraint_based_estimator - -
  • -
  • - PyCTBN.tests.estimators.test_structure_estimator - -
  • -
  • - PyCTBN.tests.estimators.test_structure_score_based_estimator - -
  • -
  • - PyCTBN.tests.optimizers - -
  • -
  • - PyCTBN.tests.optimizers.test_hill_climbing_search - -
  • -
  • - PyCTBN.tests.optimizers.test_tabu_search - -
  • -
  • - PyCTBN.tests.structure_graph - -
  • -
  • - PyCTBN.tests.structure_graph.test_cim - -
  • -
  • - PyCTBN.tests.structure_graph.test_networkgenerator - -
  • -
  • - PyCTBN.tests.structure_graph.test_networkgraph - -
  • -
  • - PyCTBN.tests.structure_graph.test_sample_path - -
  • -
  • - PyCTBN.tests.structure_graph.test_setofcims - -
  • -
  • - PyCTBN.tests.structure_graph.test_structure - -
  • -
  • - PyCTBN.tests.structure_graph.test_trajectory - -
  • -
  • - PyCTBN.tests.structure_graph.test_trajectorygenerator - -
  • -
  • - PyCTBN.tests.utility - -
  • -
  • - PyCTBN.tests.utility.test_cache - -
  • -
  • - PyCTBN.tests.utility.test_json_importer - -
  • -
  • - PyCTBN.tests.utility.test_sample_importer - -
  • -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

V

- - - -
- -

W

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ 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 130fd2f..0000000 --- a/docs/_build/html/index.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - Welcome to PyCTBN’s documentation! — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

Welcome to PyCTBN’s documentation!

-
-

Contents:

- -
-
-
-

Indices and tables

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ 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 4740c2e..0000000 --- a/docs/_build/html/modules.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - - - - - - PyCTBN — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

PyCTBN

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

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ 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 d3f8181e0820dfa32dfdf7ecfc72de5e384faea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3216 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 C+!dz) diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html deleted file mode 100644 index 7440a56..0000000 --- a/docs/_build/html/py-modindex.html +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - Python Module Index — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
- -

Python Module Index

- -
- p -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- p
- PyCTBN -
    - pyctbn.legacy -
    - pyctbn.legacy.estimators -
    - pyctbn.legacy.estimators.fam_score_calculator -
    - pyctbn.legacy.estimators.parameters_estimator -
    - pyctbn.legacy.estimators.structure_constraint_based_estimator -
    - pyctbn.legacy.estimators.structure_estimator -
    - pyctbn.legacy.estimators.structure_score_based_estimator -
    - pyctbn.legacy.optimizers -
    - pyctbn.legacy.optimizers.constraint_based_optimizer -
    - pyctbn.legacy.optimizers.hill_climbing_search -
    - pyctbn.legacy.optimizers.optimizer -
    - pyctbn.legacy.optimizers.tabu_search -
    - pyctbn.legacy.structure_graph -
    - pyctbn.legacy.structure_graph.conditional_intensity_matrix -
    - pyctbn.legacy.structure_graph.network_generator -
    - pyctbn.legacy.structure_graph.network_graph -
    - pyctbn.legacy.structure_graph.sample_path -
    - pyctbn.legacy.structure_graph.set_of_cims -
    - pyctbn.legacy.structure_graph.structure -
    - pyctbn.legacy.structure_graph.trajectory -
    - pyctbn.legacy.structure_graph.trajectory_generator -
    - pyctbn.legacy.utility -
    - pyctbn.legacy.utility.abstract_exporter -
    - pyctbn.legacy.utility.abstract_importer -
    - pyctbn.legacy.utility.cache -
    - pyctbn.legacy.utility.json_exporter -
    - pyctbn.legacy.utility.json_importer -
    - pyctbn.legacy.utility.sample_importer -
    - PyCTBN.tests -
    - PyCTBN.tests.estimators -
    - PyCTBN.tests.estimators.test_parameters_estimator -
    - PyCTBN.tests.estimators.test_structure_constraint_based_estimator -
    - PyCTBN.tests.estimators.test_structure_estimator -
    - PyCTBN.tests.estimators.test_structure_score_based_estimator -
    - PyCTBN.tests.optimizers -
    - PyCTBN.tests.optimizers.test_hill_climbing_search -
    - PyCTBN.tests.optimizers.test_tabu_search -
    - PyCTBN.tests.structure_graph -
    - PyCTBN.tests.structure_graph.test_cim -
    - PyCTBN.tests.structure_graph.test_networkgenerator -
    - PyCTBN.tests.structure_graph.test_networkgraph -
    - PyCTBN.tests.structure_graph.test_sample_path -
    - PyCTBN.tests.structure_graph.test_setofcims -
    - PyCTBN.tests.structure_graph.test_structure -
    - PyCTBN.tests.structure_graph.test_trajectory -
    - PyCTBN.tests.structure_graph.test_trajectorygenerator -
    - PyCTBN.tests.utility -
    - PyCTBN.tests.utility.test_cache -
    - PyCTBN.tests.utility.test_json_importer -
    - PyCTBN.tests.utility.test_sample_importer -
- - -
-
- - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ 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 0c85d55..0000000 --- a/docs/_build/html/search.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - Search — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
- - - -
- -
- -
-
- - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 c04fb3c..0000000 --- a/docs/_build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["PyCTBN","pyctbn.legacy","pyctbn.legacy.estimators","pyctbn.legacy.optimizers","pyctbn.legacy.structure_graph","pyctbn.legacy.utility","PyCTBN.tests","PyCTBN.tests.estimators","PyCTBN.tests.optimizers","PyCTBN.tests.structure_graph","PyCTBN.tests.utility","basic_main","example","examples","index","modules","setup"],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":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["PyCTBN.rst","pyctbn.legacy.rst","pyctbn.legacy.estimators.rst","pyctbn.legacy.optimizers.rst","pyctbn.legacy.structure_graph.rst","pyctbn.legacy.utility.rst","PyCTBN.tests.rst","PyCTBN.tests.estimators.rst","PyCTBN.tests.optimizers.rst","PyCTBN.tests.structure_graph.rst","PyCTBN.tests.utility.rst","basic_main.rst","example.rst","examples.rst","index.rst","modules.rst","setup.rst"],objects:{"":{PyCTBN:[0,0,0,"-"]},"pyctbn.legacy":{estimators:[2,0,0,"-"],optimizers:[3,0,0,"-"],structure_graph:[4,0,0,"-"],utility:[5,0,0,"-"]},"pyctbn.legacy.estimators":{fam_score_calculator:[2,0,0,"-"],parameters_estimator:[2,0,0,"-"],structure_constraint_based_estimator:[2,0,0,"-"],structure_estimator:[2,0,0,"-"],structure_score_based_estimator:[2,0,0,"-"]},"pyctbn.legacy.estimators.fam_score_calculator":{FamScoreCalculator:[2,1,1,""]},"pyctbn.legacy.estimators.fam_score_calculator.FamScoreCalculator":{get_fam_score:[2,2,1,""],marginal_likelihood_q:[2,2,1,""],marginal_likelihood_theta:[2,2,1,""],single_cim_xu_marginal_likelihood_q:[2,2,1,""],single_cim_xu_marginal_likelihood_theta:[2,2,1,""],single_internal_cim_xxu_marginal_likelihood_theta:[2,2,1,""],variable_cim_xu_marginal_likelihood_q:[2,2,1,""],variable_cim_xu_marginal_likelihood_theta:[2,2,1,""]},"pyctbn.legacy.estimators.parameters_estimator":{ParametersEstimator:[2,1,1,""]},"pyctbn.legacy.estimators.parameters_estimator.ParametersEstimator":{compute_parameters_for_node:[2,2,1,""],compute_state_res_time_for_node:[2,2,1,""],compute_state_transitions_for_a_node:[2,2,1,""],fast_init:[2,2,1,""]},"pyctbn.legacy.estimators.structure_constraint_based_estimator":{StructureConstraintBasedEstimator:[2,1,1,""]},"pyctbn.legacy.estimators.structure_constraint_based_estimator.StructureConstraintBasedEstimator":{complete_test:[2,2,1,""],compute_thumb_value:[2,2,1,""],ctpc_algorithm:[2,2,1,""],estimate_structure:[2,2,1,""],independence_test:[2,2,1,""],one_iteration_of_CTPC_algorithm:[2,2,1,""]},"pyctbn.legacy.estimators.structure_estimator":{StructureEstimator:[2,1,1,""]},"pyctbn.legacy.estimators.structure_estimator.StructureEstimator":{adjacency_matrix:[2,2,1,""],build_complete_graph:[2,2,1,""],build_removable_edges_matrix:[2,2,1,""],estimate_structure:[2,2,1,""],generate_possible_sub_sets_of_size:[2,2,1,""],save_plot_estimated_structure_graph:[2,2,1,""],save_results:[2,2,1,""],spurious_edges:[2,2,1,""]},"pyctbn.legacy.estimators.structure_score_based_estimator":{StructureScoreBasedEstimator:[2,1,1,""]},"pyctbn.legacy.estimators.structure_score_based_estimator.StructureScoreBasedEstimator":{estimate_parents:[2,2,1,""],estimate_structure:[2,2,1,""],get_score_from_graph:[2,2,1,""]},"pyctbn.legacy.optimizers":{constraint_based_optimizer:[3,0,0,"-"],hill_climbing_search:[3,0,0,"-"],optimizer:[3,0,0,"-"],tabu_search:[3,0,0,"-"]},"pyctbn.legacy.optimizers.constraint_based_optimizer":{ConstraintBasedOptimizer:[3,1,1,""]},"pyctbn.legacy.optimizers.constraint_based_optimizer.ConstraintBasedOptimizer":{optimize_structure:[3,2,1,""]},"pyctbn.legacy.optimizers.hill_climbing_search":{HillClimbing:[3,1,1,""]},"pyctbn.legacy.optimizers.hill_climbing_search.HillClimbing":{optimize_structure:[3,2,1,""]},"pyctbn.legacy.optimizers.optimizer":{Optimizer:[3,1,1,""]},"pyctbn.legacy.optimizers.optimizer.Optimizer":{optimize_structure:[3,2,1,""]},"pyctbn.legacy.optimizers.tabu_search":{TabuSearch:[3,1,1,""]},"pyctbn.legacy.optimizers.tabu_search.TabuSearch":{optimize_structure:[3,2,1,""]},"pyctbn.legacy.structure_graph":{conditional_intensity_matrix:[4,0,0,"-"],network_generator:[4,0,0,"-"],network_graph:[4,0,0,"-"],sample_path:[4,0,0,"-"],set_of_cims:[4,0,0,"-"],structure:[4,0,0,"-"],trajectory:[4,0,0,"-"],trajectory_generator:[4,0,0,"-"]},"pyctbn.legacy.structure_graph.conditional_intensity_matrix":{ConditionalIntensityMatrix:[4,1,1,""]},"pyctbn.legacy.structure_graph.conditional_intensity_matrix.ConditionalIntensityMatrix":{cim:[4,2,1,""],compute_cim_coefficients:[4,2,1,""],state_residence_times:[4,2,1,""],state_transition_matrix:[4,2,1,""]},"pyctbn.legacy.structure_graph.network_generator":{NetworkGenerator:[4,1,1,""]},"pyctbn.legacy.structure_graph.network_generator.NetworkGenerator":{cims:[4,2,1,""],dyn_str:[4,2,1,""],generate_cims:[4,2,1,""],generate_graph:[4,2,1,""],graph:[4,2,1,""],variables:[4,2,1,""]},"pyctbn.legacy.structure_graph.network_graph":{NetworkGraph:[4,1,1,""]},"pyctbn.legacy.structure_graph.network_graph.NetworkGraph":{add_edges:[4,2,1,""],add_nodes:[4,2,1,""],build_p_comb_structure_for_a_node:[4,2,1,""],build_time_columns_filtering_for_a_node:[4,2,1,""],build_time_scalar_indexing_structure_for_a_node:[4,2,1,""],build_transition_filtering_for_a_node:[4,2,1,""],build_transition_scalar_indexing_structure_for_a_node:[4,2,1,""],clear_indexing_filtering_structures:[4,2,1,""],edges:[4,2,1,""],fast_init:[4,2,1,""],get_node_indx:[4,2,1,""],get_ordered_by_indx_set_of_parents:[4,2,1,""],get_parents_by_id:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],has_edge:[4,2,1,""],nodes:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_values:[4,2,1,""],p_combs:[4,2,1,""],remove_edges:[4,2,1,""],remove_node:[4,2,1,""],time_filtering:[4,2,1,""],time_scalar_indexing_strucure:[4,2,1,""],transition_filtering:[4,2,1,""],transition_scalar_indexing_structure:[4,2,1,""]},"pyctbn.legacy.structure_graph.sample_path":{SamplePath:[4,1,1,""]},"pyctbn.legacy.structure_graph.sample_path.SamplePath":{build_structure:[4,2,1,""],build_trajectories:[4,2,1,""],clear_memory:[4,2,1,""],has_prior_net_structure:[4,2,1,""],structure:[4,2,1,""],total_variables_count:[4,2,1,""],trajectories:[4,2,1,""]},"pyctbn.legacy.structure_graph.set_of_cims":{SetOfCims:[4,1,1,""]},"pyctbn.legacy.structure_graph.set_of_cims.SetOfCims":{actual_cims:[4,2,1,""],build_cims:[4,2,1,""],build_times_and_transitions_structures:[4,2,1,""],filter_cims_with_mask:[4,2,1,""],get_cims_number:[4,2,1,""],p_combs:[4,2,1,""]},"pyctbn.legacy.structure_graph.structure":{Structure:[4,1,1,""]},"pyctbn.legacy.structure_graph.structure.Structure":{add_edge:[4,2,1,""],clean_structure_edges:[4,2,1,""],contains_edge:[4,2,1,""],edges:[4,2,1,""],get_node_id:[4,2,1,""],get_node_indx:[4,2,1,""],get_positional_node_indx:[4,2,1,""],get_states_number:[4,2,1,""],nodes_indexes:[4,2,1,""],nodes_labels:[4,2,1,""],nodes_values:[4,2,1,""],remove_edge:[4,2,1,""],remove_node:[4,2,1,""],total_variables_number:[4,2,1,""]},"pyctbn.legacy.structure_graph.trajectory":{Trajectory:[4,1,1,""]},"pyctbn.legacy.structure_graph.trajectory.Trajectory":{complete_trajectory:[4,2,1,""],size:[4,2,1,""],times:[4,2,1,""],trajectory:[4,2,1,""]},"pyctbn.legacy.structure_graph.trajectory_generator":{TrajectoryGenerator:[4,1,1,""]},"pyctbn.legacy.structure_graph.trajectory_generator.TrajectoryGenerator":{CTBN_Sample:[4,2,1,""],multi_trajectory:[4,2,1,""],worker:[4,2,1,""]},"pyctbn.legacy.utility":{abstract_exporter:[5,0,0,"-"],abstract_importer:[5,0,0,"-"],cache:[5,0,0,"-"],json_exporter:[5,0,0,"-"],json_importer:[5,0,0,"-"],sample_importer:[5,0,0,"-"]},"pyctbn.legacy.utility.abstract_exporter":{AbstractExporter:[5,1,1,""]},"pyctbn.legacy.utility.abstract_exporter.AbstractExporter":{add_trajectory:[5,2,1,""],out_file:[5,2,1,""]},"pyctbn.legacy.utility.abstract_importer":{AbstractImporter:[5,1,1,""]},"pyctbn.legacy.utility.abstract_importer.AbstractImporter":{build_list_of_samples_array:[5,2,1,""],build_sorter:[5,2,1,""],clear_concatenated_frame:[5,2,1,""],compute_row_delta_in_all_samples_frames:[5,2,1,""],compute_row_delta_sigle_samples_frame:[5,2,1,""],concatenated_samples:[5,2,1,""],dataset_id:[5,2,1,""],file_path:[5,2,1,""],sorter:[5,2,1,""],structure:[5,2,1,""],variables:[5,2,1,""]},"pyctbn.legacy.utility.cache":{Cache:[5,1,1,""]},"pyctbn.legacy.utility.cache.Cache":{clear:[5,2,1,""],find:[5,2,1,""],put:[5,2,1,""]},"pyctbn.legacy.utility.json_exporter":{JsonExporter:[5,1,1,""]},"pyctbn.legacy.utility.json_exporter.JsonExporter":{cims_to_json:[5,2,1,""],out_file:[5,2,1,""]},"pyctbn.legacy.utility.json_importer":{JsonImporter:[5,1,1,""]},"pyctbn.legacy.utility.json_importer.JsonImporter":{build_sorter:[5,2,1,""],clear_data_frame_list:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""],import_sampled_cims:[5,2,1,""],import_structure:[5,2,1,""],import_trajectories:[5,2,1,""],import_variables:[5,2,1,""],normalize_trajectories:[5,2,1,""],one_level_normalizing:[5,2,1,""],read_json_file:[5,2,1,""]},"pyctbn.legacy.utility.sample_importer":{SampleImporter:[5,1,1,""]},"pyctbn.legacy.utility.sample_importer.SampleImporter":{build_sorter:[5,2,1,""],dataset_id:[5,2,1,""],import_data:[5,2,1,""]},"PyCTBN.tests":{estimators:[7,0,0,"-"],optimizers:[8,0,0,"-"],structure_graph:[9,0,0,"-"],utility:[10,0,0,"-"]},"PyCTBN.tests.estimators":{test_parameters_estimator:[7,0,0,"-"],test_structure_constraint_based_estimator:[7,0,0,"-"],test_structure_estimator:[7,0,0,"-"],test_structure_score_based_estimator:[7,0,0,"-"]},"PyCTBN.tests.estimators.test_parameters_estimator":{TestParametersEstimatior:[7,1,1,""]},"PyCTBN.tests.estimators.test_parameters_estimator.TestParametersEstimatior":{aux_import_sampled_cims:[7,2,1,""],cim_equality_test:[7,2,1,""],equality_of_cims_of_node:[7,2,1,""],setUpClass:[7,2,1,""],test_compute_parameters_for_node:[7,2,1,""],test_fast_init:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator":{TestStructureConstraintBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_constraint_based_estimator.TestStructureConstraintBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_estimator":{TestStructureEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_estimator.TestStructureEstimator":{setUpClass:[7,2,1,""],test_adjacency_matrix:[7,2,1,""],test_build_complete_graph:[7,2,1,""],test_build_removable_edges_matrix:[7,2,1,""],test_generate_possible_sub_sets_of_size:[7,2,1,""],test_init:[7,2,1,""],test_save_plot_estimated_graph:[7,2,1,""],test_save_results:[7,2,1,""],test_time:[7,2,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator":{TestStructureScoreBasedEstimator:[7,1,1,""]},"PyCTBN.tests.estimators.test_structure_score_based_estimator.TestStructureScoreBasedEstimator":{setUpClass:[7,2,1,""],test_structure_1:[7,2,1,""],test_structure_2:[7,2,1,""],test_structure_3:[7,2,1,""],test_structure_monoprocesso:[7,2,1,""]},"PyCTBN.tests.optimizers":{test_hill_climbing_search:[8,0,0,"-"],test_tabu_search:[8,0,0,"-"]},"PyCTBN.tests.optimizers.test_hill_climbing_search":{TestHillClimbingSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_hill_climbing_search.TestHillClimbingSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.optimizers.test_tabu_search":{TestTabuSearch:[8,1,1,""]},"PyCTBN.tests.optimizers.test_tabu_search.TestTabuSearch":{setUpClass:[8,2,1,""],test_structure:[8,2,1,""],test_structure_3:[8,2,1,""]},"PyCTBN.tests.structure_graph":{test_cim:[9,0,0,"-"],test_networkgenerator:[9,0,0,"-"],test_networkgraph:[9,0,0,"-"],test_sample_path:[9,0,0,"-"],test_setofcims:[9,0,0,"-"],test_structure:[9,0,0,"-"],test_trajectory:[9,0,0,"-"],test_trajectorygenerator:[9,0,0,"-"]},"PyCTBN.tests.structure_graph.test_cim":{TestConditionalIntensityMatrix:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_cim.TestConditionalIntensityMatrix":{setUpClass:[9,2,1,""],test_compute_cim_coefficients:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator":{TestNetworkGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgenerator.TestNetworkGenerator":{test_generate_cims:[9,2,1,""],test_generate_graph:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph":{TestNetworkGraph:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_networkgraph.TestNetworkGraph":{aux_build_p_combs_structure:[9,2,1,""],aux_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],aux_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],aux_build_transition_columns_filtering_structure:[9,2,1,""],aux_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_add_edges:[9,2,1,""],test_add_nodes:[9,2,1,""],test_build_p_combs_structure:[9,2,1,""],test_build_time_columns_filtering_structure_for_a_node:[9,2,1,""],test_build_time_scalar_indexing_structure_for_a_node:[9,2,1,""],test_build_transition_columns_filtering_structure:[9,2,1,""],test_build_transition_scalar_indexing_structure_for_a_node:[9,2,1,""],test_fast_init:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_ordered_by_indx_set_of_parents:[9,2,1,""],test_get_parents_by_id:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_sample_path":{TestSamplePath:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_sample_path.TestSamplePath":{setUpClass:[9,2,1,""],test_buid_samplepath_no_concatenated_samples:[9,2,1,""],test_buid_samplepath_no_variables:[9,2,1,""],test_build_saplepath_no_prior_net_structure:[9,2,1,""],test_build_structure:[9,2,1,""],test_build_structure_bad_sorter:[9,2,1,""],test_build_trajectories:[9,2,1,""],test_init:[9,2,1,""],test_init_not_filled_dataframse:[9,2,1,""],test_init_not_initialized_importer:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_setofcims":{TestSetOfCims:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_setofcims.TestSetOfCims":{another_filtering_method:[9,2,1,""],aux_test_build_cims:[9,2,1,""],aux_test_init:[9,2,1,""],build_p_comb_structure_for_a_node:[9,2,1,""],setUpClass:[9,2,1,""],test_build_cims:[9,2,1,""],test_filter_cims_with_mask:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_structure":{TestStructure:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_structure.TestStructure":{setUpClass:[9,2,1,""],test_edges_operations:[9,2,1,""],test_equality:[9,2,1,""],test_get_node_id:[9,2,1,""],test_get_node_indx:[9,2,1,""],test_get_positional_node_indx:[9,2,1,""],test_get_states_number:[9,2,1,""],test_init:[9,2,1,""],test_repr:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectory":{TestTrajectory:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectory.TestTrajectory":{setUpClass:[9,2,1,""],test_init:[9,2,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator":{TestTrajectoryGenerator:[9,1,1,""]},"PyCTBN.tests.structure_graph.test_trajectorygenerator.TestTrajectoryGenerator":{setUpClass:[9,2,1,""],test_generated_trajectory:[9,2,1,""],test_generated_trajectory_max_tr:[9,2,1,""],test_init:[9,2,1,""],test_multi_trajectory:[9,2,1,""]},"PyCTBN.tests.utility":{test_cache:[10,0,0,"-"],test_json_importer:[10,0,0,"-"],test_sample_importer:[10,0,0,"-"]},"PyCTBN.tests.utility.test_cache":{TestCache:[10,1,1,""]},"PyCTBN.tests.utility.test_cache.TestCache":{test_clear:[10,2,1,""],test_find:[10,2,1,""],test_init:[10,2,1,""],test_put:[10,2,1,""]},"PyCTBN.tests.utility.test_json_importer":{TestJsonImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_json_importer.TestJsonImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_build_sorter:[10,2,1,""],test_clear_concatenated_frame:[10,2,1,""],test_clear_data_frame_list:[10,2,1,""],test_compute_row_delta_in_all_frames:[10,2,1,""],test_compute_row_delta_in_all_frames_not_init_sorter:[10,2,1,""],test_compute_row_delta_single_samples_frame:[10,2,1,""],test_dataset_id:[10,2,1,""],test_file_path:[10,2,1,""],test_import_data:[10,2,1,""],test_import_sampled_cims:[10,2,1,""],test_import_structure:[10,2,1,""],test_import_variables:[10,2,1,""],test_init:[10,2,1,""],test_normalize_trajectories:[10,2,1,""],test_normalize_trajectories_wrong_indx:[10,2,1,""],test_normalize_trajectories_wrong_key:[10,2,1,""],test_read_json_file_found:[10,2,1,""],test_read_json_file_not_found:[10,2,1,""]},"PyCTBN.tests.utility.test_sample_importer":{TestSampleImporter:[10,1,1,""]},"PyCTBN.tests.utility.test_sample_importer.TestSampleImporter":{ordered:[10,2,1,""],setUpClass:[10,2,1,""],test_init:[10,2,1,""],test_order:[10,2,1,""]},PyCTBN:{PyCTBN:[1,0,0,"-"],tests:[6,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method"},terms:{"abstract":[2,3,4,5,13],"boolean":[2,4],"case":[4,7,8,9,10],"class":[2,3,4,5,7,8,9,10,13],"default":[2,3,5],"float":[2,4],"function":2,"import":[4,5,14],"int":[2,3,4,5],"new":5,"null":2,"return":[2,3,4,5,9,13],"static":[2,4],"super":13,"true":[2,13],"var":13,For:4,HAS:5,Has:[2,4],NOT:2,The:[2,4,5,13],Use:[2,13],__actual_cach:5,__generate_cim:4,__init__:13,__list_of_sets_of_par:5,_actual_cim:4,_actual_trajectori:4,_aggregated_info_about_nodes_par:4,_array_indx:5,_cach:2,_cim:4,_complete_graph:2,_df_samples_list:[5,13],_df_structur:5,_df_variabl:[5,13],_dyn_cim:5,_dyn_str:5,_file_path:13,_generated_trajectori:4,_graph:[4,13],_import:4,_indx:4,_label:4,_net_graph:2,_node:2,_node_id:4,_nodes_indx:2,_nodes_v:2,_p_combs_structur:4,_parent:4,_raw_data:5,_sample_path:2,_single_set_of_cim:2,_sorter:[5,13],_state_residence_tim:4,_structur:4,_structure_label:5,_time:4,_time_filt:4,_time_scalar_indexing_structur:4,_total_variables_count:4,_total_variables_numb:4,_trajectori:[4,5],_transition_filt:4,_transition_matric:4,_transition_scalar_indexing_structur:4,_val:4,_variabl:5,_variables_label:5,_vname:4,abc:[3,5],about:[3,4],abstract_export:[0,1,14],abstract_import:[0,1,4,14],abstractexport:5,abstractimport:[4,5,13],accord:4,act:5,actual:[2,4],actual_cim:[4,13],add:[4,5],add_edg:4,add_nod:4,add_trajectori:5,added:[2,4,5],adding:4,addit:2,adjac:[2,13],adjacency_matrix:[2,13],after:[4,5],against:2,aggreg:4,algorithm:[2,3,13],all:[2,3,4,5,9,13],allow:4,along:5,alpha_xu:2,alpha_xxu:2,alreadi:[5,13],also:[2,4],ani:[2,3],anoth:4,another_filtering_method:9,approach:2,arc:5,arrai:[2,4,5,13],assign:2,assum:2,automat:2,aux_build_p_combs_structur:9,aux_build_time_columns_filtering_structure_for_a_nod:9,aux_build_time_scalar_indexing_structure_for_a_nod:9,aux_build_transition_columns_filtering_structur:9,aux_build_transition_scalar_indexing_structure_for_a_nod:9,aux_import_sampled_cim:7,aux_test_build_cim:9,aux_test_init:9,axi:13,base:[2,3,4,5,7,8,9,10],basic_main:15,bayesian:2,been:4,befor:[2,3,7,8,9,10],belong:[2,4],best:2,between:[4,5],bool:[2,4],both:[2,5],bound:4,build:[2,4,5,9,13],build_cim:4,build_complete_graph:2,build_list_of_samples_arrai:5,build_p_comb_structure_for_a_nod:[4,9],build_removable_edges_matrix:2,build_sort:[5,13],build_structur:[4,13],build_time_columns_filtering_for_a_nod:4,build_time_scalar_indexing_structure_for_a_nod:4,build_times_and_transitions_structur:4,build_trajectori:[4,13],build_transition_filtering_for_a_nod:4,build_transition_scalar_indexing_structure_for_a_nod:4,built:2,cach:[0,1,2,14],calcul:2,call:[5,13],can:5,cardin:[2,4,5,9],cardinalit:[4,5],care:4,caridin:4,caridinalit:4,chang:[4,5],check:4,chi:2,chi_test:2,chi_test_alfa:2,child:[2,3],child_indx:2,child_states_numb:2,child_val:2,cim1:[2,7],cim2:[2,7],cim:[2,4,5,13],cim_equality_test:7,cims_kei:5,cims_label:[5,7],cims_to_json:5,classmethod:[7,8,9,10],clean_structure_edg:4,clear:[4,5],clear_concatenated_fram:5,clear_data_frame_list:5,clear_indexing_filtering_structur:4,clear_memori:4,climb:[2,3],coeffici:4,col:4,cols_filt:2,column:[2,4,5,13],columns_head:5,comb:4,combin:[4,5,9],combinatori:[4,9],common:2,complet:[2,4,5],complete_test:2,complete_trajectori:4,comput:[2,3,4,5,13],compute_cim_coeffici:4,compute_parameters_for_nod:[2,13],compute_row_delta_in_all_samples_fram:[5,13],compute_row_delta_sigle_samples_fram:5,compute_state_res_time_for_nod:2,compute_state_transitions_for_a_nod:2,compute_thumb_valu:2,concatanated_sampl:5,concaten:[4,5],concatenated_sampl:5,condit:4,conditional_intensity_matrix:[0,1,2,14],conditionalintensitymatrix:[2,4],consid:[2,4],consider:4,constraint:2,constraint_based_optim:[0,1,14],constraintbasedoptim:3,construct:[4,5,13],conta:5,contain:[2,4,5,9],contains_edg:4,content:[14,15],convent:4,convert:[2,5],copi:5,core:[4,5],correct:[4,5],correspond:4,could:2,count:4,creat:[2,4,5,13],csv:13,csvimport:13,ctbn:2,ctbn_sampl:4,ctpc:[2,3,13],ctpc_algorithm:[2,13],current:[2,3,5],cut:5,dafram:5,data:[2,3,4,5,14],datafram:[4,5,13],dataset:[3,4,5],dataset_id:[5,13],datfram:5,def:13,defin:[4,5],definit:5,defualt:2,delta:[2,4,5],demonstr:13,densiti:4,describ:5,desir:[2,4],df_samples_list:5,dict:[4,5,13],dictionari:5,differ:5,differt:2,digraph:2,dimens:4,dir:13,direct:[2,4],directli:5,directori:5,disabl:[2,3],disable_multiprocess:2,distribuit:2,doc:5,doubl:4,download:13,drop:13,duplic:4,dyn:13,dyn_cim:[4,5],dyn_str:[4,5],each:[2,3,4,5],edg:[2,4,5,13],edges_list:4,end:[4,5],entir:2,equal:4,equality_of_cims_of_nod:7,est:13,estim:[0,1,3,4,6,14],estimate_par:2,estimate_structur:2,estimated_cim:7,everi:[4,5],exam:13,exampl:[5,14,15],exclud:2,exctract:5,execut:4,exist:[4,5],exp_test_alfa:2,exponenti:2,expos:5,extend:13,extens:[2,5],extract:[4,5],fals:[2,4],fam_score_calcul:[0,1,14],famscor:2,famscorecalcul:2,fast_init:[2,4,13],file:[2,5,13],file_path:[2,5,13],filenam:5,filepath:5,fill:[2,13],filter:[2,4],filter_cims_with_mask:4,find:[2,5],first:[2,13],fix:4,fixtur:[7,8,9,10],follow:[4,5],form:4,format:[5,13],formula:2,found:5,frame:[4,5],from:[4,5,13],from_nod:5,gener:[2,4,5],generate_cim:4,generate_graph:4,generate_possible_sub_sets_of_s:2,get:[2,5],get_cims_numb:4,get_fam_scor:2,get_node_id:4,get_node_indx:4,get_ordered_by_indx_set_of_par:4,get_parents_by_id:4,get_positional_node_indx:4,get_score_from_graph:2,get_states_numb:4,given:[2,4,5],glob:13,graph:[2,4,9,13],graph_struct:4,graphic:2,grid:[4,9],group:4,grpah:13,has:[4,5,13],has_edg:4,has_prior_net_structur:4,have:5,header:5,header_column:5,hill:[2,3],hill_climbing_search:[0,1,14],hillclimb:3,hold:[2,4],hook:[7,8,9,10],how:5,hyperparamet:2,hypothesi:2,identifi:[2,4,5],iff:2,implement:[3,4,5,14],import_data:[5,13],import_sampled_cim:5,import_structur:5,import_trajectori:5,import_vari:[5,13],improv:[2,3],includ:[2,5],independ:2,independence_test:2,index:[2,4,5,13,14],indic:[2,4],indx:5,info:[4,13],inform:[3,4,5],init:13,initi:[2,4,5,13],inplac:13,insid:13,instal:14,instanti:4,interest:4,interfac:3,intes:4,isn:4,item:4,iter:[2,3],iterations_numb:[2,3],its:[2,3],join:13,json:[2,5,13],json_export:[0,1,14],json_import:[0,1,14],jsonarrai:5,jsonexport:5,jsonimport:[5,13],just:4,keep:[2,3,5],kei:[4,5],kind:2,knowledg:2,known:2,known_edg:2,label:[2,3,4,5],last:4,latest:13,lenght:[2,3],level:[2,5],likelihood:2,list:[2,3,4,5,13],list_of_column:4,list_of_edg:4,list_of_nod:4,load:5,loop:2,m_xu_suff_stat:2,m_xxu_suff_stat:2,made:4,main:13,mandatori:4,margin:2,marginal_likelihood_q:2,marginal_likelihood_theta:2,mask:[4,9],mask_arr:4,matric:[2,4],matrix:[2,4,5,9,13],max_par:[2,3],max_tr:4,max_val:4,maximum:[2,3,4],member:[4,5],mention:4,merg:5,method:[2,4,5,7,8,9,10],methodnam:[7,8,9,10],min_val:4,minimum:4,model:2,modul:[14,15],more:5,multi_trajectori:4,multipl:5,multiprocess:2,must:[4,5],name:[2,4,5,13],ndarrai:[2,4,5],necessari:[2,4,5],nest:5,net:[2,3,4,5,13],net_graph:2,network:[2,4,5],network_gener:[0,1,14],network_graph:[0,1,2,14],networkgener:4,networkgraph:[2,4,13],networkx:2,node:[2,3,4,5,9,13],node_id:[2,3,4,9],node_index:4,node_indx:[2,4],node_st:[4,9],node_states_numb:[4,9],nodes_index:4,nodes_indexes_arr:4,nodes_label:4,nodes_labels_list:4,nodes_numb:4,nodes_vals_arr:4,nodes_valu:[4,13],none:[2,3,4,5,7,9,10,13],normal:5,normalize_trajectori:5,number:[2,3,4],numpi:[2,4,5,9],obj:[10,13],object:[2,3,4,5,13],obvious:4,one:[4,5],one_iteration_of_ctpc_algorithm:2,one_level_norm:5,onli:5,oper:2,optim:[0,1,2,6,14],optimize_structur:3,option:[2,3],order:[2,4,5,10],origin:5,original_cols_numb:4,otherwis:[2,4,5],out:5,out_fil:5,outer:[5,13],output:[4,5],over:2,own:14,p_comb:[4,9],p_indx:[4,9],p_val:9,p_valu:9,packag:[14,15],page:14,panda:[4,5,13],parallel:4,param:4,paramet:[2,3,4,5,9,14],parameters_estim:[0,1,14],parametersestim:[2,13],parent:[2,3,4,5],parent_indx:2,parent_label:2,parent_set:2,parent_set_v:2,parent_v:2,parent_valu:9,parents_cardin:4,parents_comb:5,parents_index:4,parents_indx:9,parents_label:[4,9],parents_states_numb:[4,9],parents_v:[4,9],parents_valu:[4,9],part:[2,4],particular:[2,5],pass:13,path:[2,5,13],patienc:[2,3],peest:13,perform:2,pip:13,place:5,plot:2,png:2,posit:[4,5],possibl:[2,4],predict:3,prepar:5,present:[2,5],previous:5,print:13,prior:[2,13],prior_net_structur:5,privat:4,probabl:4,process:[2,3,4,5],processes_numb:2,properli:5,properti:[4,5],provid:[4,5],put:5,pyctbn:13,q_xx:4,rappres:4,raw:5,raw_data:5,reach:4,read:[5,13],read_csv:13,read_csv_fil:13,read_fil:13,read_json_fil:5,real:[2,4,5,13],refer:[4,5],reject:2,rel:4,relat:[4,5],releas:13,remain:5,remov:[2,4,5],remove_edg:4,remove_nod:4,repres:4,represent:2,requir:4,res:4,resid:[2,4],respect:4,result:[2,4,5,13],row:4,rtype:4,rule:[2,3],run:[7,8,9,10],runtest:[7,8,9,10],same:[4,5],sampl:[4,5,13],sample_fram:[5,13],sample_import:[0,1,14],sample_path:[0,1,2,14],sampled_cim:7,sampleimport:5,samplepath:[2,4,13],samples_label:5,save:[2,5,13],save_plot_estimated_structure_graph:2,save_result:[2,13],scalar_index:2,scalar_indexes_struct:2,score:2,se1:13,search:[2,3,14],second:2,see:5,select:13,self:[2,5,13],sep:2,sep_set:2,set:[2,4,5,7,8,9,10],set_of_cim:[0,1,2,5,14],setofcim:[2,4,5,13],setup:15,setupclass:[7,8,9,10],share:4,shift:[4,5],shifted_cols_head:5,show:2,signific:2,simbol:5,simpl:13,simpli:13,sinc:4,singl:4,single_cim_xu_marginal_likelihood_q:2,single_cim_xu_marginal_likelihood_theta:2,single_internal_cim_xxu_marginal_likelihood_theta:2,size:[2,4],socim:5,sofc1:13,sorter:5,specif:[2,4,13],specifi:4,spuriou:2,spurious_edg:2,start:5,state:[2,4],state_res_tim:4,state_residence_tim:4,state_transition_matrix:4,statist:2,stop:[2,3],str:[2,3,4,5,13],string:[2,3,4,5],structur:[0,1,2,3,5,9,14],structure_constraint_based_estim:[0,1,14],structure_estim:[0,1,3,14],structure_estimation_exampl:13,structure_graph:[0,1,2,5,6,14],structure_label:5,structure_score_based_estim:[0,1,14],structureconstraintbasedestim:2,structureestim:[2,3,13],structurescorebasedestim:2,structut:4,style:2,submodul:[1,6,14,15],subpackag:[14,15],subsequ:5,subset:2,suffici:2,suffuci:2,symbol:[4,5],synthet:5,t_end:4,t_xu_suff_stat:2,tabu:[2,3],tabu_length:[2,3],tabu_rules_dur:[2,3],tabu_search:[0,1,14],tabusearch:3,take:[4,13],taken:4,tar:13,task:[2,4],tau_xu:2,ternari:13,test:[0,2,15],test_add_edg:9,test_add_nod:9,test_adjacency_matrix:7,test_buid_samplepath_no_concatenated_sampl:9,test_buid_samplepath_no_vari:9,test_build_cim:9,test_build_complete_graph:7,test_build_p_combs_structur:9,test_build_removable_edges_matrix:7,test_build_saplepath_no_prior_net_structur:9,test_build_sort:10,test_build_structur:9,test_build_structure_bad_sort:9,test_build_time_columns_filtering_structure_for_a_nod:9,test_build_time_scalar_indexing_structure_for_a_nod:9,test_build_trajectori:9,test_build_transition_columns_filtering_structur:9,test_build_transition_scalar_indexing_structure_for_a_nod:9,test_cach:[0,6],test_child:2,test_cim:[0,6],test_clear:10,test_clear_concatenated_fram:10,test_clear_data_frame_list:10,test_compute_cim_coeffici:9,test_compute_parameters_for_nod:7,test_compute_row_delta_in_all_fram:10,test_compute_row_delta_in_all_frames_not_init_sort:10,test_compute_row_delta_single_samples_fram:10,test_dataset_id:10,test_edges_oper:9,test_equ:9,test_fast_init:[7,9],test_file_path:10,test_filter_cims_with_mask:9,test_find:10,test_generate_cim:9,test_generate_graph:9,test_generate_possible_sub_sets_of_s:7,test_generated_trajectori:9,test_generated_trajectory_max_tr:9,test_get_node_id:9,test_get_node_indx:9,test_get_ordered_by_indx_set_of_par:9,test_get_parents_by_id:9,test_get_positional_node_indx:9,test_get_states_numb:9,test_hill_climbing_search:[0,6],test_import_data:10,test_import_sampled_cim:10,test_import_structur:10,test_import_vari:10,test_init:[7,9,10],test_init_not_filled_dataframs:9,test_init_not_initialized_import:9,test_json_import:[0,6],test_multi_trajectori:9,test_networkgener:[0,6],test_networkgraph:[0,6],test_normalize_trajectori:10,test_normalize_trajectories_wrong_indx:10,test_normalize_trajectories_wrong_kei:10,test_ord:10,test_par:2,test_parameters_estim:[0,6],test_put:10,test_read_json_file_found:10,test_read_json_file_not_found:10,test_repr:9,test_sample_import:[0,6],test_sample_path:[0,6],test_save_plot_estimated_graph:7,test_save_result:7,test_setofcim:[0,6],test_structur:[0,6,8],test_structure_1:7,test_structure_2:7,test_structure_3:[7,8],test_structure_constraint_based_estim:[0,6],test_structure_estim:[0,6],test_structure_monoprocesso:7,test_structure_score_based_estim:[0,6],test_tabu_search:[0,6],test_tim:7,test_trajectori:[0,6],test_trajectorygener:[0,6],testcach:10,testcas:[7,8,9,10],testconditionalintensitymatrix:9,testhillclimbingsearch:8,testjsonimport:10,testnetworkgener:9,testnetworkgraph:9,testparametersestimatior:7,testsampleimport:10,testsamplepath:9,testsetofcim:9,teststructur:9,teststructureconstraintbasedestim:7,teststructureestim:7,teststructurescorebasedestim:7,testtabusearch:8,testtrajectori:9,testtrajectorygener:9,tha:5,therefor:4,theta:2,thi:[2,4,5,13],three:13,threshold:2,thumb:2,thumb_threshold:2,thumb_valu:2,time:[2,4,5,13],time_filt:4,time_kei:5,time_scalar_indexing_strucur:4,timestamp:5,to_nod:5,tot_vars_count:[2,3],total:[2,4],total_variables_count:4,total_variables_numb:4,traj:5,trajecory_head:5,trajectori:[0,1,2,5,13,14],trajectories_kei:5,trajectory_gener:[0,1,14],trajectory_list:5,trajectorygener:4,trajectri:13,transit:[2,4,5],transition_filt:4,transition_matric:4,transition_scalar_indexing_structur:4,tri:5,tupl:4,tutori:5,two:[2,4],type:[2,3,4,5,13],union:5,uniqu:5,unittest:[7,8,9,10],unus:4,usag:14,use:[2,13],used:[2,3,4,5],using:[2,3,4,5],util:[0,1,4,6,14],val:4,valid:2,valu:[2,3,4,5,9,13],values_list:13,var_id:2,variabl:[2,3,4,5,13],variable_cardin:5,variable_cim_xu_marginal_likelihood_q:2,variable_cim_xu_marginal_likelihood_theta:2,variable_label:5,variables_kei:5,variables_label:5,vector:[2,4],want:13,when:[2,4],where:[4,5],whether:4,which:[2,3,4,5],whl:13,who:2,without:[2,3],worker:4,write:5,you:[2,5,13],your:14},titles:["PyCTBN package","pyctbn.legacy package","pyctbn.legacy.estimators package","pyctbn.legacy.optimizers package","pyctbn.legacy.structure_graph package","pyctbn.legacy.utility package","PyCTBN.tests package","PyCTBN.tests.estimators package","PyCTBN.tests.optimizers package","PyCTBN.tests.structure_graph package","PyCTBN.tests.utility package","basic_main module","example module","Examples","Welcome to PyCTBN\u2019s documentation!","PyCTBN","setup module"],titleterms:{"import":13,abstract_export:5,abstract_import:5,basic_main:[0,11],cach:5,conditional_intensity_matrix:4,constraint_based_optim:3,content:[0,1,2,3,4,5,6,7,8,9,10],data:13,document:14,estim:[2,7,13],exampl:[12,13],fam_score_calcul:2,hill_climbing_search:3,implement:13,indic:14,instal:13,json_export:5,json_import:5,modul:[0,1,2,3,4,5,6,7,8,9,10,11,12,16],network_gener:4,network_graph:4,optim:[3,8],own:13,packag:[0,1,2,3,4,5,6,7,8,9,10],paramet:13,parameters_estim:2,pyctbn:[0,1,2,3,4,5,6,7,8,9,10,14,15],sample_import:5,sample_path:4,set_of_cim:4,setup:[0,16],structur:[4,13],structure_constraint_based_estim:2,structure_estim:2,structure_graph:[4,9],structure_score_based_estim:2,submodul:[0,2,3,4,5,7,8,9,10],subpackag:[0,1,6],tabl:14,tabu_search:3,test:[6,7,8,9,10],test_cach:10,test_cim:9,test_hill_climbing_search:8,test_json_import:10,test_networkgener:9,test_networkgraph:9,test_parameters_estim:7,test_sample_import:10,test_sample_path:9,test_setofcim:9,test_structur:9,test_structure_constraint_based_estim:7,test_structure_estim:7,test_structure_score_based_estim:7,test_tabu_search:8,test_trajectori:9,test_trajectorygener:9,trajectori:4,trajectory_gener:4,usag:13,util:[5,10],welcom:14,your:13}}) \ 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 b1268cf..0000000 --- a/docs/_build/html/setup.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - setup module — PyCTBN 2.0 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
-
-
-
-
- -
-
- - - - - - - - - - - - -
- -
- -
-
-

setup module

-
- - -
-
- - -
- -
-

- © Copyright 2021, Bregoli Alessandro, Martini Filippo, Moretti Luca. -

-
- - Built with Sphinx using a theme provided by Porão do Juca. - -
-
-
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/examples.rst b/docs/examples.rst index 5386451..4979798 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -16,7 +16,7 @@ Implementing your own data importer The net in exam has three ternary nodes and no prior net structure. """ - from PyCTBN import AbstractImporter + from pyctbn.legacy import AbstractImporter class CSVImporter(AbstractImporter): @@ -53,10 +53,10 @@ Parameters Estimation Example .. code-block:: python - from PyCTBN import JsonImporter - from PyCTBN import SamplePath - from PyCTBN import NetworkGraph - from PyCTBN import ParametersEstimator + from pyctbn.legacy import JsonImporter + from pyctbn.legacy import SamplePath + from pyctbn.legacy import NetworkGraph + from pyctbn.legacy import ParametersEstimator def main(): @@ -92,9 +92,9 @@ Structure Estimation Example .. code-block:: python - from PyCTBN import JsonImporter - from PyCTBN import SamplePath - from PyCTBN import StructureEstimator + from pyctbn.legacy import JsonImporter + from pyctbn.legacy import SamplePath + from pyctbn.legacy import StructureEstimator def structure_estimation_example(): diff --git a/docs/PyCTBN.rst b/docs/legacy.rst similarity index 68% rename from docs/PyCTBN.rst rename to docs/legacy.rst index 258a0a8..1851d52 100644 --- a/docs/PyCTBN.rst +++ b/docs/legacy.rst @@ -1,4 +1,4 @@ -PyCTBN package +legacy package ============== Subpackages @@ -8,23 +8,23 @@ Subpackages :maxdepth: 4 pyctbn.legacy - PyCTBN.tests + legacy.tests Submodules ---------- -PyCTBN.basic\_main module +basic\_main module ------------------------- -.. automodule:: PyCTBN.basic_main +.. automodule:: basic_main :members: :undoc-members: :show-inheritance: -PyCTBN.setup module +setup module ------------------- -.. automodule:: PyCTBN.setup +.. automodule:: setup :members: :undoc-members: :show-inheritance: @@ -32,7 +32,7 @@ PyCTBN.setup module Module contents --------------- -.. automodule:: PyCTBN +.. automodule:: pyctbn.legacy :members: :undoc-members: :show-inheritance: diff --git a/docs/PyCTBN.tests.rst b/docs/legacy.tests.rst similarity index 50% rename from docs/PyCTBN.tests.rst rename to docs/legacy.tests.rst index 5fa24d0..a1a3140 100644 --- a/docs/PyCTBN.tests.rst +++ b/docs/legacy.tests.rst @@ -1,4 +1,4 @@ -PyCTBN.tests package +tests package ==================== Subpackages @@ -7,15 +7,15 @@ Subpackages .. toctree:: :maxdepth: 4 - PyCTBN.tests.estimators - PyCTBN.tests.optimizers - PyCTBN.tests.structure_graph - PyCTBN.tests.utility + tests.estimators + tests.optimizers + tests.structure_graph + tests.utility Module contents --------------- -.. automodule:: PyCTBN.tests +.. automodule:: tests :members: :undoc-members: :show-inheritance: diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 2119f51..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/modules.rst b/docs/modules.rst index aa7e7d5..fdf2a0e 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -1,9 +1,9 @@ -PyCTBN +pyctbn.legacy ====== .. toctree:: :maxdepth: 4 - PyCTBN + pyctbn.legacy example setup diff --git a/docs/PyCTBN.PyCTBN.estimators.rst b/docs/pyctbn.legacy.estimators.rst similarity index 100% rename from docs/PyCTBN.PyCTBN.estimators.rst rename to docs/pyctbn.legacy.estimators.rst diff --git a/docs/PyCTBN.PyCTBN.optimizers.rst b/docs/pyctbn.legacy.optimizers.rst similarity index 100% rename from docs/PyCTBN.PyCTBN.optimizers.rst rename to docs/pyctbn.legacy.optimizers.rst diff --git a/docs/PyCTBN.PyCTBN.rst b/docs/pyctbn.legacy.rst similarity index 100% rename from docs/PyCTBN.PyCTBN.rst rename to docs/pyctbn.legacy.rst diff --git a/docs/PyCTBN.PyCTBN.structure_graph.rst b/docs/pyctbn.legacy.structure_graph.rst similarity index 100% rename from docs/PyCTBN.PyCTBN.structure_graph.rst rename to docs/pyctbn.legacy.structure_graph.rst diff --git a/docs/PyCTBN.PyCTBN.utility.rst b/docs/pyctbn.legacy.utility.rst similarity index 100% rename from docs/PyCTBN.PyCTBN.utility.rst rename to docs/pyctbn.legacy.utility.rst diff --git a/docs/_build/html/_sources/PyCTBN.tests.estimators.rst.txt b/docs/tests.estimators.rst similarity index 50% rename from docs/_build/html/_sources/PyCTBN.tests.estimators.rst.txt rename to docs/tests.estimators.rst index b3ae86b..5341654 100644 --- a/docs/_build/html/_sources/PyCTBN.tests.estimators.rst.txt +++ b/docs/tests.estimators.rst @@ -1,37 +1,37 @@ -PyCTBN.tests.estimators package +tests.estimators package =============================== Submodules ---------- -PyCTBN.tests.estimators.test\_parameters\_estimator module +tests.estimators.test\_parameters\_estimator module ---------------------------------------------------------- -.. automodule:: PyCTBN.tests.estimators.test_parameters_estimator +.. automodule:: tests.estimators.test_parameters_estimator :members: :undoc-members: :show-inheritance: -PyCTBN.tests.estimators.test\_structure\_constraint\_based\_estimator module +tests.estimators.test\_structure\_constraint\_based\_estimator module ---------------------------------------------------------------------------- -.. automodule:: PyCTBN.tests.estimators.test_structure_constraint_based_estimator +.. automodule:: tests.estimators.test_structure_constraint_based_estimator :members: :undoc-members: :show-inheritance: -PyCTBN.tests.estimators.test\_structure\_estimator module +tests.estimators.test\_structure\_estimator module --------------------------------------------------------- -.. automodule:: PyCTBN.tests.estimators.test_structure_estimator +.. automodule:: tests.estimators.test_structure_estimator :members: :undoc-members: :show-inheritance: -PyCTBN.tests.estimators.test\_structure\_score\_based\_estimator module +tests.estimators.test\_structure\_score\_based\_estimator module ----------------------------------------------------------------------- -.. automodule:: PyCTBN.tests.estimators.test_structure_score_based_estimator +.. automodule:: tests.estimators.test_structure_score_based_estimator :members: :undoc-members: :show-inheritance: @@ -39,7 +39,7 @@ PyCTBN.tests.estimators.test\_structure\_score\_based\_estimator module Module contents --------------- -.. automodule:: PyCTBN.tests.estimators +.. automodule:: tests.estimators :members: :undoc-members: :show-inheritance: diff --git a/docs/_build/html/_sources/PyCTBN.tests.optimizers.rst.txt b/docs/tests.optimizers.rst similarity index 54% rename from docs/_build/html/_sources/PyCTBN.tests.optimizers.rst.txt rename to docs/tests.optimizers.rst index 0df8f6c..a554365 100644 --- a/docs/_build/html/_sources/PyCTBN.tests.optimizers.rst.txt +++ b/docs/tests.optimizers.rst @@ -1,21 +1,21 @@ -PyCTBN.tests.optimizers package +tests.optimizers package =============================== Submodules ---------- -PyCTBN.tests.optimizers.test\_hill\_climbing\_search module +tests.optimizers.test\_hill\_climbing\_search module ----------------------------------------------------------- -.. automodule:: PyCTBN.tests.optimizers.test_hill_climbing_search +.. automodule:: tests.optimizers.test_hill_climbing_search :members: :undoc-members: :show-inheritance: -PyCTBN.tests.optimizers.test\_tabu\_search module +tests.optimizers.test\_tabu\_search module ------------------------------------------------- -.. automodule:: PyCTBN.tests.optimizers.test_tabu_search +.. automodule:: tests.optimizers.test_tabu_search :members: :undoc-members: :show-inheritance: @@ -23,7 +23,7 @@ PyCTBN.tests.optimizers.test\_tabu\_search module Module contents --------------- -.. automodule:: PyCTBN.tests.optimizers +.. automodule:: tests.optimizers :members: :undoc-members: :show-inheritance: diff --git a/docs/PyCTBN.tests.structure_graph.rst b/docs/tests.structure_graph.rst similarity index 50% rename from docs/PyCTBN.tests.structure_graph.rst rename to docs/tests.structure_graph.rst index 7240498..d69fe07 100644 --- a/docs/PyCTBN.tests.structure_graph.rst +++ b/docs/tests.structure_graph.rst @@ -1,69 +1,69 @@ -PyCTBN.tests.structure\_graph package +tests.structure\_graph package ===================================== Submodules ---------- -PyCTBN.tests.structure\_graph.test\_cim module +tests.structure\_graph.test\_cim module ---------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_cim +.. automodule:: tests.structure_graph.test_cim :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_networkgenerator module +tests.structure\_graph.test\_networkgenerator module ----------------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_networkgenerator +.. automodule:: tests.structure_graph.test_networkgenerator :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_networkgraph module +tests.structure\_graph.test\_networkgraph module ------------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_networkgraph +.. automodule:: tests.structure_graph.test_networkgraph :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_sample\_path module +tests.structure\_graph.test\_sample\_path module ------------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_sample_path +.. automodule:: tests.structure_graph.test_sample_path :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_setofcims module +tests.structure\_graph.test\_setofcims module ---------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_setofcims +.. automodule:: tests.structure_graph.test_setofcims :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_structure module +tests.structure\_graph.test\_structure module ---------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_structure +.. automodule:: tests.structure_graph.test_structure :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_trajectory module +tests.structure\_graph.test\_trajectory module ----------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_trajectory +.. automodule:: tests.structure_graph.test_trajectory :members: :undoc-members: :show-inheritance: -PyCTBN.tests.structure\_graph.test\_trajectorygenerator module +tests.structure\_graph.test\_trajectorygenerator module -------------------------------------------------------------- -.. automodule:: PyCTBN.tests.structure_graph.test_trajectorygenerator +.. automodule:: tests.structure_graph.test_trajectorygenerator :members: :undoc-members: :show-inheritance: @@ -71,7 +71,7 @@ PyCTBN.tests.structure\_graph.test\_trajectorygenerator module Module contents --------------- -.. automodule:: PyCTBN.tests.structure_graph +.. automodule:: tests.structure_graph :members: :undoc-members: :show-inheritance: diff --git a/docs/PyCTBN.tests.utility.rst b/docs/tests.utility.rst similarity index 54% rename from docs/PyCTBN.tests.utility.rst rename to docs/tests.utility.rst index b514c30..595f92e 100644 --- a/docs/PyCTBN.tests.utility.rst +++ b/docs/tests.utility.rst @@ -1,29 +1,29 @@ -PyCTBN.tests.utility package +tests.utility package ============================ Submodules ---------- -PyCTBN.tests.utility.test\_cache module +tests.utility.test\_cache module --------------------------------------- -.. automodule:: PyCTBN.tests.utility.test_cache +.. automodule:: tests.utility.test_cache :members: :undoc-members: :show-inheritance: -PyCTBN.tests.utility.test\_json\_importer module +tests.utility.test\_json\_importer module ------------------------------------------------ -.. automodule:: PyCTBN.tests.utility.test_json_importer +.. automodule:: tests.utility.test_json_importer :members: :undoc-members: :show-inheritance: -PyCTBN.tests.utility.test\_sample\_importer module +tests.utility.test\_sample\_importer module -------------------------------------------------- -.. automodule:: PyCTBN.tests.utility.test_sample_importer +.. automodule:: tests.utility.test_sample_importer :members: :undoc-members: :show-inheritance: @@ -31,7 +31,7 @@ PyCTBN.tests.utility.test\_sample\_importer module Module contents --------------- -.. automodule:: PyCTBN.tests.utility +.. automodule:: tests.utility :members: :undoc-members: :show-inheritance: