From eb255d6659a27c8389f405d3b21e61bf1586371a Mon Sep 17 00:00:00 2001 From: Calum Chamberlain work Date: Sat, 21 Nov 2015 00:20:03 +0000 Subject: [PATCH] Migrate gh-pages from API-docs to jekyll site --- .gitignore | 20 + .nojekyll | 0 _config.yml | 12 + _images/EQcorrscan_logo.png | Bin 42799 -> 0 bytes _images/processing_flow.png | Bin 154103 -> 0 bytes _includes/footer.html | 55 + _includes/google_analytics.html | 10 + _includes/head.html | 11 + _includes/header.html | 27 + _includes/index.md | 17 + _layouts/default.html | 20 + _layouts/page.html | 14 + _layouts/post.html | 15 + _modules/EQcorrscan_plotting.html | 1008 -- _modules/Sfile_util.html | 872 -- _modules/bright_lights.html | 939 -- _modules/catalogue2DD.html | 567 - _modules/clustering.html | 835 -- _modules/findpeaks.html | 513 - _modules/index.html | 201 - _modules/lag_calc.html | 383 - _modules/mag_calc.html | 917 -- _modules/match_filter.html | 751 -- _modules/pre_processing.html | 413 - _modules/stacking.html | 323 - _modules/template_gen.html | 616 - _plugins/markdown.rb | 23 + _posts/2015-11-20-jekyll-migration.md | 16 + _sass/_base.scss | 204 + _sass/_layout.scss | 236 + _sass/_syntax-highlighting.scss | 67 + _sources/core.txt | 12 - _sources/index.txt | 57 - _sources/intro.txt | 75 - _sources/submodules/core.bright_lights.txt | 5 - _sources/submodules/core.lag_calc.txt | 5 - _sources/submodules/core.match_filter.txt | 5 - _sources/submodules/core.template_gen.txt | 5 - .../submodules/utils.EQcorrscan_plotting.txt | 5 - _sources/submodules/utils.Sfile_util.txt | 5 - _sources/submodules/utils.catalogue2DD.txt | 6 - _sources/submodules/utils.clustering.txt | 6 - _sources/submodules/utils.findpeaks.txt | 6 - _sources/submodules/utils.mag_calc.txt | 6 - _sources/submodules/utils.pre_processing.txt | 5 - _sources/submodules/utils.stacking.txt | 6 - _sources/tutorial.txt | 85 - _sources/utils.txt | 17 - _static/EQcorrscan_logo.ico | Bin 49310 -> 0 bytes _static/EQcorrscan_logo.jpg | Bin 10804 -> 0 bytes _static/ajax-loader.gif | Bin 673 -> 0 bytes _static/basic.css | 599 - _static/comment-bright.png | Bin 3500 -> 0 bytes _static/comment-close.png | Bin 3578 -> 0 bytes _static/comment.png | Bin 3445 -> 0 bytes _static/css/badge_only.css | 2 - _static/css/theme.css | 5 - _static/doctools.js | 263 - _static/down-pressed.png | Bin 347 -> 0 bytes _static/down.png | Bin 347 -> 0 bytes _static/file.png | Bin 358 -> 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 _static/jquery-1.11.1.js | 10308 ---------------- _static/jquery.js | 4 - _static/js/theme.js | 47 - _static/minus.png | Bin 173 -> 0 bytes _static/plus.png | Bin 173 -> 0 bytes _static/pygments.css | 63 - _static/searchtools.js | 622 - _static/underscore-1.3.1.js | 999 -- _static/underscore.js | 31 - _static/up-pressed.png | Bin 345 -> 0 bytes _static/up.png | Bin 345 -> 0 bytes _static/websupport.js | 808 -- about.md | 43 + core.html | 213 - css/main.scss | 49 + feed.xml | 30 + genindex.html | 724 -- index.html | 279 +- installation.md | 17 + intro.html | 269 - objects.inv | Bin 1145 -> 0 bytes py-modindex.html | 299 - search.html | 208 - searchindex.js | 1 - submodules/core.bright_lights.html | 474 - submodules/core.lag_calc.html | 347 - submodules/core.match_filter.html | 445 - submodules/core.template_gen.html | 370 - submodules/utils.EQcorrscan_plotting.html | 567 - submodules/utils.Sfile_util.html | 592 - submodules/utils.catalogue2DD.html | 367 - submodules/utils.clustering.html | 488 - submodules/utils.findpeaks.html | 321 - submodules/utils.mag_calc.html | 423 - submodules/utils.pre_processing.html | 305 - submodules/utils.stacking.html | 286 - tutorial.html | 424 - utils.html | 218 - 103 files changed, 903 insertions(+), 30417 deletions(-) create mode 100644 .gitignore delete mode 100644 .nojekyll create mode 100644 _config.yml delete mode 100644 _images/EQcorrscan_logo.png delete mode 100644 _images/processing_flow.png create mode 100644 _includes/footer.html create mode 100644 _includes/google_analytics.html create mode 100644 _includes/head.html create mode 100644 _includes/header.html create mode 100644 _includes/index.md create mode 100644 _layouts/default.html create mode 100644 _layouts/page.html create mode 100644 _layouts/post.html delete mode 100644 _modules/EQcorrscan_plotting.html delete mode 100644 _modules/Sfile_util.html delete mode 100644 _modules/bright_lights.html delete mode 100644 _modules/catalogue2DD.html delete mode 100644 _modules/clustering.html delete mode 100644 _modules/findpeaks.html delete mode 100644 _modules/index.html delete mode 100644 _modules/lag_calc.html delete mode 100644 _modules/mag_calc.html delete mode 100644 _modules/match_filter.html delete mode 100644 _modules/pre_processing.html delete mode 100644 _modules/stacking.html delete mode 100644 _modules/template_gen.html create mode 100644 _plugins/markdown.rb create mode 100644 _posts/2015-11-20-jekyll-migration.md create mode 100644 _sass/_base.scss create mode 100644 _sass/_layout.scss create mode 100644 _sass/_syntax-highlighting.scss delete mode 100644 _sources/core.txt delete mode 100644 _sources/index.txt delete mode 100644 _sources/intro.txt delete mode 100644 _sources/submodules/core.bright_lights.txt delete mode 100644 _sources/submodules/core.lag_calc.txt delete mode 100644 _sources/submodules/core.match_filter.txt delete mode 100644 _sources/submodules/core.template_gen.txt delete mode 100644 _sources/submodules/utils.EQcorrscan_plotting.txt delete mode 100644 _sources/submodules/utils.Sfile_util.txt delete mode 100644 _sources/submodules/utils.catalogue2DD.txt delete mode 100644 _sources/submodules/utils.clustering.txt delete mode 100644 _sources/submodules/utils.findpeaks.txt delete mode 100644 _sources/submodules/utils.mag_calc.txt delete mode 100644 _sources/submodules/utils.pre_processing.txt delete mode 100644 _sources/submodules/utils.stacking.txt delete mode 100644 _sources/tutorial.txt delete mode 100644 _sources/utils.txt delete mode 100644 _static/EQcorrscan_logo.ico delete mode 100644 _static/EQcorrscan_logo.jpg delete mode 100644 _static/ajax-loader.gif delete mode 100644 _static/basic.css delete mode 100644 _static/comment-bright.png delete mode 100644 _static/comment-close.png delete mode 100644 _static/comment.png delete mode 100644 _static/css/badge_only.css delete mode 100644 _static/css/theme.css delete mode 100644 _static/doctools.js delete mode 100644 _static/down-pressed.png delete mode 100644 _static/down.png delete mode 100644 _static/file.png delete mode 100644 _static/fonts/fontawesome-webfont.eot delete mode 100644 _static/fonts/fontawesome-webfont.svg delete mode 100644 _static/fonts/fontawesome-webfont.ttf delete mode 100644 _static/fonts/fontawesome-webfont.woff delete mode 100644 _static/jquery-1.11.1.js delete mode 100644 _static/jquery.js delete mode 100644 _static/js/theme.js delete mode 100644 _static/minus.png delete mode 100644 _static/plus.png delete mode 100644 _static/pygments.css delete mode 100644 _static/searchtools.js delete mode 100644 _static/underscore-1.3.1.js delete mode 100644 _static/underscore.js delete mode 100644 _static/up-pressed.png delete mode 100644 _static/up.png delete mode 100644 _static/websupport.js create mode 100644 about.md delete mode 100644 core.html create mode 100755 css/main.scss create mode 100644 feed.xml delete mode 100644 genindex.html create mode 100644 installation.md delete mode 100644 intro.html delete mode 100644 objects.inv delete mode 100644 py-modindex.html delete mode 100644 search.html delete mode 100644 searchindex.js delete mode 100644 submodules/core.bright_lights.html delete mode 100644 submodules/core.lag_calc.html delete mode 100644 submodules/core.match_filter.html delete mode 100644 submodules/core.template_gen.html delete mode 100644 submodules/utils.EQcorrscan_plotting.html delete mode 100644 submodules/utils.Sfile_util.html delete mode 100644 submodules/utils.catalogue2DD.html delete mode 100644 submodules/utils.clustering.html delete mode 100644 submodules/utils.findpeaks.html delete mode 100644 submodules/utils.mag_calc.html delete mode 100644 submodules/utils.pre_processing.html delete mode 100644 submodules/utils.stacking.html delete mode 100644 tutorial.html delete mode 100644 utils.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..d75a4982c --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +Gemfile.lock +test/dest +*.gem +pkg/ +*.swp +*~ +_site/ +.bundle/ +.DS_Store +bbin/ +gh-pages/ +site/_site/ +coverage +.ruby-version +.ruby-gemset +.sass-cache +tmp/* +.jekyll-metadata +/vendor +/test/source/file_name.txt diff --git a/.nojekyll b/.nojekyll deleted file mode 100644 index e69de29bb..000000000 diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000..739f2ffd9 --- /dev/null +++ b/_config.yml @@ -0,0 +1,12 @@ +# Site settings +title: EQcorrscan +email: calum.chamberlain@vuw.ac.nz +description: > # this means to ignore newlines until "baseurl:" + Multi-paralleled matched-filter earthquake detection and analysis + for large-scale continuous seismic datasets containing repeating and + near-repeating earthquakes. +github_username: calum-chamberlain + +# Build settings +markdown: kramdown +highlighter: pygments diff --git a/_images/EQcorrscan_logo.png b/_images/EQcorrscan_logo.png deleted file mode 100644 index 37f2903e41bdb99d4840c5afef1146959844bd9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42799 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 diff --git a/_images/processing_flow.png b/_images/processing_flow.png deleted file mode 100644 index 64081c4caffe2d9f4581a2ad5840ac6f56f4212a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154103 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

#+^>#<0YTm!c8FLd3yMrM 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 Ub&pOkoM-}n<>4rPkR&M&n@W~ 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

P$54qv@jD6-JC_1NP-5P%`21`n}u^^aF?gptO? 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 z z3RV%#6l&*9^Mqb$CyLFV5|4CSrpbl6Q-1`gq@dxtv z>0{-IXK*~on)mJN>gpwsk$tLj?>HcUOd&MjAgm?24G8_!-`@)X1cA%y-wo}$U1Wt88&Gq?f>>UFuY2S9pNezPz4K`#V47 zmKrt<4U_F{hrQz;fBcX^j0RVsYJb0xfJ?#3BCIF~i9cxwyaFk&+*8UvuZ04{Y`fFz z^=f^69Ws}zm$p_eE)K_L!Eq}#Q4HK%!m7Etelcac;H>=|IaB6j4aMp#0S93^IzBiZ z`v1I#3jq#A`;*-G1l_(r5B)a(uG;oAhFqvGGK7hi4D`<%B#lO)`am^=x}i6R83Gh@ z$EVd3OH0?`JC6Uuosi)2r2*zV<_?4UCFXj^`Q*u_u#}4RP71lSEM2GJ$3StELvvag z7_T}=Io&~#b@12Jz3(A6Y6Ctr!13p-z$X|_x2Zti?-ke_ee3QP*){tsLGwUL4jCn2 zfz6@N-BN}!9qo84I<_5uI%aq%j>qCj)CIXfxG7*L(eB4l_XQ*#-GAq?y9&`$iyT@+&sMr9 zRe>fQhC?Hw{ds-;hu?r(8kf8K5PaYm@B`38G2n5Ml+=LbYiLnY*U-+F16xPc9&q(S zYP+aj_pCLmxj7Y3pm>6=81G`AjZBi{!>gBqK782A)7I8baa;B%t$W3zpwKz&6x2hv zf2XU6QPFHqAE@S!K_e7rvBUfaUNp_+iHzfZG|XT{G90>OFaGKj-5|%9<%%$ETu}!>&PfH2k@tp=QuK zgn=vna@QI>nt)gA2Ja_6gV7#XuUR1#cE21bloB=Ws;_5RM- zm@DXcw4%j|m#*UTpuAsA(jWauyJvodQ1Y-!BuVip2%Mw7+Gix3mdw4x{$R6MT*V%*NC{GtAPW%e}z#f0T3PPg(iR}kvf|Nrq4mIO;xL8$WoJh zu;W?R$~aR!6(;-y|h`9 zp|NM29xHXv>l&P}!r(?O+MblL{@W>wfm_>LYXN(Od@5&@VD+wgBj>KbOL{%f%}CL8 zvkba06xY%uUGeAR5lz^te8b#BtCQ_3EA4YLzphIM93$WBwu!c4*&8Miu4NB3N5Ty10qi*-UdZ%~#A4Wlp)B@BM{>#i1cCxWfn=1sf7T z;klxp)Lo|dLRq;?GAOVEnQ8ulm9fO75#Qq6TyfuX@w^gEg)QZ>vRQ)ex0#t)L`JCP z0;wo^l4^}nVnLE8Pnl0nYs{>+==H)~UvHP6zrVBIVi+{=p`(+e{E#Du{D{@c zjfruM=T|YeP}hU)IX5Suriuu|uat*|vZ|@|IJlnL`u6HojEF~YsytP4h6)L!X$;&> zB>B`Pf4Q?0$1ItBQic zxV}nxd4RRg>q-#Zc+AA)aF9uXnt64SK|j8rfKonwC)07sVqi%0exGbC->79%Mk~1J znHd>~&k&6NfknLYo^78e-mQvjk7i zCAjES{m658hsUE$jOX`vnfumC{nYy`I!6zxRYbR&PDF&q9r#k4m@ort&m%u_CUbB? zY@M7cQ=$e-j6iTO(qDk_r!4U5UD?^kH{knIk~DP7<+Mt;k7M07-8H~wJ?RT^NN_QZ z^;}OP3vjJ{hXLa!Mk;7a&8!gq;`{4Td0z_YP+woa1b5pCTIXk9YZX2mp-_JOIHO%u zG$Tk29{iXc;lduw)XInIMbje_@x+`5i#0Zt^p-0WHpaejHsy96&12#g+e20D`$;7?ojy;Pl@we%_+xw2I4=CA7+UA3DX9{n`a zmsS(FP4K18diF($$gd!{ncx__)U0d4o1s@DT5|u}XRiYkVfjEe2TV8rLbtDQGDLNa z!J<@`#NY~>TWhbev{WI7gvNVFWJM~0XtCY851oH$-i?Mlu)e8sE-4RBhDKe@gi60; z0L`G2f|Ar|Fq~8*K>BohFz1HUM@@u5T~$%&t~|0=@6dn7qR`bNshyo>Fxgqz*#l9O zf)1H-h%@Mrxq<_G+T6y08RJHv$^7OWpGRnT9sjjjx`ue>km%jm7_^ALuhf}gzOhXA z84NX~_55$jz3*X){1^Ye*7`IlTSTmzq>GD5c!XMJWhGZLRyb*4;hsukRHRcq#~}aP zw=VNB=I>sNRQ?Mz7mr3pJgi$NP%n-#FjnY2@R0{YZFJgsXee%DbFdUtN&g`gGzZ+B zY>|z@c=$wpfRsG*Q$0w7K8O52>Fz>!OcH42jKiKB?fUW{jmJdcH94n3FJE;Cy#_9! z5dFuleX*l6WnOdGmLB3{MG^j-_P7{AVWLMeb3)(q?v_v3F1R7t7aBFAqf_Q^%ce=y z%hj^$duw*L7aCo8wZ?U$6FnR|*Z2O^H9;uQ?_sb7CgSWQBg7Qb7dZ#RFaU$gMbu%y#Mp(=>F3?y39qwe4%+s=Gx zP5c*_@Y^%FZr!-S%M^J3d^v1;yH0;U*~aW+=;%0l%*%lNE;JY(fnMM*#qv)VdNlAa ze*bXt7r51^!ddMc4<(DJw>n3LmkIbT`!y_^s*;l1Z?Yu`7)0u4o4;fAd3Qxbq9|Tq zo`{PZ`8``*(08QyJvo^P;rWdye?L-H=Q5X?p~BrFzIQ#vpdzg1;84}vVh-)D8DGCP zqes=RIjl9P?-k8WO=bUmN%v4{m*rk3u)^fkoLyG;AdX7ww z+cJ&1`1kG73omVKIuYO8TK8*ijYxjWxx|0GY2Tc`I6Qx_Z(ZoQ;uj>}4*8BV!s{J| zegXwGkj5JKj$2)&ymCd2GN`4++`ozhU2goI$xZ+3@_pyOMYJx4KJWy~4FXOtF`YRf zDi!=`OgY!C7KT@6bgO<|(xYA2V53tO_p~p>Ac}jI$#U=$ONPz%6WtMIKfwY8Y3bs3 z=Lm(S6$Br$rS9yfE98#HpG>c{a}_(Um@SSbjxyoaR&9~jdj5Qm=b4x{?5&;}FK;B# z<9*~6oN=*)gj^k4PJ0E&v9Uw}zrSjh?7AB(b6S1vKee?Um#<8wy+29!@ZT-q0mC_S zz*On$kKBIUO`3r&HEsDcu35|q0va^RlJ#$y<-8Bw`MEm-_7mJU*a*6(M}v{zbuw0cJjj# z5TJ+;+qRtUQtq(!FfaOa820s#%D^=_NN~s(NrjRb}2V&3O%*cq{yKG36bN& z4)HLwx}SUB`);r@Fg(e~klh-%F^jJ`kb`s~-<*6bIW+B_fQyx9bFoFmc6C%u14o}> zLxw&^QjI=x>?r%v85Fgmx_Y$ZLgS7=oW+@2ejhU{CI&`EtWKZXR0c#F&YFr&N|N`T zpT53G{XgUVW50eWeiZ>{0Ex}xoz8*sMPNor$?r-!y7OaS`U^?se@UUAM_l$E0SUp) zQZRDZ=(UQ>%otwwnyDBDs5ff4bswP7zeY*OvxZ`mCfz!4oV8_}EBZ(goZ2J*dk%+x1AH50*K@lq< zyw`zKF%Yz{-Cj72a{aWvE`cQR{Qdu+72~Z=4?xNXy674B_)NBUDq3o5)!90 z0mXG3I1Mu}?LZ7rn`*QKw}gPZ^M|*?N4#~|P0pNkoP^xM6*epNXV1oM+b-Pr0UZpB z{{(yctU&l*OQx5)zD_sy#rJ0E$!GVtWI;OHEP!%D12TsUeiaL41`QtpWyg|~aQ8+6 zsvvrwa7=Dj0b=AQee!rV2yfvUlxv3|)8gnOl=mRx~+yfZkOt7JTNfCS{gF4e;0 z?i@9Rl`X0eM&*%8Jn9=pQrXOj?A<><R_<`^HNul*8zTgBCIRh>J)0>^<*E)n-^mD*$^q- zxnU==(w%+t+-qN%6XQ~olmA*RWqaII*z+y1ZVzPyuZ4|ynnCv@e?u{@T7Qq=>RK_^ z8lBkOUv6@{eA)jP$tsU=>!|;+qe8+u#qbolFYE{agQM2g0wp#W8u|msk{9c_*UEv> zHcv8WKbD-sT?%~ICms6p;7I~=KF!V_Klbr*2yHHkl{|--b=(G`K7|Ae7cnJkB)Qjh z3aX***N#AQ3+kB^sKj`aR;)H30eff-5;0av&!4BydO#AtYG;o2EX@vu@Ya~XmCLG{ zok`f6NTO|Y&o~RN06)*aK6rWA{N+l!a3&A_iZ^ebsSHzmGUU{&)}!+X*Y7??a$@ec zFDLke@Sx9l1AboA=Ld6hlC$7UTzhy4ba#lo6EavaqqspR(A{Rq^J-6*ppd=Jg~AxSF;ery92pZ)y59TwDU) zopn=)j+Vca2!o29!cv*(gJK^_3|$&GPIm-F^Ji`@d)eJ24)UJi#9#oAQB+e_wydmy zbg<}dzZ5ckkn3b~m`%A$QE3eG2JQ&R$Q!w8D=B4xZ$3E@&L&zTfjE%yI;l_=8XR6; zEMW-Hq6g@yx79aLuO0h(`LgQVN(0~g_Ow%a zMa9URBcn7eEeF6z7$KjL5_9MG4~7?d>U!2;rTFp84AVUfpj*Fa7SHkeVG4q}yN@F0 zX&gWI`}bE5NMt^j79eho2IRZ{Kzd^~$SW>ocR4X#ijMFI(vpg2&kpbIs6YFh2Ky!= z{BmwqF6HOhE)rvfJjw9Bl6wiv#N%nAF5X4C1svHUjZy9&SS&7ZpH#4d{ShZp=@Q8sX>sfGGKF z)$WqMbU+tKW{8Fr7KYX7IOHIu10?G@2L=FAUiiflYZiD6>e5Ys!RnZ=&z!6}*rypN znvH_DK}mpPn!Jm$50<3hY%Zmh@hA*Q_Wioaj;~l!|8ZCY!8GU zgXWnv8#%uY9}CGV6e>yrir1~|#pz+WA&Gilip{(HU0b6bou#8S{_m?G2?JkssS6{~ zIN742sx|nmo0QzYAP*_|qma>j#>q?Y>U~^<117k1r~;l%)YW!XJLv+&3B<8gQiNRN zg$p8wZ$W(WEdfxOoSsU^PY?6M*Hf{ixYW2xaTlU)`iSMf$XZg->5s2OVPl#&F zk3yjsqK4aQ9c)2Fgcy9NTmSkgpf76dZWFF#(6V52@=_$`(`1ENzDZ^7hFGF`b2l0zD zRv2dsT?ZHqAzZD(>&7SrUAvU=E9nNfi^x~o5f?So-@__pk$W{wBOn4KX3@*N(z-$?^oI;Kc4!tx^h;A?n6$rrr3iaroqJ)exjNv2$ zlBgrzyS$d4uU~gReA>5iM0nUc`BPZ1u#q0DDL!^?dreBS8BYl0E<%)?QNa0r-Cf>6L81I%e9p8K%%@3-tA zhpmJ6a4IJmlan|bbcdOM}9}x*Q(I7o@~FVsvrCL@P8pu21$&bJXqkmOeRL z3RdLrpS|$BA8v5n=IBKpT1?q}3SOPr8X<^T5Neh`Q>NR7Q&`>B?M$n zmK)1wLMEPP4!M1hNd0iXOA$9&*c5}Ix_Sn9F0kM4AKymYf`r}ec63oX(YC~kBa0#T z{CSK-Bh<_%C*$+;sGtGw#y~OKU^*uzI}!42w_UWIdkzA}ULM?;{A?muL_Bf*<)~TS>}{a= zV$D*CH+TY3^*t(%O2XLa=_Luzompwft#zkE{OM48ww8SsVM6&3o6c5;XD0Z0YEV9YOY*LWHR|| zj!cg?c}!xk<-?QPv7;6|J>axOYinQiLGA!o;zsU}So2`O2)>bnVqJ3tNq{Q=H*P<< zQ=#PsA3=2#BWo>2iha=7+$;bWgyUdUqPuODMMxJFUae-bO{i zO~*0+X&0#NlL3!m-5nBA4Wd7Cr9;SCcoY5`5@K4^)$#02KyZ2+O7M5)=nl5-xww=& zwjiCJs6L{I`U~WEs5&(;8cIs$BQ**oU*FxC5x0i^LwmdsgsfK4ORJMEbK!&sjiLn8 zSTpn3RA_3x#tEf*%qRu%p~zP9CV&3CE&ff>vaJOaz}vl){RO~pl>H=^HxH;ASXesb zSa(Rg%!@STlyu{47%60yDla$j-|5u~yL^63ALoXg${7*jRi%biY;0>ST4tOWD4tCP zRn+f}RmjSFFA)v6W{cWH|mGU-Y+Nc9FDJ!i}ia+P>H z5ElpPRTa~376Pca-xtZRb-nc{QQjeK+0xK1?nL|7xF7Z4*aufpYqUlEXb=!C-m17!4sn zfY1}Oj=&jF)Q}rRp zJB|DU5ikKu%gZAgmzou6fYuu=x;$80`w$#7huIBeS?`}CzGrGK~+}OuK;zD=a8TD^i=dImd}pW@%Qt(RO!JE+V4m>PGg{IO6TLew?_!<>A^*ttcp1`kGq`g%}lK%Ykox706)6EE=*j}8FHARoz)hLBv6x2glP0XyX|y1 z(NI(4>7lqpX$55-;wCvs@9NjYN6fCzo>rl`_-A<595A~-RS|VZaFa=pw|vo6 z&S3cB1@28S7#OHzeeJ>_zw9U^o*G_=HDl)5-Ua)TQOxw^KZlHgL2w)Y8u4b~BzmF) z_DiOHZEf+g=VB8--j=qTVzjSdhHpR#ADW&pa0N4R)6*@-Z?s$2zDue%U}grH<5v_t z#BGr9mN-O~Ta7KM(-YxNTa*BCK|&6qOZNU`qMs#l9g2}jAeYYoxAV)q3EJP0G0$B=I=uy`PFBW!})*|ow}H}uTokXh2s__Rv8CVT84MA-*-S?;$0G6d+r^OAZ~H&fHoF!N zyyezyZ*BE&HBfVM3b4s@MF+Uo3)ndVH*E_XA0IdOb(RAzp#V+;ivOAO40I0CnVBDB z??F5WPIWOCS~xczd)&r0d*2_U-!}4hS5$JmeDvrDu=fg#dvKEhI1usWQbus?!o!)X zR=onwFLN%IGuMj(7Jg+f!3~th;5;R6lIXPN&fVCaUyJ*JXH9*aUsn|boVs*78wA>s zwjdv(=*i>9%RDE~nwFA(x5{bi)Y9C#KkV{LW&Yua&&PZu$RxUeVT>3Pc4`ikO zV|8E(zMvvvb&=2E=A-d+n7Er!j|d;x9}Zt0#qd$XGVyYwr-Ge^9D1&pp; z9&k&_vZ`Mtpt6o(!FsUc-(Ir`ShF_w!md(xpZD8uN~tTJ2cAjd(ag?X9$gPq#vlXk zb!Kb_PP`|r3SaMMdUbbsy0-fAJ1d@_c^Co;21vJz8My4pcXBVVw*oE;?aGaco}KxT z_ZkwK;FKWysW)FmqMw^vduwj=vOsfSFAg|Qv3kAP{1qTo(DWi}RG!zgvJSXX%`*tt zl>}ylL>v3eAp4&`cY+UV1D8teJ~M^Vxy0`Sho(Tc7Wb`Qw(MTTyrtkn3C}?+d-U#I zl9j48aAXI#3Mp#;yuYB<6~h*A;FR3Bv-4T-ru)_JH@pm(wZR}CxZ2|CUGO1p1p(lq z?Qq)JuIZD3H*N!mkV=6IW){x__UM6K=Cw6yKvNp_b$~K}E^o3FO*R}HXg15Q-Dc$No}u`mMH zKbpYxt6ly4Ss(w*v4kZ11c*6r+oapJR^$Pj^W0V-UpzPg4u$1sXQ#(adi(C(BJK4u z34!3GCIhYnUu*%ke?>)~W?z{ed(Gd@4%$09AP7!ge#O8kH(+PR1eio`@`D`g;O%EN zyZ5m+uo_?9EBAMMVfFWCc~h1E=QY>e*!kJ|_nLRW49d{pyz*!LRzbaoJ#B%&Q4R(M MPgg&ebxsLQ0CBywdjJ3c diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 000000000..be3976f7e --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,55 @@ +

diff --git a/_includes/google_analytics.html b/_includes/google_analytics.html new file mode 100644 index 000000000..8ccb1d545 --- /dev/null +++ b/_includes/google_analytics.html @@ -0,0 +1,10 @@ + diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 000000000..4d7e8f001 --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,11 @@ + + + + + + {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 000000000..cfe381f75 --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,27 @@ + diff --git a/_includes/index.md b/_includes/index.md new file mode 100644 index 000000000..6a7240922 --- /dev/null +++ b/_includes/index.md @@ -0,0 +1,17 @@ +Welcome to EQcorrscan. + +These pages make up the general documentation of the EQcorrscan project, the +full API can be found +[here](http://eqcorrscan.readthedocs.org/en/latest/?badge=latest). This project +is an open source, Python project for the detection and analysis of repeating +and near-repeating earthquakes. The codes are hosted on +[github](https://github.com/calum-chamberlain/EQcorrscan), with the latest +release also available on [pypi](https://pypi.python.org/pypi/EQcorrscan/0.0.8). + +This project is in constant development, although the core routines are relatively +stable. Before we migrate to a 0.1.0 release we plan on implementing more tests +and adapting the code to more pep8 friendly style (currently we mostly follow +pep8 guidelines, but we are always learning!). + +You can find more details about the project on the [About](about) page, and +details on how to install and update on the [Installation](Installation) page. diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 000000000..3ad04d185 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,20 @@ + + + + {% include head.html %} + + + + {% include header.html %} + +
+
+ {{ content }} +
+
+ + {% include footer.html %} + {% include google_analytics.html %} + + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 000000000..74c1a1184 --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,14 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+
+ +
+ {{ content }} +
+ +
diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 000000000..a2b4e52fe --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,15 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+ +
+ +
+ {{ content }} +
+ +
diff --git a/_modules/EQcorrscan_plotting.html b/_modules/EQcorrscan_plotting.html deleted file mode 100644 index 5fb81ff33..000000000 --- a/_modules/EQcorrscan_plotting.html +++ /dev/null @@ -1,1008 +0,0 @@ - - - - - - - - - - EQcorrscan_plotting — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for EQcorrscan_plotting

-#!/usr/bin/python
-"""
-Utility code for most of the plots used as part of the EQcorrscan package.
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-import numpy as np
-import matplotlib.pylab as plt
-
-
[docs]def chunk_data(tr, samp_rate, state='mean'): - """ - Function to downsample data for plotting by computing the maximum of - data within chunks, usefil for plotting waveforms or cccsums, large datasets - that ould otherwise exceed the complexity allowed, and overflow. - - :type tr: :class: obspy.Trace - :param tr: Trace to be chunked - :type samp_rate: float - :param samp_rate: Desired sampling rate in Hz - :type state: str - :param state: Either 'Min', 'Max', 'Mean' or 'Maxabs' to return one of\ - these for the chunks. Maxabs will return the largest (positive or\ - negative) for that chunk. - - :returns: :class: obspy.Trace - """ - trout=tr.copy() # Don't do it inplace on data - x = np.arange(len(tr.data)) - y = tr.data - - chunksize=int(round(tr.stats.sampling_rate/samp_rate)) - # Wrap the array into a 2D array of chunks, truncating the last chunk if - # chunksize isn't an even divisor of the total size. - # (This part won't use _any_ additional memory) - numchunks = y.size // chunksize - ychunks = y[:chunksize*numchunks].reshape((-1, chunksize)) - xchunks = x[:chunksize*numchunks].reshape((-1, chunksize)) - - # Calculate the max, min, and means of chunksize-element chunks... - if state=='Max': - trout.data = ychunks.max(axis=1) - elif state=='Min': - trout.data = ychunks.min(axis=1) - elif state=='Mean': - trout.data = ychunks.mean(axis=1) - elif state=='Maxabs': - max_env=ychunks.max(axis=1) - min_env=ychunks.min(axis=1) - indeces=np.argmax(np.vstack([np.abs(max_env), np.abs(min_env)]),axis=0) - stack=np.vstack([max_env, min_env]).T - trout.data=np.array([stack[i][indeces[i]] for i in xrange(len(stack))]) - xcenters = xchunks.mean(axis=1) - trout.stats.starttime=tr.stats.starttime+xcenters[0]/tr.stats.sampling_rate - trout.stats.sampling_rate=samp_rate - return trout -
-
[docs]def triple_plot(cccsum, cccsum_hist, trace, threshold, save=False, savefile=''): - """ - Main function to make a triple plot with a day-long seismogram, day-long - correlation sum trace and histogram of the correlation sum to show normality - - :type cccsum: numpy.ndarray - :param cccsum: Array of the cross-channel cross-correlation sum - :type cccsum_hist: numpy.ndarray - :param ccsum_hist: cccsum for histogram plotting, can be the same as cccsum\ - but included if cccsum is just an envelope. - :type trace: obspy.Trace - :param trace: A sample trace from the same time as cccsum - :type threshold: float - :param threshold: Detection threshold within cccsum - :type save: Bool, optional - :param save: If True will svae and not plot to screen, vice-versa if False - :type savefile: String, optional - :param savefile: Path to save figure to, only required if save=True - """ - if len(cccsum) != len(trace.data): - print 'cccsum is: '+str(len(cccsum))+' trace is: '+str(len(trace.data)) - raise ValueError('cccsum and trace must have the same number of data points') - df = trace.stats.sampling_rate - npts = trace.stats.npts - t = np.arange(npts, dtype=np.float32) / (df * 3600) - # Generate the subplot for the seismic data - ax1 = plt.subplot2grid((2,5), (0,0), colspan=4) - ax1.plot(t, trace.data, 'k') - ax1.axis('tight') - ax1.set_ylim([-15 * np.mean(np.abs(trace.data)),15 * np.mean(np.abs(trace.data))]) - # Generate the subplot for the correlation sum data - ax2 = plt.subplot2grid((2,5), (1,0), colspan=4, sharex=ax1) - # Plot the threshold values - ax2.plot([min(t), max(t)], [threshold, threshold], color='r', lw=1, label="Threshold") - ax2.plot([min(t), max(t)], [-threshold,-threshold], color='r', lw=1) - ax2.plot(t, cccsum, 'k') - ax2.axis('tight') - ax2.set_ylim([-1.7 * threshold, 1.7 * threshold]) - ax2.set_xlabel("Time after %s [hr]" % trace.stats.starttime.isoformat()) - # ax2.legend() - # Generate a small subplot for the histogram of the cccsum data - ax3 = plt.subplot2grid((2,5), (1,4), sharey=ax2) - ax3.hist(cccsum_hist, 200, normed=1, histtype='stepfilled', \ - orientation='horizontal', color='black') - ax3.set_ylim([-5, 5]) - fig=plt.gcf() - fig.suptitle(trace.id) - fig.canvas.draw() - if not save: - plt.show() - plt.close() - else: - plt.savefig(savefile) - return -
-
[docs]def peaks_plot(data, starttime, samp_rate, save=False, peaks=[(0,0)], \ - savefile=''): - """ - Simple utility code to plot the correlation peaks to check that the peak - finding routine is running correctly, used in debugging for the EQcorrscan - module. - - :type data: numpy.array - :param data: Numpy array of the data within which peaks have been found - :type starttime: obspy.UTCDateTime - :param starttime: Start time for the data - :type samp_rate: float - :param samp_rate: Sampling rate of data in Hz - :type save: Boolean, optional - :param save: Save figure or plot to screen (False) - :type peaks: List of Tuple, optional - :param peaks: List of peak locations and amplitudes (loc, amp) - :type savefile: String, optional - :param savefile: Path to save to, only used if save=True - """ - npts=len(data) - t = np.arange(npts, dtype=np.float32) / (samp_rate * 3600) - fig=plt.figure() - ax1=fig.add_subplot(111) - ax1.plot(t, data, 'k') - ax1.scatter(peaks[0][1] / (samp_rate * 3600),abs(peaks[0][0]),color='r', label='Peaks') - for peak in peaks: - ax1.scatter(peak[1] / (samp_rate * 3600),abs(peak[0]),color='r') - ax1.legend() - ax1.set_xlabel("Time after %s [hr]" % starttime.isoformat()) - ax1.axis('tight') - fig.suptitle('Peaks') - if not save: - plt.show() - plt.close() - else: - plt.savefig(savefile) - return -
-
[docs]def cumulative_detections(dates, template_names, save=False, savefile=''): - """ - Simple plotting function to take a list of datetime objects and plot - a cumulative detections list. Can take dates as a list of lists and will - plot each list seperately, e.g. if you have dates from more than one - template it will overlay them in different colours. - - :type dates: list of lists of datetime.datetime - :param dates: Must be a list of lists of datetime.datetime objects - :type template_names: list of strings - :param template_names: List of the template names in order of the dates - :type save: Boolean, optional - :param save: Save figure or show to screen - :type savefile: String, optional - :param savefile: String to save to. - """ - # Set up a default series of parameters for lines - colors=['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', \ - 'firebrick', 'purple', 'darkgoldenrod', 'gray'] - linestyles=['-','-.', '--', ':'] - # Check that dates is a list of lists - if type(dates[0]) != list: - dates=[dates] - i=0 - j=0 - k=0 - plothandles=[] - for template_dates in dates: - template_dates.sort() - counts=np.arange(0,len(template_dates)) - print str(i)+' '+str(j)+' '+str(k) - filename,=plt.plot(template_dates,counts, linestyles[j], \ - color=colors[i], label=template_names[k],\ - linewidth=3.0) - k+=1 - plothandles.append(filename) - if i < len(colors)-1: - i+=1 - else: - i=0 - if j < len(linestyles)-1: - j+=1 - else: - j=0 - plt.xlabel('Date') - plt.ylabel('Cumulative detections') - plt.title('Cumulative detections for all templates') - plt.legend(loc=2,prop={'size':8},ncol=2)#handles=plothandles) - if save: - plt.savefig(savefile) - plt.close() - else: - plt.show() - return -
-
[docs]def threeD_gridplot(nodes, save=False, savefile=''): - """ - Function to plot in 3D a series of grid points. - - :type nodes: List of tuples - :param nodes: List of tuples of the form (lat, long, depth) - :type save: bool - :param save: if True will save without plotting to screen, if False\ - (default) will plot to screen but not save - :type savefile: str - :param savefile: required if save=True, path to save figure to. - """ - lats=[] - longs=[] - depths=[] - for node in nodes: - lats.append(float(node[0])) - longs.append(float(node[1])) - depths.append(float(node[2])) - from mpl_toolkits.mplot3d import Axes3D - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - ax.scatter(lats, longs, depths) - ax.set_ylabel("Latitude (deg)") - ax.set_xlabel("Longitude (deg)") - ax.set_zlabel("Depth(km)") - ax.get_xaxis().get_major_formatter().set_scientific(False) - ax.get_yaxis().get_major_formatter().set_scientific(False) - if not save: - plt.show() - plt.close() - else: - plt.savefig(savefile) - return -
-
[docs]def multi_event_singlechan(streams, picks, clip=10.0, pre_pick=2.0,\ - freqmin=False, freqmax=False, realign=False, \ - cut=(-3.0,5.0), PWS=False, title=False): - """ - Function to plot data from a single channel at a single station for multiple - events - data will be alligned by their pick-time given in the picks - - :type streams: List of :class:obspy.stream - :param streams: List of the streams to use, can contain more traces than\ - you plan on plotting - :type picks: List of :class:PICK - :param picks: List of picks, one for each stream - :type clip: float - :param clip: Length in seconds to plot, defaults to 10.0 - :type pre_pick: Float - :param pre_pick: Length in seconds to extract and plot before the pick,\ - defaults to 2.0 - :type freqmin: float - :param freqmin: Low cut for bandpass in Hz - :type freqmax: float - :param freqmax: High cut for bandpass in Hz - :type realign: Bool - :param realign: To compute best alignement based on correlation or not. - :type cut: tuple: - :param cut: tuple of start and end times for cut in seconds from the pick - :type PWS: bool - :param PWS: compute Phase Weighted Stack, if False, will compute linear stack - :type title: str - :param title: Plot title. - - :returns: Alligned and cut traces, and new picks - """ - from eqcorrscan.utils import stacking - import copy - from eqcorrscan.core.match_filter import normxcorr2 - from obspy import Stream - fig, axes = plt.subplots(len(picks)+1, 1, sharex=True, figsize=(7, 12)) - axes = axes.ravel() - traces=[] - al_traces=[] - # Keep input safe - plist=copy.deepcopy(picks) - st_list=copy.deepcopy(streams) - for i, pick in enumerate(plist): - if st_list[i].select(station=pick.station, \ - channel='*'+pick.channel[-1]): - tr=st_list[i].select(station=pick.station, \ - channel='*'+pick.channel[-1])[0] - else: - print 'No data for '+pick.station+'.'+pick.channel - continue - tr.detrend('linear') - if freqmin: - tr.filter('bandpass', freqmin=freqmin, freqmax=freqmax) - if realign: - tr_cut=tr.copy() - tr_cut.trim(pick.time+cut[0], pick.time+cut[1],\ - nearest_sample=False) - if len(tr_cut.data)<=0.5*(cut[1]-cut[0])*tr_cut.stats.sampling_rate: - print 'Not enough in the trace for '+pick.station+'.'+pick.channel - print 'Suggest removing pick from sfile at time '+str(pick.time) - else: - al_traces.append(tr_cut) - else: - tr.trim(pick.time-pre_pick, pick.time+clip-pre_pick,\ - nearest_sample=False) - if len(tr.data)==0: - print 'No data in the trace for '+pick.station+'.'+pick.channel - print 'Suggest removing pick from sfile at time '+str(pick.time) - continue - traces.append(tr) - if realign: - shift_len=int(0.25 * (cut[1] - cut[0]) * al_traces[0].stats.sampling_rate) - shifts=stacking.align_traces(al_traces, shift_len) - for i in xrange(len(shifts)): - print 'Shifting by '+str(shifts[i])+' seconds' - pick.time-=shifts[i] - traces[i].trim(pick.time - pre_pick, pick.time + clip-pre_pick,\ - nearest_sample=False) - # We now have a list of traces - traces=[(trace, trace.stats.starttime.datetime) for trace in traces] - traces.sort(key=lambda tup:tup[1]) - traces=[trace[0] for trace in traces] - # Plot the traces - for i, tr in enumerate(traces): - y = tr.data - x = np.arange(len(y)) - x = x / tr.stats.sampling_rate # convert to seconds - axes[i+1].plot(x, y, 'k', linewidth=1.1) - # axes[i+1].set_ylabel(tr.stats.starttime.datetime.strftime('%Y/%m/%d %H:%M'),\ - # rotation=0) - axes[i+1].yaxis.set_ticks([]) - traces=[Stream(trace) for trace in traces] - if PWS: - linstack=stacking.PWS_stack(traces) - else: - linstack=stacking.linstack(traces) - tr=linstack.select(station=picks[0].station, \ - channel='*'+picks[0].channel[-1])[0] - y = tr.data - x = np.arange(len(y)) - x = x / tr.stats.sampling_rate - axes[0].plot(x, y, 'r', linewidth=2.0) - axes[0].set_ylabel('Stack', rotation=0) - axes[0].yaxis.set_ticks([]) - for i, slave in enumerate(traces): - cc=normxcorr2(tr.data, slave[0].data) - axes[i+1].set_ylabel('cc='+str(round(np.max(cc),2)), rotation=0) - axes[i+1].text(0.9, 0.15, str(round(np.max(slave[0].data))), \ - bbox=dict(facecolor='white', alpha=0.95),\ - transform=axes[i+1].transAxes) - axes[i+1].text(0.7, 0.85, slave[0].stats.starttime.datetime.strftime('%Y/%m/%d %H:%M:%S'), \ - bbox=dict(facecolor='white', alpha=0.95),\ - transform=axes[i+1].transAxes) - axes[-1].set_xlabel('Time (s)') - if title: - axes[0].set_title(title) - plt.subplots_adjust(hspace=0) - plt.show() - return traces, plist -
-
[docs]def detection_multiplot(stream, template, times, streamcolour='k',\ - templatecolour='r'): - """ - Function to plot the stream of data that has been detected in, with the - template on top of it timed according to a list of given times, just a - pretty way to show a detection! - - :type stream: obspy.Stream - :param stream: Stream of data to be plotted as the base (black) - :type template: obspy.Stream - :param template: Template to be plotted on top of the base stream (red) - :type times: List of datetime.datetime - :param times: list of times of detections in the order of the channels in - template. - :type streamcolour: str - :param streamcolour: String of matplotlib colour types for the stream - :type templatecolour: str - :param templatecolour: Colour to plot the template in. - """ - import datetime as dt - fig, axes = plt.subplots(len(template), 1, sharex=True) - axes = axes.ravel() - print 'Template has '+str(len(template))+' channels' - for i, template_tr in enumerate(template): - print 'Working on: '+template_tr.stats.station+' '+\ - template_tr.stats.channel - image=stream.select(station=template_tr.stats.station,\ - channel='*'+template_tr.stats.channel[-1]) - if not image: - print 'No data for '+template_tr.stats.station+' '+\ - template_tr.stats.channel - continue - image=image.merge()[0] - t_start=(times[i]-image.stats.starttime.datetime) # Gives a timedelta - print t_start - # Downsample if needed - if image.stats.sampling_rate > 20: - image.decimate(int(image.stats.sampling_rate/20)) - if template_tr.stats.sampling_rate > 20: - template_tr.decimate(int(template_tr.stats.sampling_rate/20)) - image_times=[image.stats.starttime.datetime+dt.timedelta((j*image.stats.delta)/86400)\ - for j in range(len(image.data))] # Give list of datetime objects - t_start=t_start+image.stats.starttime.datetime - template_times=[t_start+dt.timedelta((j*template_tr.stats.delta)/86400)\ - for j in range(len(template_tr.data))] - print image_times[0] - print template_times[0] - axes[i].plot(image_times, image.data,'k') - axes[i].plot(template_times, template_tr.data,'r') - axes[i].set_ylabel(template_tr.stats.station+'.'+template_tr.stats.channel) - axes[len(axes)-1].set_xlabel('Time') - plt.show() - return -
-
[docs]def interev_mag_sfiles(sfiles): - """ - Function to plot interevent-time versus magnitude for series of events. - Wrapper for interev_mag. - - :type sfiles: List - :param sfiles: List of sfiles to read from - """ - from eqcorrscan.utils import Sfile_util - times=[Sfile_util.readheader(sfile).time for sfile in sfiles] - mags=[Sfile_util.readheader(sfile).Mag_1 for sfile in sfiles] - interev_mag(times, mags) -
-
[docs]def interev_mag(times, mags): - """ - Function to plot interevent times against magnitude for given times - and magnitudes. - - :type times: list of datetime - :param times: list of the detection times, must be sorted the same as mags - :type mags: list of float - :param mags: list of magnitudes - """ - l = [(times[i], mags[i]) for i in xrange(len(times))] - l.sort(key=lambda tup:tup[0]) - times=[x[0] for x in l] - mags=[x[1] for x in l] - # Make two subplots next to each other of time before and time after - fig, axes = plt.subplots(1,2, sharey=True) - axes = axes.ravel() - pre_times=[] - post_times=[] - for i in range(len(times)): - if i > 0: - pre_times.append((times[i]-times[i-1])/60) - if i < len(times)-1: - post_times.append((times[i+1]-times[i])/60) - axes[0].scatter(pre_times, mags[1:]) - axes[0].set_title('Pre-event times') - axes[0].set_ylabel('Magnitude') - axes[0].set_xlabel('Time (Minutes)') - # axes[0].set_xlim([0, max(pre_times)+(0.1*(max(pre_times)-min(pre_times)))]) - plt.setp(axes[0].xaxis.get_majorticklabels(), rotation=30 ) - axes[1].scatter(pre_times, mags[:-1]) - axes[1].set_title('Post-event times') - axes[1].set_xlabel('Time (Minutes)') - # axes[1].set_xlim([0, max(post_times)+(0.1*(max(post_times)-min(post_times)))]) - plt.setp(axes[1].xaxis.get_majorticklabels(), rotation=30 ) - plt.show() -
-
[docs]def threeD_seismplot(stations, nodes): - """ - Function to plot seismicity and stations in a 3D, movable, zoomable space - using matplotlibs Axes3D package. - - :type stations: list of tuple - :param stations: list of one tuple per station of (lat, long, elevation), - with up positive - :type nodes: list of tuple - :param nodes: list of one tuple per event of (lat, long, depth) with down - positive - """ - stalats=[] - stalongs=[] - staelevs=[] - evlats=[] - evlongs=[] - evdepths=[] - for station in stations: - stalats+=[station[0]] - stalongs+=[station[1]] - staelevs+=[station[2]] - for node in nodes: - evlats+=[node[0]] - evlongs+=[node[1]] - evdepths+=[-1*node[2]] - from mpl_toolkits.mplot3d import Axes3D - fig = plt.figure() - ax = fig.add_subplot(111, projection='3d') - ax.scatter(evlats, evlongs, evdepths, marker="x", c="k") - ax.scatter(stalats, stalongs, staelevs, marker="v", c="r") - ax.set_ylabel("Latitude (deg)") - ax.set_xlabel("Longitude (deg)") - ax.set_zlabel("Depth(km)") - ax.get_xaxis().get_major_formatter().set_scientific(False) - ax.get_yaxis().get_major_formatter().set_scientific(False) - plt.show() - return -
-
[docs]def Noise_plotting(station, channel, PAZ, datasource): - """ - Function to make use of obspy's PPSD functionality to read in data from - a single station and the poles-and-zeros for that station before plotting - the PPSD for this station. See McNamara(2004) for more details. - - :type station: String - :param station: Station name as it is in the filenames in the database - :type channel: String - :param channel: Channel name as it is in the filenames in the database - :type PAZ: Dict - :param PAZ: Must contain, Poles, Zeros, Sensitivity, Gain - :type Poles: List of Complex - :type Zeros: List of Complex - :type Sensitivity: Float - :type Gain: Float - :type datasource: String - :param datasource: The directory in which data can be found, can contain - wildcards. - - :returns: PPSD object - """ - from obspy.signal import PPSD - from obspy import read as obsread - import glob - - stafiles=glob.glob(datasource+'/*'+station+'*'+channel+'*') - stafiles.sort() - # Initialize PPSD - st=obsread(stafiles[0]) - ppsd = PPSD(st[0].stats, PAZ) - for stafile in stafiles[1:]: - print 'Adding waveform from: '+stafile - st=obsread(stafile) - # Add after read to conserve memory - ppsd.add(st) - # Plot the PPSD - ppsd.plot() - return ppsd -
-
[docs]def pretty_template_plot(template, size=(18.5, 10.5), save=False, title=False,\ - background=False): - """ - Function to make a pretty plot of a single template, designed to work better - than the default obspy plotting routine for short data lengths. - - :type template: :class: obspy.Stream - :param template: Template stream to plot - :type size: tuple - :param size: tuple of plot size - :type save: Boolean - :param save: if False will plot to screen, if True will save - :type title: Boolean - :param title: String if set will be the plot title - :type backrgound: :class: obspy.stream - :param background: Stream to plot the template within. - """ - fig, axes = plt.subplots(len(template), 1, sharex=True, figsize=size) - if len(template) > 1: - axes = axes.ravel() - else: - return - if not background: - mintime=template.sort(['starttime'])[0].stats.starttime - else: - mintime=background.sort(['starttime'])[0].stats.starttime - template.sort(['network','station', 'starttime']) - for i, tr in enumerate(template): - delay=tr.stats.starttime-mintime - delay*=tr.stats.sampling_rate - y=tr.data - x=np.arange(len(y)) - x+=delay - x=x/tr.stats.sampling_rate - # x=np.arange(delay, (len(y)*tr.stats.sampling_rate)+delay,\ - # tr.stats.sampling_rate) - if background: - btr=background.select(station=tr.stats.station, \ - channel=tr.stats.channel)[0] - bdelay=btr.stats.starttime-mintime - bdelay*=btr.stats.sampling_rate - by=btr.data - bx=np.arange(len(by)) - bx+=bdelay - bx=bx/btr.stats.sampling_rate - axes[i].plot(bx,by,'k',linewidth=1) - axes[i].plot(x, y, 'r', linewidth=1.1) - else: - axes[i].plot(x, y, 'k', linewidth=1.1) - print tr.stats.station+' '+str(len(x))+' '+str(len(y)) - axes[i].set_ylabel(tr.stats.station+'.'+tr.stats.channel, rotation=0) - axes[i].yaxis.set_ticks([]) - axes[i-1].set_xlabel('Time (s) from start of template') - plt.subplots_adjust(hspace=0) - if title: - axes[0].set_title(title) - if not save: - plt.show() - plt.close() - else: - plt.savefig(save) -
-
[docs]def NR_plot(stream, NR_stream, detections, false_detections=False,\ - size=(18.5,10), save=False, title=False): - """ - Function to plot the Network response alongside the streams used - highlights - detection times in the network response - - :type stream: :class: obspy.Stream - :param stream: Stream to plot - :type NR_stream: :class: obspy.Stream - :param NR_stream: Stream for the network response - :type detections: List of datetime objects - :param detections: List of the detections - :type false_detections: List of datetime - :param false_detections: Either False (default) or list of false detection\ - times - :type size: tuple - :param size: Size of figure, default is (18.5,10) - :type save: bool - :param save: Save figure or plot to screen, if not False, must be string of\ - save path - :type title: str - :param title: String for the title of the plot, set to False - """ - import datetime as dt - import matplotlib.dates as mdates - fig, axes = plt.subplots(len(stream)+1, 1, sharex=True, figsize=size) - if len(stream) > 1: - axes = axes.ravel() - else: - return - mintime=stream.sort(['starttime'])[0].stats.starttime - stream.sort(['network','station', 'starttime']) - for i, tr in enumerate(stream): - delay=tr.stats.starttime-mintime - delay*=tr.stats.sampling_rate - y=tr.data - x=[tr.stats.starttime + dt.timedelta(seconds=s/tr.stats.sampling_rate)\ - for s in xrange(len(y))] - x=mdates.date2num(x) - axes[i].plot(x, y, 'k', linewidth=1.1) - axes[i].set_ylabel(tr.stats.station+'.'+tr.stats.channel, rotation=0) - axes[i].yaxis.set_ticks([]) - axes[i].set_xlim(x[0], x[-1]) - # Plot the network response - tr=NR_stream[0] - delay=tr.stats.starttime-mintime - delay*=tr.stats.sampling_rate - y=tr.data - x=[tr.stats.starttime + dt.timedelta(seconds=s/tr.stats.sampling_rate)\ - for s in range(len(y))] - x=mdates.date2num(x) - axes[i].plot(x, y, 'k', linewidth=1.1) - axes[i].set_ylabel(tr.stats.station+'.'+tr.stats.channel, rotation=0) - axes[i].yaxis.set_ticks([]) - axes[-1].set_xlabel('Time') - axes[-1].set_xlim(x[0], x[-1]) - # Plot the detections! - ymin, ymax = axes[-1].get_ylim() - if false_detections: - for detection in false_detections: - xd=mdates.date2num(detection) - axes[-1].plot((xd, xd), (ymin, ymax), 'k--', linewidth=0.5, alpha=0.5) - for detection in detections: - xd=mdates.date2num(detection) - axes[-1].plot((xd, xd), (ymin, ymax), 'r--', linewidth=0.75) - # Set formatters for x-labels - mins=mdates.MinuteLocator() - if (tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() >= 10800\ - and (tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() <= 25200: - hours=mdates.MinuteLocator(byminute=[0,15,30,45]) - elif(tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() <= 1200: - hours=mdates.MinuteLocator(byminute=range(0,60,2)) - elif (tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() > 25200\ - and (tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() <= 172800: - hours=mdates.HourLocator(byhour=range(0,24,3)) - elif (tr.stats.endtime.datetime-tr.stats.starttime.datetime).total_seconds() > 172800: - hours=mdates.DayLocator() - else: - hours=mdates.MinuteLocator(byminute=range(0,60,5)) - hrFMT=mdates.DateFormatter('%Y/%m/%d %H:%M:%S') - axes[-1].xaxis.set_major_locator(hours) - axes[-1].xaxis.set_major_formatter(hrFMT) - axes[-1].xaxis.set_minor_locator(mins) - plt.gcf().autofmt_xdate() - axes[-1].fmt_xdata=mdates.DateFormatter('%Y/%m/%d %H:%M:%S') - plt.subplots_adjust(hspace=0) - if title: - axes[0].set_title(title) - if not save: - plt.show() - plt.close() - else: - plt.savefig(save) - return -
-
[docs]def SVD_plot(SVStreams, SValues, stachans, title=False): - """ - Function to plot the singular vectors from the clustering routines, one - plot for each stachan - - :type SVStreams: List of :class:Obspy.Stream - :param SVStreams: See clustering.SVD_2_Stream - will assume these are\ - ordered by power, e.g. first singular vector in the first stream - :type SValues: List of float - :param SValues: List of the singular values corresponding to the SVStreams - :type stachans: List - :param stachans: List of station.channel - """ - for stachan in stachans: - print stachan - plot_traces=[SVStream.select(station=stachan.split('.')[0],\ - channel=stachan.split('.')[1])[0]\ - for SVStream in SVStreams] - fig, axes = plt.subplots(len(plot_traces), 1, sharex=True) - axes = axes.ravel() - for i, tr in enumerate(plot_traces): - y = tr.data - x = np.arange(len(y)) - x = x*tr.stats.delta - axes[i].plot(x,y,'k', linewidth=1.1) - axes[i].set_ylabel('SV '+str(i+1)+'='+\ - str(round(SValues[i]/len(SValues),2)), rotation=0) - axes[i].yaxis.set_ticks([]) - print i - axes[-1].set_xlabel('Time (s)') - plt.subplots_adjust(hspace=0) - if title: - axes[0].set_title(title) - else: - axes[0].set_title(stachan) - plt.show() - return -
-
[docs]def plot_synth_real(real_template, synthetic, channels=False): - """ - Plot multiple channels of data for real data and synthetic - - :type real_template: obspy.Stream - :param real_template: Stream of the real template - :type synthetic: obspy.Stream - :param synthetic: Stream of synthetic template - :type channels: List of str - :param channels: List of tuples of (station, channel) to plot, default is\ - False, which plots all. - """ - from obspy.signal.cross_correlation import xcorr - from obspy import Stream - colours=['k', 'r'] - labels=['Real', 'Synthetic'] - if channels: - real=[] - synth=[] - for stachan in channels: - real.append(real_template.select(station=stachan[0],\ - channel=stachan[1])) - synth.append(synthetic.select(station=stachan[0],\ - channel=stachan[1])) - real_template=Stream(real) - synthetic=Stream(synth) - - # Extract the station and channels - stachans = list(set([(tr.stats.station, tr.stats.channel)\ - for tr in real_stream])) - fig, axes = plt.subplots(len(stachans), 1, sharex=True, figsize=(5,10)) - axes=axes.ravel() - for i, stachan in enumerate(stachans): - real_tr=real_template.select(station=stachan[0],\ - channel=stachan[1])[0] - synth_tr=synthetic.select(station=stachan[0],\ - channel=stachan[1])[0] - shift, corr = xcorr(real_tr, synth_tr, 2) - print 'Shifting by: '+str(shift)+' samples' - if corr < 0: - synth_tr.data = synth_tr.data * -1 - corr = corr * -1 - if shift < 0: - synth_tr.data = synth_tr.data[abs(shift):] - real_tr.data = real_tr.data[0:len(synth_tr.data)] - elif shift > 0: - real_tr.data = real_tr.data[abs(shift):] - synth_tr.data = synth_tr.data[0:len(real_tr.data)] - for j, tr in enumerate([real_tr, synth_tr]): - y = tr.data - y = y / float(max(abs(y))) - x = np.arange(0, len(y)) - x = x / tr.stats.sampling_rate - axes[i].plot(x, y, colours[j], linewidth=2.0, label=labels[j]) - axes[i].get_yaxis().set_ticks([]) - axes[i].set_ylabel(stachan[0]+'.'+stachan[1]+' cc='+str(round(corr,2)),\ - rotation=0) - plt.subplots_adjust(hspace=0) - # axes[0].legend() - axes[-1].set_xlabel('Time (s)') - plt.show()
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/Sfile_util.html b/_modules/Sfile_util.html deleted file mode 100644 index 5c0d51920..000000000 --- a/_modules/Sfile_util.html +++ /dev/null @@ -1,872 +0,0 @@ - - - - - - - - - - Sfile_util — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for Sfile_util

-#!/usr/bin/python
-"""
-Part of the EQcorrscan module to read nordic format s-files and write them
-EQcorrscan is a python module designed to run match filter routines for
-seismology, within it are routines for integration to seisan and obspy.
-With obspy integration (which is necessary) all main waveform formats can be
-read in and output.
-
-Code generated by Calum John Chamberlain of Victoria University of Wellington,
-2015.
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-
-
-from obspy import UTCDateTime
-import numpy as np
-
-
[docs]class PICK: - """ - Pick information for seisan implimentation, note all fields can be left\ - blank to obtain a default pick: picks have a print function which will\ - print them as they would be seen in an S-file. - - Attributes: - :type station: str - :param station: Station name, less than five charectars required as\ - standard - :type channel: str - :param channel: Two or three charactar channel name, stored as two\ - charactars in S-file - :type impulsivity: str - :param impulsivity: either 'C' or 'D' for compressive and dilatational - :type phase: str - :param phase: Any allowable phase name in two characters - :type weight: int - :param weight: 0-4 with 0=100%, 4=0%, use weight=9 for unknown timing - :type polarity: str - :type time: obspy.UTCDateTime() - :param time: Pick time as an obspy.UTCDateTime object - :type coda: int - :param coda: Length of coda in seconds - :type amplitude: float - :param amplitude: Amplitude (zero-peak), type is given in phase - :type peri: float - :param peri: Period of amplitude - :type azimuth: float - :param azimuth: Direction of approach in degrees - :type velocity: float - :param velocity: Phase velocity (km/s) - :type AIN: int - :param AIN: Angle of incidence. - :type SNR: float - :param SNR: Signal to noise ratio - :type azimuthres: int - :param azimuthres: Residual azimuth - :type timeres: float - :param timeres: Time residual in seconds - :type finalweight: int - :param finalweight: Final weight used in location - :type distance: float - :param distance: Source-reciever distance in km - :type CAZ: int - :param CAZ: Azimuth at source. - """ - pickcount=0 - def __init__(self, station=' ', channel=' ', impulsivity=' ', phase=' ', - weight=999, polarity=' ', time=UTCDateTime(0), - coda=999, amplitude=float('NaN'), - peri=float('NaN'), azimuth=float('NaN'), - velocity=float('NaN'), AIN=999, SNR=float('NaN'), - azimuthres=999, timeres=float('NaN'), - finalweight=999, distance=float('NaN'), - CAZ=999): - self.station=station - self.channel=channel - self.impulsivity=impulsivity - self.phase=phase - self.weight=weight - self.polarity=polarity - self.time=time - self.coda=coda - self.amplitude=amplitude - self.peri=peri - self.azimuth=azimuth - self.velocity=velocity - self.AIN=AIN - self.SNR=SNR - self.azimuthres=azimuthres - self.timeres=timeres - self.finalweight=finalweight - self.distance=distance - self.CAZ=CAZ - self.pickcount+=1 - def __repr__(self): - return "PICK()" - def __str__(self): - if self.distance >= 100.0: - self.distance=_int_conv(self.distance) - elif self.distance < 100.0: - self.distance=int(round(self.distance,1)) - if not self.AIN=='': - if not np.isnan(self.AIN): - dummy=int(self.AIN) - else: - dummy=self.AIN - else: - dummy=self.SNR - print_str=' '+self.station.ljust(5)+\ - self.channel[0]+self.channel[len(self.channel)-1]+\ - ' '+self.impulsivity+\ - self.phase.ljust(4)+\ - _str_conv(self.weight).rjust(1)+' '+\ - self.polarity.rjust(1)+' '+\ - str(self.time.hour).rjust(2)+\ - str(self.time.minute).rjust(2)+\ - str(self.time.second).rjust(3)+'.'+\ - str(float(self.time.microsecond)/(10**4)).split('.')[0].zfill(2)+\ - _str_conv(int(self.coda)).rjust(5)[0:5]+\ - _str_conv(round(self.amplitude,1)).rjust(7)[0:7]+\ - _str_conv(self.peri).rjust(5)+\ - _str_conv(self.azimuth).rjust(6)+\ - _str_conv(self.velocity).rjust(5)+\ - _str_conv(dummy).rjust(4)+\ - _str_conv(int(self.azimuthres)).rjust(3)+\ - _str_conv(self.timeres, rounded=2).rjust(5)+\ - _str_conv(int(self.finalweight)).rjust(2)+\ - _str_conv(self.distance).rjust(5)+\ - _str_conv(int(self.CAZ)).rjust(4) - return print_str -
[docs] def write(self, filename): - """ - Public function to write the pick to a file - - :type filename: str - :param filename: Path to file to write to - will append to file - """ - import os - import warnings - if os.path.isfile(filename): - open_as='a' - else: - warnings.warn('File does not exist, no header') - open_as='w' - - with open(filename,open_as) as f: - pickstr=self.__str__() - f.write(pickstr+'\n') - return - -
-
[docs]class EVENTINFO: - """ - Header information for seisan events, again all fields can be left blank for\ - a default empty header. The print function for header will print important\ - information, but not as seen in an S-file. - - For more information on parameters see the seisan manual. - - Attributes: - :type time: obspy.UTCDateTime - :param time: Event origin time - :type loc_mod_ind: str - :param loc_mod_ind: - :type dist_ind: str - :param dist_ind: Distance flag, usually 'L' for local, 'R' for regional\ - and 'D' for distant - :type ev_id: str - :param ev_id: Often blank, 'E' denotes explosion and fixes depth to 0km - :type latitude: float - :param latitude: Hypocentre latitude in decimal degrees - :type longitude: float - :param lognitude: Hypocentre longitude in decimal degrees - :type depth: float - :param depth: hypocentre depth in km - :type depth_ind: str - :param depth_ind: - :type loc_ind: str - :param loc_ind: - :type agency: str - :param agency: Reporting agency, three letters - :type nsta: int - :param nsta: Number of stations recording - :type t_RMS: float - :param t_RMS: Root-mean-squared time residual - :type Mag_1: float - :param Mag_1: first magnitude - :type Mag_1_type: str - :param Mag_1_type: Type of magnitude for Mag_1 ('L', 'C', 'W') - :type Mag_1_agency: str - :param Mag_1_agency: Reporting agency for Mag_1 - :type Mag_2: float - :param Mag_2: second magnitude - :type Mag_2_type: str - :param Mag_2_type: Type of magnitude for Mag_2 ('L', 'C', 'W') - :type Mag_2_agency: str - :param Mag_2_agency: Reporting agency for Mag_2 - :type Mag_3: float - :param Mag_3: third magnitude - :type Mag_3_type: str - :param Mag_3_type: Type of magnitude for Mag_3 ('L', 'C', 'W') - :type Mag_3_agency: str - :param Mag_3_agency: Reporting agency for Mag_3 - """ - def __init__(self, time=UTCDateTime(0), loc_mod_ind=' ', dist_ind=' ', - ev_id=' ', latitude=float('NaN'), longitude=float('NaN'), - depth=float('NaN'), depth_ind=' ', loc_ind=' ', agency=' ', - nsta=0, t_RMS=float('NaN'), Mag_1=float('NaN'), - Mag_1_type=' ', Mag_1_agency=' ', Mag_2=float('NaN'), - Mag_2_type=' ', Mag_2_agency=' ', Mag_3=float('NaN'), - Mag_3_type=' ', Mag_3_agency=' '): - self.time=time - self.loc_mod_ind=loc_mod_ind - self.dist_ind=dist_ind - self.ev_id=ev_id - self.latitude=latitude - self.longitude=longitude - self.depth=depth - self.depth_ind=depth_ind - self.loc_ind=loc_ind - self.agency=agency - self.nsta=nsta - self.t_RMS=t_RMS - self.Mag_1=Mag_1 - self.Mag_1_type=Mag_1_type - self.Mag_1_agency=Mag_1_agency - self.Mag_2=Mag_2 - self.Mag_2_type=Mag_2_type - self.Mag_2_agency=Mag_2_agency - self.Mag_3=Mag_3 - self.Mag_3_type=Mag_3_type - self.Mag_3_agency=Mag_3_agency - def __repr__(self): - return "HEADER()" - def __str__(self): - print_str=str(self.time)+' '+str(self.latitude)+','+str(self.longitude)\ - +' '+str(self.depth)+' '+self.Mag_1_type+':'+str(self.Mag_1)+\ - self.Mag_2_type+':'+str(self.Mag_2)+\ - self.Mag_3_type+':'+str(self.Mag_3)+' '+self.agency - return print_str -
-
[docs]def _int_conv(string): - """ - Convenience tool to convert from string to integer, if empty string return - a 999 rather than an error - """ - try: - intstring=int(string) - except: - intstring=999 - return intstring -
-
[docs]def _float_conv(string): - """ - Convenience tool to convert from string to float, if empty string return - NaN rather than an error - """ - try: - floatstring=float(string) - except: - floatstring=float('NaN') - return floatstring -
-
[docs]def _str_conv(number, rounded=False): - """ - Convenience tool to convert a number, either float or into into a string, - if the int is 999, or the float is NaN, returns empty string. - """ - if (type(number)==float and np.isnan(number)) or number==999: - string=' ' - elif type(number)==str: - return number - elif not rounded: - string=str(number) - elif rounded==2: - string='{0:.2f}'.format(number) - return string -
-
[docs]def readheader(sfilename): - """ - Fucntion to read the header information from a seisan nordic format S-file. - - :type sfilename: str - :param sfilename: Path to the s-file - - :returns: :class: EVENTINFO - """ - import warnings - f=open(sfilename,'r') - # Base populate to allow for empty parts of file - sfilename_header=EVENTINFO() - topline=f.readline() - if topline[79]==' ' or topline[79]=='1': - # Topline contains event information - try: - sfile_seconds=int(topline[16:18]) - if sfile_seconds==60: - sfile_seconds=0 - add_seconds=60 - else: - add_seconds=0 - sfilename_header.time=UTCDateTime(int(topline[1:5]),int(topline[6:8]), - int(topline[8:10]),int(topline[11:13]), - int(topline[13:15]),sfile_seconds - ,int(topline[19:20])*100000)+add_seconds - except: - warnings.warn("Couldn't read a date from sfile: "+sfilename) - sfilename_header.time=UTCDateTime(0) - sfilename_header.loc_mod_ind=topline[20] - sfilename_header.dist_ind=topline[21] - sfilename_header.ev_id=topline[22] - sfilename_header.latitude=_float_conv(topline[23:30]) - sfilename_header.longitude=_float_conv(topline[31:38]) - sfilename_header.depth=_float_conv(topline[39:43]) - sfilename_header.depth_ind=topline[44] - sfilename_header.loc_ind=topline[45] - sfilename_header.agency=topline[46:48].strip() - sfilename_header.nsta=_int_conv(topline[49:51]) - sfilename_header.t_RMS=_float_conv(topline[52:55]) - sfilename_header.Mag_1=_float_conv(topline[56:59]) - sfilename_header.Mag_1_type=topline[59] - sfilename_header.Mag_1_agency=topline[60:63].strip() - sfilename_header.Mag_2=_float_conv(topline[64:67]) - sfilename_header.Mag_2_type=topline[67] - sfilename_header.Mag_2_agency=topline[68:71].strip() - sfilename_header.Mag_3=_float_conv(topline[72:75]) - sfilename_header.Mag_3_type=topline[75].strip() - sfilename_header.Mag_3_agency=topline[76:79].strip() - else: - for line in f: - if line[79]=='1': - line=topline - try: - sfilename_header.time=UTCDateTime(int(topline[1:5]),int(topline[6:8]), - int(topline[8:10]),int(topline[11:13]), - int(topline[13:15]),int(topline[16:18]) - ,int(topline[19:20])*10) - except: - sfilename_header.time=UTCDateTime(0) - sfilename_header.loc_mod_ind=topline[21] - sfilename_header.dist_ind=topline[22] - sfilename_header.ev_id=topline[23] - sfilename_header.latitude=_float_conv(topline[24:30]) - sfilename_header.longitude=_float_conv(topline[31:38]) - sfilename_header.depth=_float_conv(topline[39:43]) - sfilename_header.depth_ind=topline[44] - sfilename_header.loc_ind=topline[45] - sfilename_header.agency=topline[46:48].strip() - sfilename_header.nsta=_int_conv(topline[49:51]) - sfilename_header.t_RMS=_float_conv(topline[52:55]) - sfilename_header.Mag_1=_float_conv(topline[56:59]) - sfilename_header.Mag_1_type=topline[60] - sfilename_header.Mag_1_agency=topline[61:63].strip() - sfilename_header.Mag_2=_float_conv(topline[64:67]) - sfilename_header.Mag_2_type=topline[68] - sfilename_header.Mag_2_agency=topline[69:71].strip() - sfilename_header.Mag_3=_float_conv(topline[72:75]) - sfilename_header.Mag_3_type=topline[76].strip() - sfilename_header.Mag_3_agency=topline[77:79].strip() - if line[79]=='7': - break - f.close() - return sfilename_header -
-
[docs]def readpicks(sfilename): - """ - Function to read pick information from the s-file - - :type sfilename: String - :param sfilename: Path to sfile - - :return: List of :class: PICK - """ - # First we need to read the header to get the timing info - sfilename_header=readheader(sfilename) - evtime=sfilename_header.time - f=open(sfilename,'r') - pickline=[] - lineno=0 - if 'headerend' in locals(): - del headerend - for line in f: - if 'headerend' in locals(): - if len(line.rstrip('\n').rstrip('\r')) in [80,79] and \ - (line[79]==' ' or line[79]=='4' or line [79]=='\n'): - pickline+=[line] - elif line[79]=='7': - header=line - headerend=lineno - lineno+=1 - picks=[] - for line in pickline: - if line[18:28].strip()=='': # If line is empty miss it - continue - station=line[1:6].strip() - channel=line[6:8].strip() - impulsivity=line[9] - weight=line[14] - if weight=='_': - phase=line[10:17] - weight='' - polarity='' - else: - phase=line[10:14].strip() - polarity=line[16] - try: - time=UTCDateTime(evtime.year,evtime.month,evtime.day, - int(line[18:20]),int(line[20:22]),int(line[23:25]), - int(line[26:28])*10000) - except (ValueError): - time=UTCDateTime(evtime.year,evtime.month,evtime.day, - int(line[18:20]),int(line[20:22]),0,0) - time+=60 # Add 60 seconds on to the time, this copes with s-file - coda=_int_conv(line[28:33]) - amplitude=_float_conv(line[34:40]) - peri=_float_conv(line[41:45]) - azimuth=_float_conv(line[46:51]) - velocity=_float_conv(line[52:56]) - if header[57:60]=='AIN': - SNR='' - AIN=_float_conv(line[57:60]) - elif header[57:60]=='SNR': - AIN='' - SNR=_float_conv(line[57:60]) - azimuthres=_int_conv(line[60:63]) - timeres=_float_conv(line[63:68]) - finalweight=_int_conv(line[68:70]) - distance=_float_conv(line[70:75]) - CAZ=_int_conv(line[76:79]) - picks+=[PICK(station, channel, impulsivity, phase, weight, polarity, - time, coda, amplitude, peri, azimuth, velocity, AIN, SNR, - azimuthres, timeres, finalweight, distance, CAZ)] - f.close() - return picks -
-
[docs]def readwavename(sfilename): - """ - Convenience function to extract the waveform filename from the s-file, - returns a list of waveform names found in the s-file as multiples can - be present. - - :type sfilename: str - :param sfilename: Path to the sfile - - :returns: List of str - """ - f=open(sfilename) - wavename=[] - for line in f: - if len(line)==81 and line[79]=='6': - wavename.append(line[1:79].strip()) - f.close() - return wavename -
-
[docs]def blanksfile(wavefile,evtype,userID,outdir,overwrite=False, evtime=False): - """ - Module to generate an empty s-file with a populated header for a given - waveform. - - :type wavefile: String - :param wavefile: Wavefile to associate with this S-file, the timing of the - S-file will be taken from this file if evtime is not set - :type evtype: String - :param evtype: L,R,D - :type userID: String - :param userID: 4-charectar SEISAN USER ID - :type outdir: String - :param outdir: Location to write S-file - :type overwrite: Bool - :param overwrite: Overwrite an existing S-file, default=False - :type evtime: UTCDateTime - :param evtime: If given this will set the timing of the S-file - - :returns: String, S-file name - """ - - from obspy import read as obsread - import sys - import os - import datetime - - if not evtime: - try: - st=obsread(wavefile) - evtime=st[0].stats.starttime - except: - print 'Wavefile: '+wavefile+' is invalid, try again with real data.' - sys.exit() - else: - starttime=evtime - # Check that user ID is the correct length - if len(userID) != 4: - print 'User ID must be 4 characters long' - sys.exit() - # Check that outdir exists - if not os.path.isdir(outdir): - print 'Out path does not exist, I will not create this: '+outdir - sys.exit() - # Check that evtype is one of L,R,D - if evtype not in ['L','R','D']: - print 'Event type must be either L, R or D' - sys.exit() - - # Generate s-file name in the format dd-hhmm-ss[L,R,D].Syyyymm - sfilename=outdir+'/'+str(evtime.day).zfill(2)+'-'+\ - str(evtime.hour).zfill(2)+\ - str(evtime.minute).zfill(2)+'-'+\ - str(evtime.second).zfill(2)+evtype+'.S'+\ - str(evtime.year)+\ - str(evtime.month).zfill(2) - # Check is sfilename exists - if os.path.isfile(sfilename) and not overwrite: - print 'Desired sfilename: '+sfilename+' exists, will not overwrite' - for i in range(1,10): - sfilename=outdir+'/'+str(evtime.day).zfill(2)+'-'+\ - str(evtime.hour).zfill(2)+\ - str(evtime.minute).zfill(2)+'-'+\ - str(evtime.second+i).zfill(2)+evtype+'.S'+\ - str(evtime.year)+\ - str(evtime.month).zfill(2) - if not os.path.isfile(sfilename): - break - else: - print 'Tried generated files up to 10s in advance and found they' - print 'all exist, you need to clean your stuff up!' - sys.exit() - # sys.exit() - f=open(sfilename,'w') - # Write line 1 of s-file - f.write(' '+str(evtime.year)+' '+\ - str(evtime.month).rjust(2)+\ - str(evtime.day).rjust(2)+' '+\ - str(evtime.hour).rjust(2)+\ - str(evtime.minute).rjust(2)+' '+\ - str(float(evtime.second)).rjust(4)+' '+\ - evtype+'1'.rjust(58)+'\n') - # Write line 2 of s-file - f.write(' ACTION:ARG '+str(datetime.datetime.now().year)[2:4]+'-'+\ - str(datetime.datetime.now().month).zfill(2)+'-'+\ - str(datetime.datetime.now().day).zfill(2)+' '+\ - str(datetime.datetime.now().hour).zfill(2)+':'+\ - str(datetime.datetime.now().minute).zfill(2)+' OP:'+\ - userID.ljust(4)+' STATUS:'+'ID:'.rjust(18)+\ - str(evtime.year)+\ - str(evtime.month).zfill(2)+\ - str(evtime.day).zfill(2)+\ - str(evtime.hour).zfill(2)+\ - str(evtime.minute).zfill(2)+\ - str(evtime.second).zfill(2)+\ - 'I'.rjust(6)+'\n') - # Write line 3 of s-file - f.write(' '+wavefile+'6'.rjust(79-len(wavefile))+'\n') - # Write final line of s-file - f.write(' STAT SP IPHASW D HRMM SECON CODA AMPLIT PERI AZIMU'+\ - ' VELO AIN AR TRES W DIS CAZ7\n') - f.close() - print 'Written s-file: '+sfilename - return sfilename -
-
[docs]def populateSfile(sfilename, picks): - """ - Module to populate a blank nordic format S-file with pick information, - arguments required are the filename of the blank s-file and the picks - where picks is a dictionary of picks including station, channel, - impulsivity, phase, weight, polarity, time, coda, amplitude, peri, azimuth, - velocity, SNR, azimuth residual, Time-residual, final weight, - epicentral distance & azimuth from event to station. - - This is a full pick line information from the seisan manual, P. 341 - - :type sfilename: str - :param sfilename: Path to S-file to populate, must have a header already - :type picks: List of :class: PICK - :param picks: List of the picks to be written out - """ - - f=open(sfilename, 'r') - # Find type 7 line, under which picks should be - if there are already - # picks there we should preserve them - body='' - header='' - if 'headerend' in locals(): - del headerend - for lineno, line in enumerate(f): - identifier=line[79] - if 'headerend' in locals(): - body+=line - else: - header+=line - if identifier=='7': - headerend=lineno - f.close() - # - # Now generate lines for the new picks - newpicks='' - for pick in picks: - if pick.distance >= 100.0: - pick.distance=_int_conv(pick.distance) - elif pick.distance < 100.0: - pick.distance=int(round(pick.distance,1)) - newpicks+=pick.__str__() - newpicks+='\n' - # Write all new and old info back in - f=open(sfilename, 'w') - f.write(header) - f.write(newpicks) - f.write(body) - f.write('\n'.rjust(81)) - f.close() - return -
-
[docs]def test_rw(): - """ - Function to test the functions herein. - """ - import os - test_pick=PICK('FOZ', 'SZ', 'I', 'P', '1', 'C', UTCDateTime("2012-03-26")+1, - coda=10, amplitude=0.2, peri=0.1, - azimuth=10.0, velocity=20.0, AIN=10, SNR='', - azimuthres=1, timeres=0.1, - finalweight=4, distance=10.0, - CAZ=2) - print test_pick - sfilename=blanksfile('test', 'L', 'TEST', '.', overwrite=True,\ - evtime=UTCDateTime("2012-03-26")+1) - populateSfile(sfilename, [test_pick]) - assert readwavename(sfilename) == ['test'] - assert readpicks(sfilename)[0].station == test_pick.station - assert readpicks(sfilename)[0].channel == test_pick.channel - assert readpicks(sfilename)[0].impulsivity == test_pick.impulsivity - assert readpicks(sfilename)[0].phase == test_pick.phase - assert readpicks(sfilename)[0].weight == test_pick.weight - assert readpicks(sfilename)[0].polarity== test_pick.polarity - assert readpicks(sfilename)[0].time == test_pick.time - assert readpicks(sfilename)[0].coda == test_pick.coda - assert readpicks(sfilename)[0].amplitude == test_pick.amplitude - assert readpicks(sfilename)[0].peri == test_pick.peri - assert readpicks(sfilename)[0].azimuth == test_pick.azimuth - assert readpicks(sfilename)[0].velocity == test_pick.velocity - assert readpicks(sfilename)[0].AIN == test_pick.AIN - assert readpicks(sfilename)[0].SNR == test_pick.SNR - assert readpicks(sfilename)[0].azimuthres == test_pick.azimuthres - assert readpicks(sfilename)[0].timeres == test_pick.timeres - assert readpicks(sfilename)[0].finalweight == test_pick.finalweight - assert readpicks(sfilename)[0].distance == test_pick.distance - assert readpicks(sfilename)[0].CAZ == test_pick.CAZ - header = readheader(sfilename) - os.remove(sfilename) - return True -
-if __name__=='__main__': - # Read arguments - import sys, os - if len(sys.argv) != 6: - print 'Requires 5 arguments: wavefile, evtype, userID, outdir, overwrite' - sys.exit() - else: - wavefile=str(sys.argv[1]) - evtype=str(sys.argv[2]) - userID=str(sys.argv[3]) - outdir=str(sys.argv[4]) - overwrite=str(sys.argv[5]) - sfilename=blanksfile(wavefile,evtype,userID,outdir,overwrite) - print sfilename -
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/bright_lights.html b/_modules/bright_lights.html deleted file mode 100644 index 050e9b4c9..000000000 --- a/_modules/bright_lights.html +++ /dev/null @@ -1,939 +0,0 @@ - - - - - - - - - - bright_lights — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for bright_lights

-#!/usr/bin/python
-"""
-Code to determine the brightness function of seismic data according to a three-\
-dimensional travel-time grid.  This travel-time grid should be generated using\
-the grid2time function of the NonLinLoc package by Anthony Lomax which can be\
-found here: http://alomax.free.fr/nlloc/ and is not distributed within this\
-package as this is a very useful stand-alone library for seismic event location.\
-\
-This code is based on the method of Frank & Shapiro 2014.\
-\
-Code generated by Calum John Chamberlain of Victoria University of Wellington,\
-2015.
-
-
-.. rubric:: Note
-Pre-requisites:
-    - gcc             - for the installation of the openCV correlation routine
-    - python-cv2      - Python bindings for the openCV routines
-    - python-joblib   - used for parallel processing
-    - python-obspy    - used for lots of common seismological processing
-                        - requires:
-                            - numpy
-                            - scipy
-                            - matplotlib
-    - NonLinLoc       - used outside of all codes for travel-time generation
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-import warnings
-import numpy as np
-
[docs]def _read_tt(path, stations, phase, phaseout='S', ps_ratio=1.68,\ - lags_switch=True): - """ - Function to read in .csv files of slowness generated from Grid2Time (part - of NonLinLoc by Anthony Lomax) and convert this to a useful format here. - - It should be noted that this can read either P or S travel-time grids, not - both at the moment. - - :type path: str - :param path: The path to the .csv Grid2Time outputs - :type stations: list - :param stations: List of station names to read slowness files for. - :type phaseout: str - :param phaseout: What phase to return the lagtimes in - :type ps_ratio: float - :param ps_ratio: p to s ratio for coversion - :type lags_switch: Bool - :param lags_switch: Return lags or raw travel-times, if set to true will return lags. - - :return: list stations, list of lists of tuples nodes, \ - :class: 'numpy.array' lags station[1] refers to nodes[1] and \ - lags[1] nodes[1][1] refers to station[1] and lags[1][1]\ - nodes[n][n] is a tuple of latitude, longitude and depth - """ - - import glob - import sys - import csv - - # Locate the slowness file information - gridfiles=[] - stations_out=[] - for station in stations: - gridfiles+=(glob.glob(path+'*.'+phase+'.'+station+'.time.csv')) - if glob.glob(path+'*.'+phase+'.'+station+'*.csv'): - stations_out+=[station] - if not stations_out: - print 'No slowness files found' - sys.exit() - # Read the files - allnodes=[] - for gridfile in gridfiles: - print ' Reading slowness from: '+gridfile - f=open(gridfile,'r') - grid=csv.reader(f, delimiter=' ') - traveltime=[] - nodes=[] - for row in grid: - nodes.append((row[0],row[1],row[2])) - traveltime.append(float(row[3])) - traveltime=np.array(traveltime) - if not phase == phaseout: - if phase == 'S': - traveltime=traveltime/1.68 - else: - traveltime=traveltime*1.68 - if lags_switch: - lags=traveltime-min(traveltime) - else: - lags=traveltime - if not 'alllags' in locals(): - alllags=[lags] - else: - alllags=np.concatenate((alllags,[lags]), axis=0) - allnodes=nodes # each element of allnodes should be the same as the - # other one, e.g. for each station the grid must be the - # same, hence allnodes=nodes - f.close() - return stations_out, allnodes, alllags -
-
[docs]def _resample_grid(stations, nodes, lags, mindepth, maxdepth, corners, resolution): - """ - Function to resample the lagtime grid to a given volume. For use if the - grid from Grid2Time is too large or you want to run a faster, downsampled - scan. - - :type stations: list - :param stations: List of station names from in the form where stations[i]\ - refers to nodes[i][:] and lags[i][:] - :type nodes: list, tuple - :param nodes: List of node points where nodes[i] referes to stations[i] and\ - nodes[:][:][0] is latitude in degrees, nodes[:][:][1] is longitude in\ - degrees, nodes[:][:][2] is depth in km. - :type lags: :class: 'numpy.array' - :param lags: Array of arrays where lags[i][:] refers to stations[i].\ - lags[i][j] should be the delay to the nodes[i][j] for stations[i] in seconds\ - :type mindepth: float - :param mindepth: Upper limit of volume - :type maxdepth: float - :param maxdepth: Lower limit of volume - :type corners: matplotlib.Path - :param corners: matplotlib path of the corners for the 2D polygon to cut to\ - in lat and long - - :return: list stations, list of lists of tuples nodes, :class: \ - 'numpy.array' lags station[1] refers to nodes[1] and lags[1]\ - nodes[1][1] refers to station[1] and lags[1][1]\ - nodes[n][n] is a tuple of latitude, longitude and depth. - """ - import sys - import numpy as np - resamp_nodes=[] - resamp_lags=[] - # Cut the volume - for i, node in enumerate(nodes): - # If the node is within the volume range, keep it - if mindepth < float(node[2]) < maxdepth and\ - corners.contains_point(node[0:2]): - resamp_nodes.append(node) - resamp_lags.append([lags[:,i]]) - # Reshape the lags - print np.shape(resamp_lags) - resamp_lags=np.reshape(resamp_lags,(len(resamp_lags),len(stations))).T - # Resample the nodes - they are sorted in order of size with largest long - # then largest lat, then depth. - print 'Grid now has '+str(len(resamp_nodes))+' nodes' - return stations, resamp_nodes, resamp_lags -
-
[docs]def _rm_similarlags(stations, nodes, lags, threshold): - """ - Function to remove those nodes that have a very similar network moveout - to another lag. - - Will, for each node, calculate the difference in lagtime at each station - at every node, then sum these for each node to get a cumulative difference - in network moveout. This will result in an array of arrays with zeros on - the diagonal. - - :type stations: list - :param stations: List of station names from in the form where stations[i]\ - refers to nodes[i][:] and lags[i][:] - :type nodes: list, tuple - :param nodes: List of node points where nodes[i] referes to stations[i] and\ - nodes[:][:][0] is latitude in degrees, nodes[:][:][1] is longitude in\ - degrees, nodes[:][:][2] is depth in km. - :type lags: :class: 'numpy.array' - :param lags: Array of arrays where lags[i][:] refers to stations[i].\ - lags[i][j] should be the delay to the nodes[i][j] for stations[i] in seconds - :type threhsold: float - :param threshold: Threshold for removal in seconds - - :returns: list stations, list of lists of tuples nodes, :class: \ - 'numpy.array' lags station[1] refers to nodes[1] and lags[1]\ - nodes[1][1] refers to station[1] and lags[1][1]\ - nodes[n][n] is a tuple of latitude, longitude and depth. - """ - import sys - netdif=abs((lags.T-lags.T[0]).sum(axis=1).reshape(1,len(nodes)))>threshold - for i in range(len(nodes)): - netdif=np.concatenate((netdif, \ - abs((lags.T-lags.T[i]).sum(axis=1).reshape(1,len(nodes)))>threshold),\ - axis=0) - sys.stdout.write("\r"+str(float(i)/len(nodes)*100)+"% \r") - sys.stdout.flush() - nodes_out=[nodes[0]] - node_indeces=[0] - print "\n" - print len(nodes) - for i in xrange(1,len(nodes)): - if np.all(netdif[i][node_indeces]): - node_indeces.append(i) - nodes_out.append(nodes[i]) - lags_out=lags.T[node_indeces].T - print "Removed "+str(len(nodes)-len(nodes_out))+" duplicate nodes" - return stations, nodes_out, lags_out -
-
[docs]def _node_loop(stations, lags, stream, clip_level, \ - i=0, mem_issue=False, instance=0, plot=False): - """ - Internal function to allow for parallelisation of brightness - - :type stations: list - :param stations: List of stations to use - :type lags: np.ndarray - :param lags: List of lags where lags[i[:]] are the lags for stations[i] - :type stream: :class: `obspy.Stream` - :param stream: Data stream to find the brightness for - :type clip_level: float - :param clip_level: Upper limit for energy as a multiplier to the mean energy - :type i: int - :param i: Index of loop for parallelisation - :type mem_issue: bool - :param mem_issue: If True will write to disk rather than storing data in RAM - :type instance: int - :param instance: instance for bulk parallelisation, only used if mem_issue=true - :type plot: bool - :param plot: Turn plotting on or off, defaults to False - - :return: (i, energy (np.ndarray)) - """ - import warnings - if plot: - from obspy import Trace, Stream - import matplotlib.pyplot as plt - fig, axes = plt.subplots(len(stream)+1, 1, sharex=True) - axes=axes.ravel() - - for l, tr in enumerate(stream): - j = [k for k in range(len(stations)) if stations[k]==tr.stats.station] - # Check that there is only one matching station - if len(j)>1: - warnings.warn('Too many stations') - j=[j[0]] - if len(j)==0: - warnings.warn('No station match') - continue - lag=lags[j[0]] - pad=np.zeros(int(round(lag * tr.stats.sampling_rate))) - lagged_energy=np.square(np.concatenate((tr.data, pad)))[len(pad):] - # Clip energy - lagged_energy=np.clip(lagged_energy, 0, \ - clip_level * np.mean(lagged_energy)) - if not 'energy' in locals(): - energy=(lagged_energy / \ - np.sqrt(np.mean(np.square(lagged_energy)))).reshape(1,len(lagged_energy)) - # Cope with zeros enountered - energy=np.nan_to_num(energy) - # This is now an array of floats - we can convert this to int16 - # normalize to have max at max of int16 range - if not max(energy[0])==0.0: - scalor=1/max(energy[0]) - energy=(500*(energy*scalor)).astype(np.int16) - else: - energy=energy.astype(np.int16) - else: - norm_energy=(lagged_energy / \ - np.sqrt(np.mean(np.square(lagged_energy)))).reshape(1,len(lagged_energy)) - norm_energy=np.nan_to_num(norm_energy) - # Convert to int16 - if not max(norm_energy[0])==0.0: - scalor=1 / max(norm_energy[0]) - norm_energy=(500 * (norm_energy * scalor)).astype(np.int16) - else: - norm_energy=norm_energy.astype(np.int16) - # Apply lag to data and add it to energy - normalize the data here - energy=np.concatenate((energy,norm_energy), axis=0) - if plot: - axes[l].plot(lagged_energy * 200, 'r') - axes[l].plot(tr.data, 'k') - # energy_tr=Trace(energy[l]) - energy_tr=Trace(lagged_energy) - # energy_tr=Trace(tr.data) - energy_tr.stats.station=tr.stats.station - energy_tr.stats.sampling_rate=tr.stats.sampling_rate - if not 'energy_stream' in locals(): - energy_stream=Stream(energy_tr) - else: - energy_stream+=energy_tr - energy=np.sum(energy, axis=0).reshape(1,len(lagged_energy)) - energy=energy.astype(np.uint16) - # Convert any nans to zeros - energy=np.nan_to_num(energy) - if plot: - energy_tr=Trace(energy[0]) - energy_tr.stats.station='Stack' - energy_tr.stats.sampling_rate=tr.stats.sampling_rate - energy_tr.stats.network='Energy' - energy_stream+=energy_tr - axes[-1].plot(energy[0]) - plt.subplots_adjust(hspace=0) - plt.show() - # energy_stream.plot(equal_scale=False, size=(800,600)) - if not mem_issue: - return (i, energy) - else: - np.save('tmp'+str(instance)+'/node_'+str(i), energy) - return (i, 'tmp'+str(instance)+'/node_'+str(i)) -
-
[docs]def _cum_net_resp(node_lis, instance=0): - """ - Function to compute the cumulative network response by reading the saved - energy .npy files - - :type node_lis: np.ndarray - :param node_lis: List of nodes (ints) to read from - :type instance: Int - :param instance: Instance flag for parallelisation, defaults to 0. - - :returns: np.ndarray cum_net_resp, list of indeces used - """ - import os - cum_net_resp=np.load('tmp'+str(instance)+'/node_'+str(node_lis[0])+'.npy')[0] - os.remove('tmp'+str(instance)+'/node_'+str(node_lis[0])+'.npy') - indeces=np.ones(len(cum_net_resp))*node_lis[0] - for i in node_lis[1:]: - node_energy=np.load('tmp'+str(instance)+'/node_'+str(i)+'.npy')[0] - updated_indeces=np.argmax([cum_net_resp, node_energy], axis=0) - temp=np.array([cum_net_resp, node_energy]) - cum_net_resp=np.array([temp[updated_indeces[j]][j] \ - for j in xrange(len(updated_indeces))]) - del temp, node_energy - updated_indeces[updated_indeces==1]=i - indeces=updated_indeces - os.remove('tmp'+str(instance)+'/node_'+str(i)+'.npy') - return cum_net_resp, indeces -
-
[docs]def _find_detections(cum_net_resp, nodes, threshold, thresh_type,\ - samp_rate, realstations, length): - """ - Function to find detections within the cumulative network response according - to Frank et al. (2014). - - :type cum_net_resp: np.ndarray - :param cum_net_resp: Array of cumulative network response for nodes - :type nodes: list of tuples - :param nodes: Nodes associated with the source of energy in the cum_net_resp - :type threshold: float - :param threshold: Threshold value - :type thresh_type: str - :param thresh_type: Either MAD (Median Absolute Deviation) or abs (absolute)\ - or RMS (Root Mean Squared) - :type samp_rate: float - :param samp_rate: Sampling rate in Hz - :type realstations: list of str - :param realstations: List of stations used to make the cumulative network\ - response, will be reported in the DETECTION - :type length: float - :param length: Maximum length of peak to look for in seconds - - :return: detections as :class: DETECTION - """ - from eqcorrscan.utils import findpeaks - from eqcorrscan.core.match_filter import DETECTION - - cum_net_resp = np.nan_to_num(cum_net_resp) # Force no NaNs - if np.isnan(cum_net_resp).any(): - raise ValueError("Nans present") - print 'Mean of data is: '+str(np.median(cum_net_resp)) - print 'RMS of data is: '+str(np.sqrt(np.mean(np.square(cum_net_resp)))) - print 'MAD of data is: '+str(np.median(np.abs(cum_net_resp))) - if thresh_type=='MAD': - thresh=(np.median(np.abs(cum_net_resp)) * threshold) # Raise to the power - elif thresh_type=='abs': - thresh=threshold - elif thresh_type=='RMS': - thresh=(np.sqrt(np.mean(np.square(cum_net_resp)))) * threshold - print 'Threshold is set to: '+str(thresh) - print 'Max of data is: '+str(max(cum_net_resp)) - peaks=findpeaks.find_peaks2(cum_net_resp, thresh, - length * samp_rate, debug=0, maxwidth=10) - detections=[] - if peaks: - for peak in peaks: - node=nodes[peak[1]] - detections.append(DETECTION(node[0]+'_'+node[1]+'_'+node[2], - peak[1]/samp_rate, - len(realstations), peak[0], thresh, - 'brightness', realstations)) - else: - detections=[] - print 'I have found '+str(len(peaks))+' possible detections' - return detections -
-
[docs]def coherence(stream_in, stations=['all'], clip=False): - """ - Function to determine the average network coherence of a given template or - detection. You will want your stream to contain only signal as noise - will reduce the coherence (assuming it is incoherant random noise). - - :type stream: obspy.Stream - :param stream: The stream of seismic data you want to calculate the\ - coherence for. - :type stations: List of String - :param stations: List of stations to use for coherence, default is all - :type clip: Tuple of Float - :param clip: Default is to use all the data given - \ - tuple of start and end in seconds from start of trace - - :return: float - coherence, int number of channels used - """ - stream=stream_in.copy() # Copy the data before we remove stations - # First check that all channels in stream have data of the same length - maxlen=np.max([len(tr.data) for tr in stream]) - if maxlen==0: - warnings.warn('template without data') - return 0.0 - if not stations[0]=='all': - for tr in stream: - if not tr.stats.station in stations: - stream.remove(tr) # Remove stations we don't want to use - for tr in stream: - if not len(tr.data) == maxlen and not len(tr.data)==0: - warnings.warn(tr.stats.station+'.'+tr.stats.channel+\ - ' is not the same length, padding \n'+\ - 'Length is '+str(len(tr.data))+' samples') - pad=np.zeros(maxlen-len(tr.data)) - if tr.stats.starttime.hour == 0: - tr.data=np.concatenate((pad, tr.data), axis=0) - else: - tr.data=np.concatenate((tr.data, pad), axis=0) - elif len(tr.data)==0: - tr.data=np.zeros(maxlen) - # Clip the data to the set length - if clip: - for tr in stream: - tr.trim(tr.stats.starttime+clip[0], tr.stats.starttime+clip[1]) - coherence=0.0 - from match_filter import normxcorr2 - # Loop through channels and generate a correlation value for each - # unique cross-channel pairing - for i in range(len(stream)): - for j in range(i+1,len(stream)): - coherence+=np.abs(normxcorr2(stream[i].data, stream[j].data))[0][0] - coherence=2 * coherence / (len(stream) * (len(stream) - 1)) - return coherence, len(stream) -
-
[docs]def brightness(stations, nodes, lags, stream, threshold, thresh_type,\ - template_length, template_saveloc, coherence_thresh,\ - coherance_stations=['all'], coherance_clip=False,\ - gap=2.0, clip_level=100, instance=0, pre_pick=0.2, plotsave=True,\ - cores=1): - """ - Function to calculate the brightness function in terms of energy for a day - of data over the entire network for a given grid of nodes. - - Note data in stream must be all of the same length and have the same - sampling rates. - - :type stations: list - :param stations: List of station names from in the form where stations[i]\ - refers to nodes[i][:] and lags[i][:] - :type nodes: list, tuple - :param nodes: List of node points where nodes[i] referes to stations[i] and\ - nodes[:][:][0] is latitude in degrees, nodes[:][:][1] is longitude in\ - degrees, nodes[:][:][2] is depth in km. - :type lags: :class: 'numpy.array' - :param lags: Array of arrays where lags[i][:] refers to stations[i].\ - lags[i][j] should be the delay to the nodes[i][j] for stations[i] in seconds. - :type stream: :class: `obspy.Stream` - :param data: Data through which to look for detections. - :type threshold: float - :param threshold: Threshold value for detection of template within the\ - brightness function - :type thresh_type: str - :param thresh_type: Either MAD or abs where MAD is the Median Absolute\ - Deviation and abs is an absoulte brightness. - :type template_length: float - :param template_length: Length of template to extract in seconds - :type template_saveloc: str - :param template_saveloc: Path of where to save the templates. - :type coherence_thresh: tuple of floats - :param coherence_thresh: Threshold for removing incoherant peaks in the\ - network response, those below this will not be used as templates.\ - Must be in the form of (a,b) where the coherence is given by:\ - a-kchan/b where kchan is the number of channels used to compute\ - the coherence - :type coherance_stations: list - :param coherance_stations: List of stations to use in the coherance\ - thresholding - defaults to 'all' which uses all the stations. - :type coherance_clip: float - :param coherance_clip: tuple - :type coherance_clip: Start and end in seconds of data to window around,\ - defaults to False, which uses all the data given. - :type pre_pick: float - :param pre_pick: Seconds before the detection time to include in template - :type plotsave: bool - :param plotsave: Save or show plots, if False will try and show the plots\ - on screen - as this is designed for bulk use this is set to\ - True to save any plots rather than show them if you create\ - them - changes the backend of matplotlib, so if is set to\ - False you will see NO PLOTS! - :type cores: int - :param core: Number of cores to use, defaults to 1. - :type clip_level: float - :param clip_level: Multiplier applied to the mean deviation of the energy\ - as an upper limit, used to remove spikes (earthquakes, \ - lightning, electircal spikes) from the energy stack. - :type gap: float - :param gap: Minimum inter-event time in seconds for detections - - :return: list of templates as :class: `obspy.Stream` objects - """ - from eqcorrscan.core.template_gen import _template_gen - if plotsave: - import matplotlib - matplotlib.use('Agg') - import matplotlib.pyplot as plt - plt.ioff() - # from joblib import Parallel, delayed - from multiprocessing import Pool, cpu_count - from eqcorrscan.utils.Sfile_util import PICK - import sys, os - from copy import deepcopy - from obspy import read as obsread, Stream - import matplotlib.pyplot as plt - from eqcorrscan.utils import EQcorrscan_plotting as plotting - # Check that we actually have the correct stations - realstations=[] - for station in stations: - st=stream.select(station=station) - if st: - realstations+=station - del st - stream_copy=stream.copy() - # Force convert to int16 - for tr in stream_copy: - # int16 max range is +/- 32767 - if max(abs(tr.data)) > 32767: - tr.data=32767 * (tr.data / max(abs(tr.data))) - # Make sure that the data aren't clipped it they are high gain - scale the data - tr.data=tr.data.astype(np.int16) - # The internal _node_loop converts energy to int16 too to converse memory, - # to do this it forces the maximum of a single energy trace to be 500 and - # normalises to this level - this only works for fewer than 65 channels of - # data - if len(stream_copy) > 130: - raise OverflowError('Too many streams, either re-code and cope with'+\ - 'either more memory usage, or less precision, or'+\ - 'reduce data volume') - detections=[] - detect_lags=[] - parallel=True - plotvar=True - mem_issue=False - # Loop through each node in the input - # Linear run - print 'Computing the energy stacks' - if not parallel: - for i in range(0,len(nodes)): - print i - if not mem_issue: - j, a=_node_loop(stations, lags[:,i], stream, plot=True) - if not 'energy' in locals(): - energy=a - else: - energy=np.concatenate((energy,a), axis=0) - print 'energy: '+str(np.shape(energy)) - else: - j, filename=_node_loop(stations, lags[:,i], stream, i, mem_issue) - energy=np.array(energy) - print np.shape(energy) - else: - # Parallel run - num_cores=cores - if num_cores > len(nodes): - num_cores=len(nodes) - if num_cores > cpu_count(): - num_cores=cpu_count() - pool=Pool(processes=num_cores, maxtasksperchild=None) - results=[pool.apply_async(_node_loop, args=(stations,\ - lags[:,i], stream, i,\ - clip_level,\ - mem_issue, instance))\ - for i in range(len(nodes))] - pool.close() - if not mem_issue: - print 'Computing the cumulative network response from memory' - energy=[p.get() for p in results] - pool.join() - energy.sort(key=lambda tup: tup[0]) - energy = [node[1] for node in energy] - energy=np.concatenate(energy, axis=0) - print energy.shape - else: - pool.join() - # Now compute the cumulative network response and then detect possible events - if not mem_issue: - print energy.shape - indeces=np.argmax(energy, axis=0) # Indeces of maximum energy - print indeces.shape - cum_net_resp=np.array([np.nan] * len(indeces)) - cum_net_resp[0]=energy[indeces[0]][0] - peak_nodes=[nodes[indeces[0]]] - for i in range(1, len(indeces)): - cum_net_resp[i]=energy[indeces[i]][i] - peak_nodes.append(nodes[indeces[i]]) - del energy, indeces - else: - print 'Reading the temp files and computing network response' - node_splits=len(nodes)/num_cores - indeces=[range(node_splits)] - for i in range(1,num_cores-1): - indeces.append(range(node_splits * i, node_splits * (i + 1))) - indeces.append(range(node_splits * (i + 1), len(nodes))) - pool=Pool(processes=num_cores, maxtasksperchild=None) - results=[pool.apply_async(_cum_net_resp, args=(indeces[i], instance))\ - for i in range(num_cores)] - pool.close() - results=[p.get() for p in results] - pool.join() - responses=[result[0] for result in results] - print np.shape(responses) - node_indeces=[result[1] for result in results] - cum_net_resp=np.array(responses) - indeces=np.argmax(cum_net_resp, axis=0) - print indeces.shape - print cum_net_resp.shape - cum_net_resp=np.array([cum_net_resp[indeces[j]][j]\ - for j in range(len(indeces))]) - peak_nodes=[nodes[node_indeces[indeces[i]][i]] \ - for i in range(len(indeces))] - del indeces, node_indeces - if plotvar: - cum_net_trace=deepcopy(stream[0]) - cum_net_trace.data=cum_net_resp - cum_net_trace.stats.station='NR' - cum_net_trace.stats.channel='' - cum_net_trace.stats.network='Z' - cum_net_trace.stats.location='' - cum_net_trace.stats.starttime=stream[0].stats.starttime - cum_net_trace=Stream(cum_net_trace) - cum_net_trace+=stream.select(channel='*N') - cum_net_trace+=stream.select(channel='*1') - cum_net_trace.sort(['network','station','channel']) - # np.save('cum_net_resp.npy',cum_net_resp) - # cum_net_trace.plot(size=(800,600), equal_scale=False,\ - # outfile='NR_timeseries.eps') - - # Find detection within this network response - print 'Finding detections in the cumulatve network response' - detections=_find_detections(cum_net_resp, peak_nodes, threshold, thresh_type,\ - stream[0].stats.sampling_rate, realstations, gap) - del cum_net_resp - templates=[] - nodesout=[] - good_detections=[] - if detections: - print 'Converting detections in to templates' - for j, detection in enumerate(detections): - print 'Converting for detection '+str(j)+' of '+str(len(detections)) - copy_of_stream=deepcopy(stream_copy) - # Convert detections to PICK type - name of detection template - # is the node. - node=(detection.template_name.split('_')[0],\ - detection.template_name.split('_')[1],\ - detection.template_name.split('_')[2]) - print node - # Look up node in nodes and find the associated lags - index=nodes.index(node) - detect_lags=lags[:,index] - picks=[] - for i, detect_lag in enumerate(detect_lags): - station=stations[i] - st=copy_of_stream.select(station=station) - if len(st) != 0: - for tr in st: - picks.append(PICK(station=station, - channel=tr.stats.channel, - impulsivity='E', phase='S', - weight='3', polarity='', - time=tr.stats.starttime+detect_lag+\ - detection.detect_time-pre_pick, - coda='', amplitude='', peri='', - azimuth='', velocity='', AIN='', SNR='', - azimuthres='', timeres='', - finalweight='', distance='', - CAZ='')) - i+=1 - print 'Generating template for detection: '+str(j) - template=(_template_gen(picks, copy_of_stream, template_length, 'all')) - template_name=template_saveloc+'/'+\ - str(template[0].stats.starttime)+'.ms' - # In the interests of RAM conservation we write then read - # Check coherancy here! - temp_coher, kchan=coherence(template, coherence_stations,\ - coherence_clip) - coh_thresh=float(coherence_thresh[0]) - kchan / \ - float(coherence_thresh[1]) - if temp_coher > coh_thresh: - template.write(template_name,format="MSEED") - print 'Written template as: '+template_name - print '---------------------------------coherence LEVEL: '+\ - str(temp_coher) - coherant=True - else: - print 'Template was incoherant, coherence level: '+\ - str(temp_coher) - coherant=False - del copy_of_stream, tr, template - if coherant: - templates.append(obsread(template_name)) - nodesout+=[node] - good_detections.append(detection) - else: - print 'No template for you' - if plotvar: - all_detections=[(cum_net_trace[-1].stats.starttime+\ - detection.detect_time).datetime \ - for detection in detections] - good_detections=[(cum_net_trace[-1].stats.starttime+\ - detection.detect_time).datetime \ - for detection in good_detections] - if not plotsave: - plotting.NR_plot(cum_net_trace[0:-1], Stream(cum_net_trace[-1]),\ - detections=good_detections,\ - # false_detections=all_detections,\ - size=(18.5, 10),\ - title='Network response') - # cum_net_trace.plot(size=(800,600), equal_scale=False) - else: - plotting.NR_plot(cum_net_trace[0:-1], Stream(cum_net_trace[-1]), \ - detections=good_detections,\ - # false_detections=all_detections,\ - size=(18.5, 10), save='plots/'+\ - cum_net_trace[0].stats.starttime.datetime.strftime('%Y%m%d')+\ - '_NR_timeseries.pdf',\ - title='Network response') - - nodesout=list(set(nodesout)) - return templates, nodesout
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/catalogue2DD.html b/_modules/catalogue2DD.html deleted file mode 100644 index d24bd20e9..000000000 --- a/_modules/catalogue2DD.html +++ /dev/null @@ -1,567 +0,0 @@ - - - - - - - - - - catalogue2DD — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for catalogue2DD

-#!/usr/bin/python
-"""
-Module written by Calum Chamberlain as part of the EQcorrscan package.
-
-This module contains functions to convert a seisan catalogue to files ready for
-relocation in hypoDD - it will generate both a catalogue (dt.ct) file, event
-file (event.dat), station information file (station.dat), and a correlation
-oiutput file correlated every event in the catalogue with every other event to
-optimize the picks (dt.cc).
-
-The correlation routine relies on obspy's xcorrPickCorrection function from the
-obspy.signal.cross_correlation module.  This function optimizes picks to better
-than sample accuracy by interpolating the correlation function and finding the
-maximum of this rather than the true maximum correlation value.  The output
-from this function is stored in the dt.cc file.
-
-Information for the station.dat file is read from SEISAN's STATION0.HYP file
-
-Earthquake picks and locations are taken from the catalogued s-files - these
-must be pre-located before entering this routine as origin times and hypocentre
-locations are needed for event.dat files.
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-from eqcorrscan.utils import Sfile_util
-import os
-import numpy as np
-
-
[docs]def _cc_round(num, dp): - """ - Convenience function to take a float and round it to dp padding with zeros - to return a string - - :type num: float - :param num: Number to round - :type dp: int - :param dp: Number of decimal places to round to. - - :returns: string - """ - num=round(num, dp) - num='{0:.{1}f}'.format(num, dp) - return num -
-
[docs]def _av_weight(W1, W2): - """ - Function to convert from two seisan weights (0-4) to one hypoDD weight(0-1) - - :type W1: str - :param W1: Seisan input weight (0-4) - :type W2: str - :param W2: Seisan input weight (0-4) - - :returns: str - """ - if W1==' ': - W1=1 - elif W1=='9': - W1=0 - else: - W1=1-int(W1)/4.0 - if W2==' ': - W2=1 - elif W2=='9': - W2=0 - else: - W2=1-int(W2)/4.0 - W=(W1+W2)/2 - return _cc_round(W,4) -
-
[docs]def readSTATION0(path, stations): - """ - Function to read the STATION0.HYP file on the path given. Outputs written - in station.dat file. - - :type path: String - :param path: Path to the STATION0.HYP file - :type station: List - :param station: Stations to look for - - :returns: List of tuples of station, lat, long, elevation - """ - stalist=[] - f=open(path+'/STATION0.HYP','r') - for line in f: - if line[2:6].strip() in stations: - station=line[2:6].strip() - print station - lat=line[6:14] # Format is either ddmm.mmS/N or ddmm(.)mmmS/N - if lat[-1]=='S': - NS=-1 - else: - NS=1 - if lat[4]=='.': - lat=(int(lat[0:2])+float(lat[2:-1])/60)*NS - else: - lat=(int(lat[0:2])+float(lat[2:4]+'.'+lat[4:-1])/60)*NS - lon=line[14:23] - if lon[-1]=='S': - EW=-1 - else: - EW=1 - if lon[5]=='.': - lon=(int(lon[0:3])+float(lon[3:-1])/60)*EW - else: - lon=(int(lon[0:3])+float(lon[3:5]+'.'+lon[5:-1])/60)*EW - elev=float(line[23:-1].strip()) - stalist.append((station, lat, lon, elev)) - f.close() - f=open('station.dat','w') - for sta in stalist: - f.write(sta[0]+' '+_cc_round(sta[1],4)+' '+_cc_round(sta[2],4)+\ - ' '+_cc_round(sta[3]/1000,4)+'\n') - f.close() - return stalist -
-
[docs]def write_event(sfile_list): - """ - Function to write out an event.dat file of the events - - :type sfile_list: List - :param sfile_list: List of s-files to sort and put into the database - - :returns: List of tuples of event ID (int) and Sfile name - """ - event_list=[] - sort_list=[(Sfile_util.readheader(sfile).time, sfile) for sfile in sfile_list] - sort_list.sort(key=lambda tup:tup[0]) - sfile_list=[sfile[1] for sfile in sort_list] - f=open('event.dat','w') - for i, sfile in enumerate(sfile_list): - event_list.append((i, sfile)) - evinfo=Sfile_util.readheader(sfile) - f.write(str(evinfo.time.year)+str(evinfo.time.month).zfill(2)+\ - str(evinfo.time.day).zfill(2)+' '+\ - str(evinfo.time.hour).rjust(2)+str(evinfo.time.minute).zfill(2)+\ - str(evinfo.time.second).zfill(2)+\ - str(evinfo.time.microsecond)[0:2].zfill(2)+' '+\ - str(evinfo.latitude).ljust(8,'0')+' '+\ - str(evinfo.longitude).ljust(8,'0')+' '+\ - str(evinfo.depth).rjust(7).ljust(9,'0')+' '+\ - str(evinfo.Mag_1)+' 0.00 0.00 '+\ - str(evinfo.t_RMS).ljust(4,'0')+\ - str(i).rjust(11)+'\n') - f.close() - return event_list -
-
[docs]def write_catalogue(event_list, max_sep=1, min_link=8): - """ - Function to write the dt.ct file needed by hypoDD - takes input event list - from write_event as a list of tuples of event id and sfile. It will read - the pick information from the seisan formated s-file using the Sfile_util - utilities. - - :type event_list: List of tuple - :param event_list: List of tuples of event_id (int) and sfile (String) - :type max_sep: float - :param max_sep: Maximum seperation between event pairs in km - :type min_link: int - :param min_link: Minimum links for an event to be paired - - :returns: List stations - """ - from eqcorrscan.utils.mag_calc import dist_conv - f=open('dt.ct','w') - fphase=open('phase.dat','w') - stations=[] - evcount=0 - for i, master in enumerate(event_list): - master_sfile=master[1] - master_event_id=master[0] - master_picks=Sfile_util.readpicks(master_sfile) - master_ori_time=Sfile_util.readheader(master_sfile).time - # print 'Master origin time: '+str(master_ori_time) - master_location=(Sfile_util.readheader(master_sfile).latitude,\ - Sfile_util.readheader(master_sfile).longitude,\ - Sfile_util.readheader(master_sfile).depth) - header='# '+str(master_ori_time.year) - fphase.write(header+'\n') - for pick in master_picks: - fphase.write(pick.station+' '+_cc_round(pick.time-master_ori_time,3)+\ - ' '+'\n') - for j in range(i+1,len(event_list)): - # Use this tactic to only output unique event pairings - slave_sfile=event_list[j][1] - slave_event_id=event_list[j][0] - # Write out the header line - event_text='#'+str(master_event_id).rjust(10)+\ - str(slave_event_id).rjust(10)+'\n' - slave_picks=Sfile_util.readpicks(slave_sfile) - slave_ori_time=Sfile_util.readheader(slave_sfile).time - slave_location=(Sfile_util.readheader(slave_sfile).latitude,\ - Sfile_util.readheader(slave_sfile).longitude,\ - Sfile_util.readheader(slave_sfile).depth) - if dist_calc(master_location, slave_location) > max_sep: - break - links=0 # Count the number of linkages - for pick in master_picks: - if pick.phase not in ['P','S']: - continue # Only use P and S picks, not amplitude or 'other' - # Find station, phase pairs - slave_matches=[p for p in slave_picks if p.station==pick.station\ - and p.phase==pick.phase] - # Loop through the matches - for slave_pick in slave_matches: - links+=1 - event_text+=pick.station.ljust(4)+\ - _cc_round(pick.time-master_ori_time,3).rjust(11)+\ - _cc_round(slave_pick.time-slave_ori_time,3).rjust(8)+\ - _av_weight(pick.weight, slave_pick.weight).rjust(7)+' '+\ - pick.phase+'\n' - stations.append(pick.station) - if links >= min_link: - f.write(event_text) - evcount+=1 - print 'You have '+str(evcount)+' links' - # f.write('\n') - f.close() - fphase.close() - return list(set(stations)) -
-
[docs]def write_correlations(event_list, wavbase, extract_len, pre_pick, shift_len,\ - lowcut=1.0, highcut=10.0, max_sep=4, min_link=8, \ - coh_thresh=0.0): - """ - Function to write a dt.cc file for hypoDD input - takes an input list of - events and computes pick refienements by correlation. - - Note that this is **NOT** fast. - - :type event_list: List of tuple - :param event_list: List of tuples of event_id (int) and sfile (String) - :type wavbase: string - :param wavbase: Path to the seisan wave directory that the wavefiles in the - S-files are stored - :type extract_len: float - :param extract_len: Length in seconds to extract around the pick - :type pre_pick: float - :param pre_pick: Time before the pick to start the correclation window - :type shift_len: float - :param shift_len: Time to allow pick to vary - :type lowcut: float - :param lowcut: Lowcut in Hz - default=1.0 - :type highcut: float - :param highcut: Highcut in Hz - deafult=10.0 - :type max_sep: float - :param max_sep: Maximum seperation between event pairs in km - :type min_link: int - :param min_link: Minimum links for an event to be paired - """ - from obspy.signal.cross_correlation import xcorrPickCorrection - import matplotlib.pyplot as plt - from obspy import read - from eqcorrscan.utils.mag_conv import dist_calc - import glob - corr_list=[] - f=open('dt.cc','w') - for i, master in enumerate(event_list): - master_sfile=master[1] - master_event_id=master[0] - master_picks=Sfile_util.readpicks(master_sfile) - master_ori_time=Sfile_util.readheader(master_sfile).time - master_location=(Sfile_util.readheader(master_sfile).latitude,\ - Sfile_util.readheader(master_sfile).longitude,\ - Sfile_util.readheader(master_sfile).depth) - master_wavefiles=Sfile_util.readwavename(master_sfile) - masterpath=glob.glob(wavbase+os.sep+'????'+os.sep+'??'+os.sep+master_wavefiles[0]) - if masterpath: - masterstream=read(masterpath[0]) - if len(master_wavefiles)>1: - for wavefile in master_wavefiles: - wavepath=glob.glob(wavbase+os.sep+'*'+os.sep+'*'+os.sep+wavefile) - if wavepath: - masterstream+=read(wavepath[0]) - else: - raise IOError("Couldn't find wavefile") - for j in xrange(i+1,len(event_list)): - # Use this tactic to only output unique event pairings - slave_sfile=event_list[j][1] - slave_event_id=event_list[j][0] - slave_wavefiles=Sfile_util.readwavename(slave_sfile) - try: - slavestream=read(wavbase+'/*/*/'+slave_wavefiles[0]) - except: - raise IOError('No wavefile found: '+slave_wavefiles[0]+' '+slave_sfile) - if len(slave_wavefiles)>1: - for wavefile in slave_wavefiles: - slavestream+=read(wavbase+'/*/*/'+wavefile) - # Write out the header line - event_text='#'+str(master_event_id).rjust(10)+\ - str(slave_event_id).rjust(10)+' 0.0 \n' - slave_picks=Sfile_util.readpicks(slave_sfile) - slave_ori_time=Sfile_util.readheader(slave_sfile).time - slave_location=(Sfile_util.readheader(slave_sfile).latitude,\ - Sfile_util.readheader(slave_sfile).longitude,\ - Sfile_util.readheader(slave_sfile).depth) - if dist_calc(master_location, slave_location) > max_sep: - break - links=0 - phases=0 - for pick in master_picks: - if pick.phase not in ['P','S']: - continue # Only use P and S picks, not amplitude or 'other' - # Find station, phase pairs - slave_matches=[p for p in slave_picks if p.station==pick.station\ - and p.phase==pick.phase] - if masterstream.select(station=pick.station, \ - channel='*'+pick.channel[-1]): - mastertr=masterstream.select(station=pick.station, \ - channel='*'+pick.channel[-1])[0] - else: - print 'No waveform data for '+pick.station+'.'+pick.channel - print pick.station+'.'+pick.channel+' '+slave_sfile+' '+master_sfile - break - # Loop through the matches - for slave_pick in slave_matches: - if slavestream.select(station=slave_pick.station,\ - channel='*'+slave_pick.channel[-1]): - slavetr=slavestream.select(station=slave_pick.station,\ - channel='*'+slave_pick.channel[-1])[0] - else: - print 'No slave data for '+slave_pick.station+'.'+\ - slave_pick.channel - print pick.station+'.'+pick.channel+' '+slave_sfile+' '+master_sfile - break - # Correct the picks - try: - correction, cc = xcorrPickCorrection(pick.time, mastertr,\ - slave_pick.time,\ - slavetr,pre_pick,\ - extract_len-pre_pick, shift_len,\ - filter="bandpass",\ - filter_options={'freqmin':lowcut, - 'freqmax':highcut},plot=False) - # Get the differntial travel time using the corrected time. - - dt=(pick.time-master_ori_time)-\ - (slave_pick.time+correction-slave_ori_time) - links+=1 - if cc*cc >= coh_thresh: - phases+=1 - #added by Caro - event_text+=pick.station.ljust(4)+\ - _cc_round(correction,3).rjust(11)+\ - _cc_round(cc,3).rjust(8)+\ - ' '+pick.phase+'\n' - # links+=1 - corr_list.append(cc*cc) - except: # Should warn here - warnings.warn("Couldn't compute correlation correction") - continue - if links >= min_link and phases > 0: - f.write(event_text) - plt.hist(corr_list, 150) - plt.show() - # f.write('\n') - f.close() - f2.close() - return
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/clustering.html b/_modules/clustering.html deleted file mode 100644 index 8c1fc8dd2..000000000 --- a/_modules/clustering.html +++ /dev/null @@ -1,835 +0,0 @@ - - - - - - - - - - clustering — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for clustering

-#!/usr/bin/python
-"""
-Functions to cluster seismograms by a range of constraints.
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-
-# I want to make sure that the lags for those that I cluster are similar as well
-# as making sure that they are similarly correlated - will cluster based on
-# cross-channel correlation sum
-import numpy as np
-import warnings
-
-
[docs]def cross_chan_coherence(st1, st2, i=0): - """ - Function to determine the cross-channel coherancy between two streams of - multichannel seismic data. - - :type st1: obspy Stream - :param st1: Stream one - :type st2: obspy Stream - :param st2: Stream two - :type i: int - :param i: index used for parallel async processing, returned unaltered - - :returns: cross channel coherence, float - normalized by number of channels, - if i, returns tuple of (cccoh, i) where i is int, as intput. - """ - from eqcorrscan.core.match_filter import normxcorr2 - cccoh=0.0 - kchan=0 - for tr in st1: - tr1=tr.data - # Assume you only have one waveform for each channel - tr2=st2.select(station=tr.stats.station, \ - channel=tr.stats.channel) - if tr2: - cccoh+=normxcorr2(tr1,tr2[0].data)[0][0] - kchan+=1 - if kchan: - cccoh=cccoh/kchan - return (cccoh, i) - else: - warnings.warn('No matching channels') - return (0, i) -
-
[docs]def distance_matrix(stream_list, cores=1): - """ - Function to compute the distance matrix for all templates - will give - distance as 1-abs(cccoh), e.g. a well correlated pair of templates will - have small distances, and an equally well correlated reverse image will - have the same distance as apositively correlated image - this is an issue - - :type stream_list: List of obspy.Streams - :param tream_list: List of the streams to compute the distance matrix for - :type core: int - :param cores: Number of cores to parallel process using, defaults to 1. - - :returns: ndarray - distance matrix - """ - from multiprocessing import Pool - - # Initialize square matrix - dist_mat=np.array([np.array([0.0]*len(stream_list))]*len(stream_list)) - - for i, master in enumerate(stream_list): - # Start a parallel processing pool - pool=Pool(processes=cores) - # Parallel processing - results=[pool.apply_async(cross_chan_coherence, args=(master,\ - stream_list[j], j))\ - for j in range(len(stream_list))] - pool.close() - # Extract the results when they are done - dist_list=[p.get() for p in results] - # Close and join all the processes back to the master process - pool.join() - # Sort the results by the input j - dist_list.sort(key=lambda tup:tup[1]) - # Sort the list into the dist_mat structure - for j in range(i,len(stream_list)): - if i==j: - dist_mat[i,j]=0.0 - else: - dist_mat[i,j]=1-dist_list[j][0] - # Reshape the distance matrix - for i in range(1,len(stream_list)): - for j in range(i): - dist_mat[i,j]=dist_mat.T[i,j] - return dist_mat -
-
[docs]def cluster(stream_list, show=True, corr_thresh=0.3, save_corrmat=False,\ - cores='all', debug=1): - """ - Function to take a set of templates and cluster them, will return groups as - lists of streams. Clustering is done by computing the cross-channel - correlation sum of each stream in stream_list with every other stream in - the list. Scipy.cluster.hierachy functions are then used to compute the - complete distance matrix, where distance is 1 minus the normalised - cross-correlation sum such that larger distances are less similar events. - Groups are then created by clustering the distance matrix at distances - less than 1 - corr_thresh. - - Will compute the distance matrix in parallel, using all available cores - - :type stream_list: List of Obspy.Stream - :param stream_list: List of templates to compute clustering for - :type show: bool - :param show: plot linkage on screen if True, defaults to True - :type corr_thresh: float - :param corr_thresh: Cross-channel correlation threshold for grouping - :type save_corrmat: bool - :param save_corrmat: If True will save the distance matrix to dist_mat.npy - :type cores: int - :param cores: numebr of cores to use when computing the distance matrix,\ - defaults to 'all' which will work out how many cpus are available\ - and hog them. - :type debug: int - :param debug: Level of debugging from 1-5, higher is more output, currently\ - only level 1 implimented. - - :returns: List of groups with each group a list of streams making up\ - that group. - """ - from scipy.spatial.distance import squareform - from scipy.cluster.hierarchy import linkage, dendrogram, fcluster - import matplotlib.pyplot as plt - from multiprocessing import cpu_count - if cores=='all': - num_cores=cpu_count() - else: - num_cores=cores - # Compute the distance matrix - if debug >= 1: - print 'Computing the distance matrix using '+str(num_cores)+' cores' - dist_mat=distance_matrix(stream_list, cores=num_cores) - if save_corrmat: - np.save('dist_mat.npy', dist_mat) - if debug >= 1: - print 'Saved the distance matrix as dist_mat.npy' - dist_vec=squareform(dist_mat) - # plt.matshow(dist_mat, aspect='auto', origin='lower', cmap=pylab.cm.YlGnB) - if debug >= 1: - print 'Computing linkage' - Z = linkage(dist_vec) - if show: - if debug >= 1: - print 'Plotting the dendrogram' - D = dendrogram(Z, color_threshold = 1 - corr_thresh,\ - distance_sort='ascending') - plt.show() - # Get the indeces of the groups - if debug >= 1: - print 'Clustering' - indeces = fcluster(Z, 1 - corr_thresh, 'distance') - group_ids=list(set(indeces)) # Unique list of group ids - if debug >= 1: - print 'Found '+str(len(group_ids))+' groups' - # Convert to tuple of (group id, stream id) - indeces=[(indeces[i], i) for i in xrange(len(indeces))] - # Sort by group id - indeces.sort(key=lambda tup:tup[0]) - groups=[] - if debug >= 1: - print 'Extracting and grouping' - for group_id in group_ids: - group=[] - for ind in indeces: - if ind[0] == group_id: - group.append(stream_list[ind[1]]) - elif ind[0] > group_id: - # Because we have sorted by group id, when the index is greater - # than the group_id we can break the inner loop. - # Patch applied by CJC 05/11/2015 - groups.append(group) - break - return groups -
-
[docs]def group_delays(stream_list): - """ - Function to group template waveforms according to their delays - - :type stream_list: List of obspy.Stream - :param stream_list: List of the waveforms you want to group - - :returns: List of List of obspy.Streams where each initial list is a group\ - with the same delays - """ - groups=[] - group_delays=[] - group_chans=[] - # Sort templates by number of channels - stream_list=[(st, len(st)) for st in stream_list] - stream_list.sort(key=lambda tup:tup[1]) - stream_list=[st[0] for st in stream_list] - for i in xrange(1,len(stream_list)): - print 'Working on waveform '+str(i)+' of '+str(len(stream_list)) - # Calculate the delays - starttimes=[] - chans=[] - for tr in stream_list[i]: - starttimes.append(tr.stats.starttime) - chans.append((tr.stats.station, tr.stats.channel)) - # This delays calculation will be an issue if we have changes in channels - delays=[starttimes[m]-min(starttimes) for m in xrange(len(starttimes))] - delays=[round(d,2) for d in delays] - if len(groups)==0: - groups.append([stream_list[i]]) - group_delays.append(delays) - group_chans.append(chans) - else: - j=0 - match=False - while not match: - kmatch=0 - # Find the set of shared stations and channels - shared_chans=[] - shared_delays_slave=[] - shared_delays_master=[] - k=0 - for chan in chans: - if chan in group_chans[j]: - shared_chans.append(chan) - shared_delays_slave.append(delays[k]) - shared_delays_master.append(group_delays[j][group_chans[j].index(chan)]) - k+=1 - # Normalize master and slave delay times - shared_delays_slave=[delay-min(shared_delays_slave)\ - for delay in shared_delays_slave] - shared_delays_master=[delay-min(shared_delays_master)\ - for delay in shared_delays_master] - for k in xrange(len(shared_chans)): - # Check if the channel and delay match another group - if shared_delays_slave[k]==shared_delays_master[k]: - kmatch+=1 # increase the match index - if kmatch==len(shared_chans): # If all the channels match, add it to the group - groups[j].append(stream_list[i]) - match=True - elif j<len(groups)-1: - j+=1 - else: - # Create a new group and break the loop - groups.append([stream_list[i]]) - group_delays.append(delays) - group_chans.append(chans) - match=True # Use this to break the loop - return groups -
-
[docs]def SVD(stream_list): - """ - Function to compute the SVD of a number of templates and return the singular - vectors and singular values of the templates. - - :type stream_list: List of Obspy.Stream - :param stream_list: List of the templates to be analysed - - :return: SVector(list of ndarray), SValues(list) for each channel, \ - Uvalues(list of ndarray) for each channel, \ - stachans, List of String (station.channel) - - .. rubric:: Note - - It is recommended that you align the data before computing the SVD, e.g., - the P-arrival on all templates for the same channel should appear at the same - time in the trace. - """ - # Convert templates into ndarrays for each channel - # First find all unique channels: - stachans=[] - for st in stream_list: - for tr in st: - stachans.append(tr.stats.station+'.'+tr.stats.channel) - stachans=list(set(stachans)) - # Initialize a list for the output matrices, one matrix per-channel - SValues=[] - SVectors=[] - Uvectors=[] - for stachan in stachans: - chan_mat=[stream_list[i].select(station=stachan.split('.')[0], \ - channel=stachan.split('.')[1])[0].data \ - for i in range(len(stream_list)) if \ - len(stream_list[i].select(station=stachan.split('.')[0], \ - channel=stachan.split('.')[1])) != 0] - # chan_mat=[chan_mat[i]/np.max(chan_mat[i]) for i in xrange(len(chan_mat))] - chan_mat=np.asarray(chan_mat) - print chan_mat.shape - U, s, V = np.linalg.svd(chan_mat, full_matrices=False) - SValues.append(s) - SVectors.append(V) - Uvectors.append(U) - return SVectors, SValues, Uvectors, stachans -
-
[docs]def empirical_SVD(stream_list, linear=True): - """ - Empirical subspace detector generation function. Takes a list of templates - and computes the stack as the first order subspace detector, and the - differential of this as the second order subspace detector following - the emprical subspace method of Barrett & Beroza, 2014 - SRL. - - :type stream_list: list of stream - :param stream_list: list of template streams to compute the subspace detectors\ - from - :type linear: Bool - :param linear: Set to true by default to compute the linear stack as the\ - first subspace vector, False will use the phase-weighted stack as the\ - first subspace vector. - - :returns: list of two streams - """ - from eqcorrscan.utils import stacking - if linear: - first_subspace=stacking.linstack(stream_list) - second_subspace=first_subspace.copy() - for i in range(len(second_subspace)): - second_subspace[i].data=np.diff(second_subspace[i].data) - second_subspace[i].stats.starttime+=0.5*second_subspace[i].stats.delta - return [first_subspace, second_subspace] -
-
[docs]def SVD_2_stream(SVectors, stachans, k, sampling_rate): - """ - Function to convert the singular vectors output by SVD to streams, one for - each singular vector level, for all channels. - - :type SVectors: List of np.ndarray - :param SVectors: Singular vectors - :type stachans: List of Strings - :param stachans: List of station.channel Strings - :type k: int - :param k: Number of streams to return = number of SV's to include - :type sampling_rate: float - :param sampling_rate: Sampling rate in Hz - - :returns: SVstreams, List of Obspy.Stream, with SVStreams[0] being - composed of the highest rank singular vectors. - """ - from obspy import Stream, Trace - SVstreams=[] - for i in range(k): - SVstream=[] - for j, stachan in enumerate(stachans): - SVstream.append(Trace(SVectors[j][i], \ - header={'station': stachan.split('.')[0], - 'channel': stachan.split('.')[1], - 'sampling_rate': sampling_rate})) - - SVstreams.append(Stream(SVstream)) - return SVstreams -
-
[docs]def corr_cluster(trace_list, thresh=0.9): - """ - Group traces based on correlations above threshold with the stack - will - run twice, once with a lower threshold, then again with your threshold to - remove large outliers - - :type trace_list: List of :class:obspy.Trace - :param trace_list: Traces to compute similarity between - :type thresh: float - :param thrsh: Correlation threshold between -1-1 - - :returns: np.ndarray of bool - """ - from eqcorrscan.utils import stacking - from obspy import Stream - from core.match_filter import normxcorr2 - stack=stacking.linstack([Stream(tr) for tr in trace_list])[0] - output=np.array([False]*len(trace_list)) - group1=[] - for i, tr in enumerate(trace_list): - if normxcorr2(tr.data,stack.data)[0][0] > 0.6: - output[i]=True - group1.append(tr) - stack=stacking.linstack([Stream(tr) for tr in group1])[0] - group2=[] - for i, tr in enumerate(trace_list): - if normxcorr2(tr.data,stack.data)[0][0] > thresh: - group2.append(tr) - output[i]=True - else: - output[i]=False - return output -
-
[docs]def extract_detections(detections, templates, contbase_list, extract_len=90.0, \ - outdir=None, extract_Z=True, additional_stations=[]): - """ - Function to extract the waveforms associated with each detection in a list - of detections for the template, template. Waveforms will be returned as - a list of obspy.Streams containing segments of extract_len. They will also - be saved if outdir is set. The default is unset. The default extract_len - is 90 seconds per channel. - - :type detections: List tuple of of :class: datetime.datetime, string - :param detections: List of datetime objects, and their associated template\ - name - :type templates: List of tuple of string and :class: obspy.Stream - :param templates: A list of the tuples of the template name and the template\ - Stream used to detect detections. - :type contbase_list: List of tuple of string - :param contbase_list: List of tuples of the form ['path', 'type', 'network']\ - Where path is the path to the continuous database, type is\ - the directory structure, which can be either Yyyyy/Rjjj.01,\ - which is the standard IRIS Year, julian day structure, or,\ - yyyymmdd which is a single directory for every day. - :type extract_len: float - :param extract_len: Length to extract around the detection (will be equally\ - cut around the detection time) in seconds. Default is 90.0. - :type outdir: Bool or String - :param outdir: Default is None, with None set, no files will be saved,\ - if set each detection will be saved into this directory with files\ - named according to the detection time, NOT than the waveform\ - start time. Detections will be saved into template subdirectories. - :type extract_Z: Bool - :param extract_Z: Set to True to also extract Z channels for detections\ - delays will be the same as horizontal channels, only applies if\ - only horizontal channels were used in the template. - :type additional_stations: List of tuple - :param additional_stations: List of stations, chanels and networks to also\ - extract data for using an average delay. - - :returns: List of :class: obspy.Stream - """ - from obspy import read, UTCDateTime, Stream - from eqcorrscan.utils import pre_processing - import datetime as dt - import os - from joblib import Parallel, delayed - # Sort the template according to starttimes, needed so that stachan[i] - # corresponds to delays[i] - all_delays=[] # List of tuples of template name, delays - all_stachans=[] - for template in templates: - templatestream=template[1].sort(['starttime']) - stachans=[(tr.stats.station,tr.stats.channel,tr.stats.network) \ - for tr in templatestream] - mintime=templatestream[0].stats.starttime - delays=[tr.stats.starttime-mintime for tr in templatestream] - all_delays.append((template[0], delays)) - all_stachans.append((template[0], stachans)) - # Sort the detections and group by day - detections.sort() - detection_days=[detection[0].date() for detection in detections] - detection_days=list(set(detection_days)) - detection_days.sort() - - # Initialize output list - detection_wavefiles=[] - - # Also include Z channels when extracting detections - if extract_Z: - new_all_stachans=[] - new_all_delays=[] - t=0 - for template in all_stachans: - stachans=template[1] - delays=all_delays[t][1] - new_stachans=[] - new_delays=[] - j=0 - for i, stachan in enumerate(stachans): - if j==1: - new_stachans.append((stachan[0], stachan[1][0]+'Z',\ - stachan[2])) - new_delays.append(delays[i]) - new_stachans.append(stachan) - new_delays.append(delays[i]) - j=0 - else: - new_stachans.append(stachan) - new_delays.append(delays[i]) - j+=1 - new_all_stachans.append((template[0], new_stachans)) - new_all_delays.append((template[0], new_delays)) - t+=1 - all_delays=new_all_delays - all_stachans=new_all_stachans - if not len(additional_stations)==0: - t=0 - for template in all_stachans: - av_delay=np.mean(all_delays[t][1]) - for sta in additional_stations: - if not sta in template[1]: - template[1].append(sta) - all_delays[t][1].append(av_delay) - t+=1 - - # Loop through the days - for detection_day in detection_days: - print 'Working on detections for day: '+str(detection_day) - stachans=list(set([stachans[1] for stachans in all_stachans][0])) - # List of all unique stachans - read in all data - for stachan in stachans: - contbase=[base for base in contbase_list\ - if base[2]==stachan[2]][0] - if contbase[1]=='yyyymmdd': - dayfile=detection_day.strftime('%Y%m%d')+'/*'+stachan[0]+\ - '.'+stachan[1][0]+'?'+stachan[1][-1]+'.*' - elif contbase[1]=='Yyyyy/Rjjj.01': - dayfile=detection_day.strftime('Y%Y/R%j.01')+'/'+stachan[0]+\ - '.*.'+stachan[1][0]+'?'+stachan[1][-1]+'.'+detection_day.strftime('%Y.%j') - if not 'st' in locals(): - try: - st=read(contbase[0]+'/'+dayfile) - except: - print 'No data for '+contbase[0]+'/'+dayfile - else: - try: - st+=read(contbase[0]+'/'+dayfile) - except: - print 'No data for '+contbase[0]+'/'+dayfile - st.merge(fill_value='interpolate') - # We now have a stream of day long data, we should process it! - # st=Parallel(n_jobs=3)(delayed(pre_processing.dayproc)(tr, lowcut,\ - # highcut,\ - # filter_order,\ - # samp_rate,\ - # debug, detection_day)\ - # for tr in st) - # st=Stream(st) - # for tr in st: - # Convert to int32 for STEIM2 format - # tr.data=tr.data.astype(np.int32) - - day_detections=[detection for detection in detections\ - if detection[0].date() == detection_day] - for detection in day_detections: - template=detection[1] - t_stachans=[stachans[1] for stachans in all_stachans \ - if stachans[0] == template][0] - t_delays=[delays[1] for delays in all_delays\ - if delays[0] == template][0] - print 'Cutting for detections at: '+detection[0].strftime('%Y/%m/%d %H:%M:%S') - detect_wav=st.copy() - for tr in detect_wav: - tr.trim(starttime=UTCDateTime(detection[0])-extract_len/2,\ - endtime=UTCDateTime(detection[0])+extract_len/2) - if outdir: - if not os.path.isdir(outdir+'/'+template): - os.makedirs(outdir+'/'+template) - detect_wav.write(outdir+'/'+template+'/'+\ - detection[0].strftime('%Y-%m-%d_%H-%M-%S')+\ - '.ms', format='MSEED', encoding='STEIM2') - # '.ms', format='MSEED', encoding='STEIM2') - print 'Written file: '+outdir+'/'+template+'/'+\ - detection[0].strftime('%Y-%m-%d_%H-%M-%S')+'.ms' - if not outdir: - detection_wavefiles.append(detect_wav) - del detect_wav - del st - if outdir: - detection_wavefiles=[] - if not outdir: - return detection_wavefiles - else: - return -
-
[docs]def space_time_cluster(detections, t_thresh, d_thresh): - """ - Function to cluster detections in space and time, use to seperate repeaters - from other events - - :type detections: List - :param detections: List of tuple of tuple of location (lat, lon, depth (km)),\ - and time as a datetime object - :type t_thresh: float - :param t_thresh: Maximum inter-event time threshold in seconds - :type d_thresh: float - :param d_thresh: Maximum inter-event distance in km - - :returns: List of tuple (detections, clustered) and list of indeces of\ - clustered detections - """ - from eqcorrscan.utils.mag_calc import dist_calc - import datetime as dt - # Ensure they are sorted by time first, not that we need it. - detections.sort(key=lambda tup:tup[1]) - clustered=[] - clustered_indeces=[] - for master_ind, master in enumerate(detections): - keep=False - for slave in detections: - if not master==slave and\ - abs((master[1] - slave[1]).total_seconds()) <= t_thresh and \ - dist_calc(master[0], slave[0]) <= d_thresh: - # If the slave events is close in time and space to the master - # keep it and break out of the loop. - keep=True - break - if keep: - clustered.append(master) - clustered_indeces.append(master_ind) - - return clustered, clustered_indeces -
-
[docs]def re_thresh_csv(path, old_thresh, new_thresh, chan_thresh): - """ - Function to remove detections by changing the threshold, can only be done - to remove detection by increasing threshold, threshold lowering will have - no affect. - - :type path: Str - :param path: Path to the .csv detection file - :type old_thresh: float - :param old_thresh: Old threshold MAD multiplier - :type new_thresh: float - :param new_thresh: New threhsold MAD multiplier - :type chan_thresh: int - :param chan_thresh: Minimum number of channels for a detection - - returns: List of detections - """ - f=open(path,'r') - old_thresh=float(old_thresh) - new_thresh=float(new_thresh) - # Be nice, ensure that the thresholds are float - detections=[] - detections_in=0 - detections_out=0 - for line in f: - if not line.split(', ')[0]=='template' and len(line) >2: - detections_in+=1 - if abs(float(line.split(', ')[3])) >=\ - (new_thresh/old_thresh)*float(line.split(', ')[2]) and\ - int(line.split(', ')[4]) >= chan_thresh: - detections_out+=1 - detections.append(line.split(', ')) - print 'Read in '+str(detections_in)+' detections' - print 'Left with '+str(detections_out)+' detections' - return detections
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/findpeaks.html b/_modules/findpeaks.html deleted file mode 100644 index c4dcb8911..000000000 --- a/_modules/findpeaks.html +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - - - - - findpeaks — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for findpeaks

-#!/usr/bin/python
-"""
-Function to find peaks in data above a certain threshold as part of the EQcorr
-package written by Calum Chamberlain of Victoria University of Wellington in
-early 2015.
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-from obspy import UTCDateTime
-import numpy as np
-
-
[docs]def is_prime(number): - """ - Function to test primality of a number. Function lifted from online resource: - http://www.codeproject.com/Articles/691200/Primality-test-algorithms-Prime-test-The-fastest-w - - This function is distributed under a seperate licence: - This article, along with any associated source code and files, is - licensed under The Code Project Open License (CPOL) - - :type number: int - :param number: Integer to test for primality - - :returns: bool - """ - import random - ''' if number != 1 ''' - if (number > 1): - ''' repeat the test few times ''' - for time in range(3): - ''' Draw a RANDOM number in range of number ( Z_number ) ''' - randomNumber = random.randint(2, number)-1 - ''' Test if a^(n-1) = 1 mod n ''' - if ( pow(randomNumber, number-1, number) != 1 ): - return False - return True - else: - ''' case number == 1 ''' - return False -
-
[docs]def find_peaks2(arr,thresh, trig_int, debug=0, maxwidth=10,\ - starttime=UTCDateTime('1970-01-01'), samp_rate=1.0): - """ - Function to determine peaks in an array of data using scipy find_peaks_cwt, - works fast in certain cases, but for match_filter cccsum peak finding, - find_peaks2_short works better. Test it out and see which works best for - your application. - - :type arr: ndarray - :param arr: 1-D numpy array is required - :type thresh: float - :param thresh: The threshold below which will be considered noise and peaks\ - will not be found in. - :type trig_int: int - :param trig_int: The minimum difference in samples between triggers,\ - if multiple peaks within this window this code will find the highest. - :type debug: int - :param debug: Optional, debug level 0-5 - :type maxwidth: int - :param maxwidth: Maximum peak width to look for in samples - - :return: peaks, locs: Lists of peak values and locations. - - """ - from scipy.signal import find_peaks_cwt - # Set everything below the threshold to zero - image=np.copy(arr) - image=np.abs(image) - image[image<thresh]=thresh - # We need to check if the number of samples in the image is prime, if it - # is this method will be really slow, so we add a pad to the end to make - # it not of prime length! - if is_prime(len(image)): - image=np.append(image, 0.0) - print 'Input array has a prime number of samples, appending a zero' - print len(image) - if len(image[image>thresh])==0: - print 'No values over threshold found' - return [] - if debug > 0: - print 'Found '+str(len(image[image>thresh]))+' samples above the threshold' - initial_peaks=[] - peaks=[] - # Find the peaks - print 'Finding peaks' - peakinds = find_peaks_cwt(image, np.arange(1,maxwidth)) - initial_peaks=[(image[peakind], peakind) for peakind in peakinds] - # Sort initial peaks according to amplitude - print 'sorting peaks' - peaks_sort=sorted(initial_peaks, key=lambda amplitude:amplitude[0],\ - reverse=True) - # Debugging - if debug>=4: - for peak in initial_peaks: - print peak - if initial_peaks: - peaks.append(peaks_sort[0]) # Definitely take the biggest peak - if debug > 3: - print 'Added the biggest peak of '+str(peaks[0][0])+' at sample '+\ - str(peaks[0][1]) - if len(initial_peaks) > 1: - if debug>3: - print 'Multiple peaks found, checking them now to see if they overlap' - for next_peak in peaks_sort:#i in xrange(1,len(peaks_sort)): # Loop through the amplitude sorted peaks - # if the next highest amplitude peak is within trig_int of any - # peak already in peaks then we don't want it, else, add it - #next_peak=peaks_sort[i] - if debug>3: - print next_peak - for peak in peaks: - add=False # Use add as a switch for whether or not to append - # next peak to peaks, if once gone through all the peaks - # it is True, then we will add it, otherwise we won't! - if abs(next_peak[1]-peak[1]) < trig_int: - if debug>3: - print 'Difference in time is '+str(next_peak[1]-peak[1]) - print 'Which is less than '+str(trig_int) - add=False - # Need to exit the loop here if false - break - else: - add=True - if add: - if debug>3: - print 'Adding peak of '+str(next_peak[0])+' at sample '+\ - str(next_peak[1]) - peaks.append(next_peak) - elif debug >3: - print 'I did not add peak of '+str(next_peak[0])+\ - ' at sample '+str(next_peak[1]) - - if debug >= 3: - from utils import EQcorrscan_plotting - EQcorrscan_plotting.peaks_plot(image, starttime, samp_rate, True, peaks, - 'debug_output/peaks_'+\ - str(starttime.year)+'-'+\ - str(starttime.month)+'-'+\ - str(starttime.day)+'.pdf') - peaks=sorted(peaks, key=lambda time:time[1], reverse=False) - return peaks - else: - print 'No peaks for you!' - return peaks -
-
[docs]def find_peaks2_short(arr,thresh, trig_int, debug=0, \ - starttime=UTCDateTime('1970-01-01'), samp_rate=1.0): - """ - Function to determine peaks in an array of data above a certain threshold. - Uses a mask to remove data below threshold and finds peaks in what is left. - - :type arr: ndarray - :param arr: 1-D numpy array is required - :type thresh: float - :param thresh: The threshold below which will be considered noise and peaks\ - will not be found in. - :type trig_int: int - :param trig_int: The minimum difference in samples between triggers,\ - if multiple peaks within this window this code will find the highest. - :type debug: int - :param debug: Optional, debug level 0-5 - - :return: peaks, locs: Lists of peak values and locations. - - """ - from scipy import ndimage - # Set everything below the threshold to zero - image=np.copy(arr) - image=np.abs(image) - image[image<thresh]=0 - if len(image[image>thresh])==0: - print 'No values over threshold found' - return [] - if debug > 0: - print 'Found '+str(len(image[image>thresh]))+' samples above the threshold' - initial_peaks=[] - peaks=[] - # Find the peaks - labeled_image, number_of_objects= ndimage.label(image) - peak_slices = ndimage.find_objects(labeled_image) - for peak_slice in peak_slices: - #print 'Width of peak='+str(peak_slice[0].stop-peak_slice[0].start) - window=arr[peak_slice[0].start:peak_slice[0].stop] - initial_peaks.append((max(window),peak_slice[0].start+np.argmax(window))) - # Sort initial peaks according to amplitude - peaks_sort=sorted(initial_peaks, key=lambda amplitude:amplitude[0],\ - reverse=True) - # Debugging - if debug>=4: - for peak in initial_peaks: - print peak - if initial_peaks: - peaks.append(peaks_sort[0]) # Definitely take the biggest peak - if debug > 3: - print 'Added the biggest peak of '+str(peaks[0][0])+' at sample '+\ - str(peaks[0][1]) - if len(initial_peaks) > 1: - if debug>3: - print 'Multiple peaks found, checking them now to see if they overlap' - for next_peak in peaks_sort:#i in xrange(1,len(peaks_sort)): # Loop through the amplitude sorted peaks - # if the next highest amplitude peak is within trig_int of any - # peak already in peaks then we don't want it, else, add it - #next_peak=peaks_sort[i] - if debug>3: - print next_peak - for peak in peaks: - add=False # Use add as a switch for whether or not to append - # next peak to peaks, if once gone through all the peaks - # it is True, then we will add it, otherwise we won't! - if abs(next_peak[1]-peak[1]) < trig_int: - if debug>3: - print 'Difference in time is '+str(next_peak[1]-peak[1]) - print 'Which is less than '+str(trig_int) - add=False - # Need to exit the loop here if false - break - else: - add=True - if add: - if debug>3: - print 'Adding peak of '+str(next_peak[0])+' at sample '+\ - str(next_peak[1]) - peaks.append(next_peak) - elif debug >3: - print 'I did not add peak of '+str(next_peak[0])+\ - ' at sample '+str(next_peak[1]) - - if debug >= 3: - from utils import EQcorrscan_plotting - EQcorrscan_plotting.peaks_plot(image, starttime, samp_rate, True, peaks, - 'debug_output/peaks_'+\ - str(starttime.year)+'-'+\ - str(starttime.month)+'-'+\ - str(starttime.day)+'.pdf') - peaks=sorted(peaks, key=lambda time:time[1], reverse=False) - return peaks - else: - print 'No peaks for you!' - return peaks -
-
[docs]def find_peaks_dep(arr, thresh, trig_int, debug=0,\ - starttime=UTCDateTime('1970-01-01'), samp_rate=1.0): - """ - Function to determine peaks in an array of data above a certain threshold. - - Depreciated peak-finding routine, very slow, but accurate. If all else fails - this one should work. - - :type arr: ndarray - :param arr: 1-D numpy array is required - :type thresh: float - :param thresh: The threshold below which will be considered noise and peaks\ - will not be found in. - :type trig_int: int - :param trig_int: The minimum difference in samples between triggers,\ - if multiple peaks within this window this code will find the highest. - - :return: peaks, locs: Lists of peak values and locations. - """ - - # Perform some checks - if trig_int < 3: - import sys - print 'Trigger interval must be greater than two samples to find maxima' - sys.exit() - #from joblib import Parallel, delayed - # Will find peaks in the absolute then transfer these to the true values - sig=np.abs(arr)-thresh - true_peaks=[] - for i in xrange(int(trig_int),int(len(sig)-trig_int), int(trig_int)): - window=sig[i-trig_int:i+trig_int] # Define a moving window containing - # data from +/- the trigger iterval - peaks=[] - locs=[] - for j in xrange(1,len(window)-1): - # Find all turning points within the window - if window[j] > 0.0 and window[j] > window[j+1] and window[j] > window[j-1]: - peaks.append(window[j]) - locs.append(i-trig_int+j) - # Find maximum peak in window - if peaks: - true_peaks.append((np.max(np.array(peaks)),\ - locs[np.argmax(np.array(peaks))])) - # Get unique values - peaks=sorted(list(set(true_peaks)), key=lambda loc: loc[1]) - # Find highest peak in peaks within trig_int of each other - for i in xrange(1,len(peaks)-1): - if peaks[i+1][1]-peaks[i][1] < trig_int: - if peaks[i][0] < peaks[i+1][0]: - peaks[i]=peaks[i+1] - else: - peaks[i+1]=peaks[i] - elif peaks[i][1]-peaks[i-1][1] < trig_int: - if peaks[i][0] < peaks[i-1][0]: - peaks[i]=peaks[i-1] - else: - peaks[i-1]=peaks[i] - peaks=sorted(list(set(peaks)), key=lambda loc: loc[1]) - if debug >= 3: - from utils import EQcorrscan_plotting - EQcorrscan_plotting.peaks_plot(arr, starttime, samp_rate, True, peaks, - 'debug_output/peaks_'+\ - str(starttime.year)+'-'+\ - str(starttime.month)+'-'+\ - str(starttime.day)+'.pdf') - return peaks
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/index.html b/_modules/index.html deleted file mode 100644 index 38ea731ba..000000000 --- a/_modules/index.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - Overview: module code — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
-
    -
  • Docs »
  • - -
  • Overview: module code
  • -
  • - -
  • -
-
-
- -
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/lag_calc.html b/_modules/lag_calc.html deleted file mode 100644 index 1162c5c69..000000000 --- a/_modules/lag_calc.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - - - - lag_calc — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for lag_calc

-#!/usr/bin/python
-"""
-Functions to generate lag-times for events detected by correlation.
-
-Part of the EQcorrscan module to integrate seisan nordic files into a full
-cross-channel correlation for detection routine.
-EQcorrscan is a python module designed to run match filter routines for
-seismology, within it are routines for integration to seisan and obspy.
-With obspy integration (which is necessary) all main waveform formats can be
-read in and output.
-
-This main section contains a script, LFE_search.py which demonstrates the usage
-of the built in functions from template generation from picked waveforms
-through detection by match filter of continuous data to the generation of lag
-times to be used for relative locations.
-
-The match-filter routine described here was used a previous Matlab code for the
-Chamberlain et al. 2014 G-cubed publication.  The basis for the lag-time
-generation section is outlined in Hardebeck & Shelly 2011, GRL.
-
-Code generated by Calum John Chamberlain of Victoria University of Wellington,
-2015.
-
-
-.. rubric:: Note
-Pre-requisites:
-    - gcc             - for the installation of the openCV correlation routine
-    - python-cv2      - Python bindings for the openCV routines
-    - python-joblib   - used for parallel processing
-    - python-obspy    - used for lots of common seismological processing
-                        - requires:
-                            - numpy
-                            - scipy
-                            - matplotlib
-    - NonLinLoc       - used outside of all codes for travel-time generation
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-import numpy as np
-from match_filter import DETECTION, normxcorr2
-
-
[docs]def _channel_loop(detection, template, i=0): - """ - Utility function to take a stream of data for the detected event and parse - the correct data to lag_gen - - :type detection: obspy.Stream - :param detection: Stream of data for the slave event detected using template - :type template: obspy.Stream - :param template: Stream of data as the template for the detection. - :type i: int, optional - :param i: Used to track which process has occured when running in parallel - - :returns: picks, a tuple of (lag in s, cross-correlation value, station, chan) - """ - from eqcorrscan.utils.Sfile_util import PICK - picks=[] - for tr in template: - image=detection.select(station=tr.stats.station,\ - channel=tr.stats.channel) - if image: #Ideally this if statement would be removed. - ccc = normxcorr2(tr.data, image[0].data) - shiftlen = len(ccc)*image[0].stats.sample_rate - # Convert the maximum cross-correlation time to an actual time - picktime = image[0].stats.starttime+(np.argmax(ccc)*image[0].stats.delta) - picks.append(PICK()) - ((lag, np.max(ccc), tr.stats.station, \ - tr.stats.channel)) - return (i, picks) -
-
[docs]def day_loop(detection_streams, template): - """ - Function to loop through multiple detections for one template - ostensibly - designed to run for the same day of data for I/O simplicity, but as you - are passing stream objects it could run for all the detections ever, as long - as you have the RAM! - - :type detection_streams: List of obspy.Stream - :param detection_streams: List of all the detections for this template that you - want to compute the optimum pick for. - :type template: obspy.Stream - :param template: The original template used to detect the detections passed - - :returns: lags - List of List of tuple: lags[i] corresponds to detection[i], - lags[i][j] corresponds to a channel of detection[i], within - this tuple is the lag (in seconds), normalised correlation, - station and channel. - """ - from multiprocessing import Pool, cpu_count # Used to run detections in parallel - lags=[] - num_cores=cpu_count() - if num_cores > len(detection_streams): - num_cores=len(detection_streams) - pool=Pool(processes=num_cores, maxtasksperchild=None) - results=[pool.apply_async(_channel_loop, args=(detection_streams[i], template, i))\ - for i in xrange(len(detection_streams))] - pool.close() - lags=[p.get() for p in results] - lags.sort(key=lambda tup: tup[0]) # Sort based on i - lags=[lag[1] for lag in lags] - # Convert lag time to moveout time - mintime=template.sort(['starttime'])[0].stats.starttime - for lag in lags: - delay=template.select(station=lag[2], channel=lag[3])[0].stats.starttime-\ - mintime - lag[0]+=delay - return lags -
-
[docs]def lag_calc(detections, detect_data, templates, shift_len=0.2, min_cc=0.4): - """ - Overseer function to take a list of detection objects, cut the data for - them to lengths of the same length of the template + shift_len on - either side. This will then write out SEISAN s-file for the detections - with pick times based on the lag-times found at the maximum correlation, - providing that correlation is above the min_cc. - - :type detections: List of DETECTION - :param detections: List of DETECTION objects - :type detect_data: obspy.Stream - :param detect_data: All the data needed to cut from - can be a gappy Stream - :type templates: List of tuple of String, obspy.Stream - :param templates: List of the templates used as tuples of template name, template - :type shift_len: float - :param shift_len: Shift length allowed for the pick in seconds, will be - plus/minus this amount - default=0.2 - :type min_cc: float - :param min_cc: Minimum cross-correlation value to be considered a pick, - default=0.4 - """ - from eqcorrscan.utils import Sfile_util - from obspy import Stream - # First work out the delays for each template - delays=[] # List of tuples - for template in templates: - temp_delays=[] - for tr in tempate[1]: - temp_delays.append((tr.stats.station, tr.stats.channel,\ - tr.stats.starttime-template.sort['starttime'][0].stats.starttime)) - delays.append((template[0], temp_delays)) - detect_streams=[] - for detection in detections: - detect_stream=[] - for tr in detect_data: - tr_copy=tr.copy() - template=[t for t in templates if t[0]==detection.template_name][0] - template=template.select(station=tr.stats.station, - channel=tr.stats.channel) - if template: - template_len=len(template[0]) - else: - continue # If there is no template-data match then skip the rest - # of the trace loop. - delay=[delay for delay in delays if delay[0]==detection.template_name][0] - delay=[d for d in delay if d[0]==tr.stats.station and \ - d[1]==tr.stats.channel][0] - detect_stream.append(tr_copy.trim(starttime=detection.detect_time-\ - shift_len+delay, endtime=detection.detect_time+delay+\ - shift_len+template_len)) - detect_streams.append((detection.template_name, Stream(detect_stream))) - # Tuple of template name and data stream - # Segregate detections by template - lags=[] - for template in templates: - template_detections=[detect[1] for detect in detect_streams\ - if detect[0]==template[0]] - lags.append(day_loop(template_detections, template[1])) - - # Write out the lags! - for event in lags: - # I think I have an old version of Sfile_util here - sfilename=Sfile_util.blanksfile(wavefile, 'L', 'PYTH', 'out', True) - picks=[] - for pick in event: - picks.append(Sfile_util.PICK()) - Sfile_util.populateSfile(sfilename, picks)
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/mag_calc.html b/_modules/mag_calc.html deleted file mode 100644 index aa8cacaab..000000000 --- a/_modules/mag_calc.html +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - - - - mag_calc — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for mag_calc

-#!/usr/bin/python
-"""
-Functions to simulate Wood Anderson traces, pick maximum peak-to-peak amplitudes
-write these amplitudes and periods to SEISAN s-files and to calculate magnitudes
-from this and the informaiton within SEISAN s-files.
-
-Written as part of the EQcorrscan package by Calum Chamberlain - first written
-to impliment magnitudes for the 2015 Wanaka aftershock sequence, written up
-by Warren-Smith [2014/15].
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-import numpy as np
-import warnings
-
-
[docs]def dist_calc(loc1, loc2): - """ - Function to calcualte the distance in km between two points, uses the flat - Earth approximation - - :type loc1: Tuple - :param loc1: Tuple of lat, lon, depth (in decimal degrees and km) - :type loc2: Tuple - :param loc2: Tuple of lat, lon, depth (in decimal degrees and km) - """ - R=6371.009 # Radius of the Earth in km - dlat=np.radians( abs( loc1[0] - loc2[0] ) ) - dlong=np.radians( abs( loc1[1] - loc2[1] ) ) - ddepth=abs( loc1[2] - loc2[2] ) - mean_lat=np.radians( ( loc1[0] + loc2[0] ) / 2 ) - dist=R*np.sqrt( dlat ** 2 + ( np.cos( mean_lat ) * dlong ) ** 2 ) - dist=np.sqrt( dist ** 2 + ddepth ** 2 ) - return dist -
-
[docs]def _sim_WA(trace, PAZ, seedresp, water_level): - """ - Function to remove the insturment response from a trace and return a - de-meaned, de-trended, Wood Anderson simulated trace in it's place. - - Works in-place on data and will destroy your original data, copy the - trace before giving it to this function! - - :type trace: obspy.Trace - :param trace: A standard obspy trace, generally should be given without - pre-filtering, if given with pre-filtering for use with - amplitude determiniation for magnitudes you will need to - worry about how you cope with the response of this filter - yourself. - :type PAZ: dict - :param PAZ: Dictionary containing lists of poles and zeros, the gain and - the sensitivity. - :type water_level: int - :param water_level: Water level for the simulation. - - :returns: obspy.Trace - """ - # Note Wood anderson sensitivity is 2080 as per Uhrhammer & Collins 1990 - PAZ_WA={'poles': [-6.283 + 4.7124j, -6.283 - 4.7124j], - 'zeros': [0 + 0j], 'gain': 1.0, 'sensitivity': 2080} - from obspy.signal import seisSim - # De-trend data - trace.detrend('simple') - # Simulate Wood Anderson - if PAZ: - trace.data=seisSim(trace.data, trace.stats.sampling_rate, paz_remove=PAZ,\ - paz_simulate=PAZ_WA, water_level=water_level,\ - remove_sensitivity=True) - elif seedresp: - trace.data=seisSim(trace.data, trace.stats.sampling_rate, paz_remove=None,\ - paz_simulate=PAZ_WA, water_level=water_level,\ - seedresp=seedresp) - else: - UserWarning('No response given to remove, will just simulate WA') - trace.data=seisSim(trace.data, trace.stats.samplng_rate, paz_remove=None,\ - water_level=water_level) - return trace -
-
[docs]def _max_p2t(data, delta): - """ - Function to find the maximum peak to trough amplitude and period of this - amplitude. Originally designed to be used to calculate magnitudes (by - taking half of the peak-to-trough amplitude as the peak amplitude). - - :type data: ndarray - :param data: waveform trace to find the peak-to-trough in. - :type delta: float - :param delta: Sampling interval in seconds - - :returns: tuple of (amplitude, period, time) with amplitude in the same scale as - given in the input data, and period in seconds, and time in seconds - from the start of the data window. - """ - import matplotlib.pyplot as plt - debug_plot=False - turning_points=[] # A list of tuples of (amplitude, sample) - for i in range(1,len(data)-1): - if (data[i] < data[i-1] and data[i] < data[i+1]) or\ - (data[i] > data[i-1] and data[i] > data[i+1]): - turning_points.append((data[i], i)) - if len(turning_points) >=1: - amplitudes=np.empty([len(turning_points)-1],) - half_periods= np.empty([len(turning_points)-1],) - else: - plt.plot(data) - plt.show() - print 'Turning points has length: '+str(len(turning_points))+\ - ' data have length: '+str(len(data)) - return (0.0, 0.0, 0.0) - for i in range(1,len(turning_points)): - half_periods[i-1]=(delta*(turning_points[i][1]-turning_points[i-1][1])) - amplitudes[i-1]=np.abs(turning_points[i][0]-turning_points[i-1][0]) - amplitude=np.max(amplitudes) - period=2*half_periods[np.argmax(amplitudes)] - if debug_plot: - plt.plot(data,'k') - plt.plot([turning_points[np.argmax(amplitudes)][1],\ - turning_points[np.argmax(amplitudes)-1][1]],\ - [turning_points[np.argmax(amplitudes)][0],\ - turning_points[np.argmax(amplitudes)-1][0]], 'r') - plt.show() - return (amplitude, period, delta*turning_points[np.argmax(amplitudes)][1]) -
-
[docs]def _GSE2_PAZ_read(GSEfile): - """ - Function to read the instrument response information from a GSE Poles and - Zeros file as generated by the SEISAN program RESP. - - Format must be CAL2, not coded for any other format at the moment, contact - the author to add others in. - - :type GSEfile: Str - :param GSEfile: Path to GSE file - - :returns: Dict of poles, zeros, gain and sensitivity - """ - import datetime as dt - f=open(GSEfile) - # First line should start with CAL2 - header=f.readline() - if not header[0:4] == 'CAL2': - raise IOError('Unknown format for GSE file, only coded for CAL2') - station=header.split()[1] - channel=header.split()[2] - sensor=header.split()[3] - date=dt.datetime.strptime(header.split()[7], '%Y/%m/%d') - header=f.readline() - if not header[0:4] == 'PAZ2': - raise IOError('Unknown format for GSE file, only coded for PAZ2') - gain=float(header.split()[3]) # Measured in nm/counts - kpoles=int(header.split()[4]) - kzeros=int(header.split()[5]) - poles=[] - for i in range(kpoles): - pole=f.readline() - poles.append(complex(float(pole.split()[0]),float(pole.split()[1]))) - zeros=[] - for i in range(kzeros): - zero=f.readline() - zeros.append(complex(float(zero.split()[0]),float(zero.split()[1]))) - # Have Poles and Zeros, but need Gain and Sensitivity - # Gain should be in the DIG2 line: - for line in f: - if line[0:4] == 'DIG2': - sensitivity=float(line.split()[2]) # measured in counts/muVolt - f.close() - PAZ={'poles': poles, 'zeros': zeros, 'gain': gain, - 'sensitivity': sensitivity} - return PAZ, date, station, channel, sensor -
-
[docs]def _find_resp(station, channel, network, time, delta, directory): - """ - Helper function to find the response information for a given station and - channel at a given time and return a dictionary of poles and zeros, gain - and sensitivity. - - :type station: String - :param station: Station name (as in the response files) - :type channel: String - :param channel: Channel name (as in the response files) - :type network: String - :param network: Network to scan for, can be a wildcard - :type time: datetime.datetime - :param time: Date-time to look for repsonse information - :type delta: float - :param delta: Sample interval in seconds - :type directory: String - :param directory: Directory to scan for response information - - :returns: Dictionary - """ - import glob - from obspy.signal.invsim import evalresp - from obspy import UTCDateTime - possible_respfiles=glob.glob(directory+'/RESP.'+network+'.'+station+'.*.'+\ - channel) # GeoNet RESP naming - possible_respfiles+=glob.glob(directory+'/RESP.'+network+'.'+channel+'.'+\ - station) # RDseed RESP naming - possible_respfiles+=glob.glob(directory+'/RESP.'+station+'.'+network) - # WIZARD resp naming - # GSE format, station needs to be 5 charectars padded with _, channel is 4 - # characters padded with _ - possible_respfiles+=glob.glob(directory+'/'+station.ljust(5,'_')+\ - channel[0:len(channel)-1].ljust(3,'_')+\ - channel[-1]+'.*_GSE') - PAZ=[] - seedresp=[] - for respfile in possible_respfiles: - print 'Reading response from: '+respfile - if respfile.split('/')[-1][0:4]=='RESP': - # Read from a resp file - seedresp={'filename': respfile, 'date': UTCDateTime(time), - 'units': 'DIS', 'network': network, 'station': station, - 'channel': channel, 'location': '*'} - try: - # Attempt to evaluate the response for this information, if not - # then this is not the correct response info! - freq_resp, freqs = evalresp(delta, 100, seedresp['filename'], - seedresp['date'], - units=seedresp['units'], freq=True, - network=seedresp['network'], - station=seedresp['station'], - channel=seedresp['channel']) - except: - print 'Issues with RESP file' - seedresp=[] - continue - elif respfile[-3:]=='GSE': - PAZ, pazdate, pazstation, pazchannel, pazsensor =\ - _GSE2_PAZ_read(respfile) - # check that the date is good! - if pazdate >= time and pazchannel != channel and\ - pazstation != station: - print 'Issue with GSE file' - print 'date: '+str(pazdate)+' channel: '+pazchannel+\ - ' station: '+pazstation - PAZ=[] - else: - continue - # Check that PAZ are for the correct station, channel and date - if PAZ or seedresp: - break - if PAZ: - return PAZ - elif seedresp: - return seedresp -
-
[docs]def _pairwise(iterable): - """ - Wrapper on itertools for SVD_magnitude - """ - import itertools - a, b = itertools.tee(iterable) - next(b, None) - return itertools.izip(a, b) -
-
[docs]def Amp_pick_sfile(sfile, datapath, respdir, chans=['Z'], var_wintype=True, \ - winlen=0.9, pre_pick=0.2, pre_filt=True, lowcut=1.0,\ - highcut=20.0, corners=4): - """ - Function to read information from a SEISAN s-file, load the data and the - picks, cut the data for the channels given around the S-window, simulate - a Wood Anderson seismometer, then pick the maximum peak-to-trough - amplitude. - - Output will be put into a mag_calc.out file which will be in full S-file - format and can be copied to a REA database. - - :type sfile: String - :type datapath: String - :param datapath: Path to the waveform files - usually the path to the WAV directory - :type respdir: String - :param respdir: Path to the response information directory - :type chans: List of strings - :param chans: List of the channels to pick on, defaults to ['Z'] - should - just be the orientations, e.g. Z,1,2,N,E - :type var_wintype: Bool - :param var_wintype: If True, the winlen will be - multiplied by the P-S time if both P and S picks are - available, otherwise it will be multiplied by the hypocentral - distance*0.34 - dervided using a p-s ratio of 1.68 and - S-velocity of 1.5km/s to give a large window, defaults to True - :type winlen: Float - :param winlen: Length of window, see above parameter, if var_wintype is False - Then this will be in seconds, otherwise it is the multiplier - to the p-s time, defaults to 0.5 - :type pre_pick: Float - :param pre_pick: Time before the s-pick to start the cut window, defaults - to 0.2 - :type pre_filt: Bool - :param pre_filt: To apply a pre-filter or not, defaults to True - :type lowcut: Float - :param lowcut: Lowcut in Hz for the pre-filter, defaults to 1.0 - :type highcut: Float - :param highcut: Highcut in Hz for the pre-filter, defaults to 20.0 - :type corners: Int - :param corners: Number of corners to use in the pre-filter - """ - # Hardwire a p-s multiplier of hypocentral distance based on p-s ratio of - # 1.68 and an S-velocity 0f 1.5km/s, deliberately chosen to be quite slow - ps_multiplier=0.34 - from eqcorrscan.utils import Sfile_util - from obspy import read - from scipy.signal import iirfilter - from obspy.signal.invsim import paz2AmpValueOfFreqResp - import warnings - # First we need to work out what stations have what picks - picks=Sfile_util.readpicks(sfile) - # Convert these picks into a lists - stations=[] # List of stations - channels=[] # List of channels - picktimes=[] # List of pick times - picktypes=[] # List of pick types - distances=[] # List of hypocentral distances - picks_out=[] - for pick in picks: - if pick.phase in ['P','S']: - picks_out.append(pick) # Need to be able to remove this if there - # isn't data for a station! - stations.append(pick.station) - channels.append(pick.channel) - picktimes.append(pick.time) - picktypes.append(pick.phase) - distances.append(pick.distance) - # Read in waveforms - stream=read(datapath+'/'+Sfile_util.readwavename(sfile)[0]) - if len(Sfile_util.readwavename(sfile)) > 1: - for wavfile in Sfile_util.readwavename(sfile): - stream+=read(datapath+'/'+wavfile) - stream.merge() # merge the data, just in case! - # For each station cut the window - uniq_stas=list(set(stations)) - for sta in uniq_stas: - for chan in chans: - print 'Working on '+sta+' '+chan - tr=stream.select(station=sta, channel='*'+chan) - if not tr: - # Remove picks from file - # picks_out=[picks_out[i] for i in xrange(len(picks))\ - # if picks_out[i].station+picks_out[i].channel != \ - # sta+chan] - warnings.warn('There is no station and channel match in the wavefile!') - break - else: - tr=tr[0] - # Apply the pre-filter - if pre_filt: - try: - tr.detrend('simple') - except: - dummy=tr.split() - dummy.detrend('simple') - tr=dummy.merge()[0] - tr.filter('bandpass',freqmin=lowcut, freqmax=highcut,\ - corners=corners) - sta_picks=[i for i in xrange(len(stations)) \ - if stations[i]==sta] - hypo_dist=picks[sta_picks[0]].distance - CAZ=picks[sta_picks[0]].CAZ - if var_wintype: - if 'S' in [picktypes[i] for i in sta_picks] and\ - 'P' in [picktypes[i] for i in sta_picks]: - # If there is an S-pick we can use this :D - S_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='S'] - S_pick=min(S_pick) - P_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='P'] - P_pick=min(P_pick) - try: - tr.trim(starttime=S_pick-pre_pick, \ - endtime=S_pick+(S_pick-P_pick)*winlen) - except: - break - elif 'S' in [picktypes[i] for i in sta_picks]: - S_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='S'] - S_pick=min(S_pick) - P_modelled=S_pick-hypo_dist*ps_multiplier - try: - tr.trim(starttime=S_pick-pre_pick,\ - endtime=S_pick+(S_pick-P_modelled)*winlen) - except: - break - else: - # In this case we only have a P pick - P_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='P'] - P_pick=min(P_pick) - S_modelled=P_pick+hypo_dist*ps_multiplier - try: - tr.trim(starttime=S_modelled-pre_pick,\ - endtime=S_modelled+(S_modelled-P_pick)*winlen) - except: - break - # Work out the window length based on p-s time or distance - elif 'S' in [picktypes[i] for i in sta_picks]: - # If the window is fixed we still need to find the start time, - # which can be based either on the S-pick (this elif), or - # on the hypocentral distance and the P-pick - - # Take the minimum S-pick time if more than one S-pick is available - S_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='S'] - S_pick=min(S_pick) - try: - tr.trim(starttime=S_pick-pre_pick, endtime=S_pick+winlen) - except: - break - else: - # In this case, there is no S-pick and the window length is fixed - # We need to calculate an expected S_pick based on the hypocentral - # distance, this will be quite hand-wavey as we are not using - # any kind of velocity model. - P_pick=[picktimes[i] for i in sta_picks \ - if picktypes[i]=='P'] - P_pick=min(P_pick) - hypo_dist=[distances[i] for i in sta_picks\ - if picktypes[i]=='P'][0] - S_modelled=P_pick+hypo_dist*ps_multiplier - try: - tr.trim(starttime=S_modelled-pre_pick,\ - endtime=S_modelled+winlen) - except: - break - # Find the response information - resp_info=_find_resp(tr.stats.station, tr.stats.channel,\ - tr.stats.network, tr.stats.starttime, tr.stats.delta,\ - respdir) - PAZ=[] - seedresp=[] - if resp_info and 'gain' in resp_info: - PAZ=resp_info - elif resp_info: - seedresp=resp_info - # Simulate a Wood Anderson Seismograph - if PAZ and len(tr.data) > 10: # Set ten data points to be the minimum to pass - tr=_sim_WA(tr, PAZ, None, 10) - elif seedresp and len(tr.data) > 10: - tr=_sim_WA(tr, None, seedresp, 10) - elif len(tr.data) > 10: - warnings.warn('No PAZ for '+tr.stats.station+' '+\ - tr.stats.channel+' at time: '+\ - str(tr.stats.starttime)) - continue - if len(tr.data) <= 10: - # Should remove the P and S picks if len(tr.data)==0 - warnings.warn('No data found for: '+tr.stats.station) - # print 'No data in miniseed file for '+tr.stats.station+\ - # ' removing picks' - # picks_out=[picks_out[i] for i in xrange(len(picks_out))\ - # if i not in sta_picks] - break - # Get the amplitude - amplitude, period, delay= _max_p2t(tr.data, tr.stats.delta) - if amplitude==0.0: - break - print 'Amplitude picked: '+str(amplitude) - # Note, amplitude should be in meters at the moment! - # Remove the pre-filter response - if pre_filt: - # Generate poles and zeros for the filter we used earlier - this - # is how the filter is designed in the convenience methods of - # filtering in obspy. - z, p, k=iirfilter(corners, [lowcut/(0.5*tr.stats.sampling_rate),\ - highcut/(0.5*tr.stats.sampling_rate)],\ - btype='band', ftype='butter', output='zpk') - filt_paz={'poles': list(p), - 'zeros': list(z), - 'gain': k, - 'sensitivity': 1.0} - amplitude /= (paz2AmpValueOfFreqResp(filt_paz, 1/period) * \ - filt_paz['sensitivity']) - # Convert amplitude to mm - if PAZ: # Divide by Gain to get to nm (returns pm? 10^-12) - # amplitude *=PAZ['gain'] - amplitude /= 1000 - if seedresp: # Seedresp method returns mm - amplitude *= 1000000 - # Write out the half amplitude, approximately the peak amplitude as - # used directly in magnitude calculations - # Page 343 of Seisan manual: - # Amplitude (Zero-Peak) in units of nm, nm/s, nm/s^2 or counts - amplitude *= 0.5 - # Generate a PICK type object for this pick - picks_out.append(Sfile_util.PICK(station=tr.stats.station, - channel=tr.stats.channel, - impulsivity=' ', - phase='IAML', - weight='', polarity=' ', - time=tr.stats.starttime+delay, - coda=999, amplitude=amplitude, - peri=period, azimuth=float('NaN'), - velocity=float('NaN'), AIN=999, SNR='', - azimuthres=999, timeres=float('NaN'), - finalweight=999, distance=hypo_dist, - CAZ=CAZ)) - # Copy the header from the sfile to a new local S-file - fin=open(sfile,'r') - fout=open('mag_calc.out','w') - for line in fin: - if not line[79]=='7': - fout.write(line) - else: - fout.write(line) - break - fin.close() - fout.close() - # Write picks out to new s-file - for pick in picks_out: - print pick - Sfile_util.populateSfile('mag_calc.out',picks_out) - return picks -
-
[docs]def SVD_moments(U, s, V, stachans, event_list, n_SVs=4): - """ - Function to convert basis vectors calculated by singular value decomposition\ - (see the SVD functions in clustering) into relative magnitudes. - - :type U: List of np.ndarray - :param U: List of the input basis vectors from the SVD, one array for each\ - channel used. - :type s: List of nd.array - :param s: List of the singular values, one array for each channel - :type V: List of np.ndarry - :param V: List of output basis vectors from SVD, one array per channel. - :type stachans: List of string - :param stachans: List of station.channel input - :type event_list: List of list - :param event_list: List of events for which you have data, such that\ - event_list[i] corresponds to stachans[i], U[i] etc. and\ - event_list[i][j] corresponds to event j in U[i] - type n_SVs: int - :param n_SVs: Number of singular values to use, defaults to 4. - - :returns: M, np.array of relative moments - """ - import copy - import random - - # Copying script from one obtained from John Townend. - # Define maximum number of events, will be the width of K - K_width = max([max(ev_list) for ev_list in event_list])+1 - # Sometimes the randomisation generates a singular matrix - rather than - # attempting to regulerize this matrix I propose undertaking the randomisation - # step a further time - for i, stachan in enumerate(stachans): - k = [] # Small kernel matrix for one station - channel - # Copy the relevant vectors so as not to detroy them - U_working=copy.deepcopy(U[i]) - V_working=copy.deepcopy(V[i]) - s_working=copy.deepcopy(s[i]) - ev_list=event_list[i] - if not len(ev_list) == len(V_working): - print 'V is : '+str(len(V_working)) - raise IOError('Not the same number of events as V') - # Set all non-important singular values to zero - s_working[n_SVs:len(s_working)] = 0 - s_working = np.diag(s_working) - # Convert to numpy matrices - U_working = np.matrix(U_working) - V_working = np.matrix(V_working) - s_working = np.matrix(s_working) - - SVD_weights = U_working[:,0] - # If all the weights are negative take the abs - if np.all(SVD_weights < 0): - warnings.warn('All weights are negative - flipping them') - SVD_weights=np.abs(SVD_weights) - SVD_weights = np.array(SVD_weights).reshape(-1).tolist() - # Shuffle the SVD_weights prior to pairing - will give one of multiple - # pairwise options - see p1956 of Rubinstein & Ellsworth 2010 - # We need to keep the real indexes though, otherwise, if there are multiple - # events with the same weight we will end up with multiple -1 values - random_SVD_weights = np.copy(SVD_weights) - # Tack on the indexes - random_SVD_weights = random_SVD_weights.tolist() - random_SVD_weights = [(random_SVD_weights[_i], _i)\ - for _i in range(len(random_SVD_weights))] - random.shuffle(random_SVD_weights) - # Add the first element to the end so all elements will be paired twice - random_SVD_weights.append(random_SVD_weights[0]) - # Take pairs of all the SVD_weights (each weight appears in 2 pairs) - pairs = [] - for pair in _pairwise(random_SVD_weights): - pairs.append(pair) - # Deciding values for each place in kernel matrix using the pairs - for pairsIndex in range(len(pairs)): - # We will normalize by the minimum weight - _weights = zip(*list(pairs[pairsIndex]))[0] - _indeces = zip(*list(pairs[pairsIndex]))[1] - min_weight = min(_weights) - max_weight = max(_weights) - min_index = _indeces[np.argmin(_weights)] - max_index = _indeces[np.argmax(_weights)] - row = [] - # Working out values for each row of kernel matrix - for j in range(len(SVD_weights)): - if j == max_index: - result = -1 - elif j == min_index: - normalised = max_weight/min_weight - result = float(normalised) - else: - result = 0 - row.append(result) - print row - # Add each row to the K matrix - k.append(row) - # k is now a square matrix, we need to flesh it out to be K_width - k_filled=np.zeros([len(k), K_width]) - for j in range(len(k)): - for l, ev in enumerate(ev_list): - k_filled[j,ev]=k[j][l] - if not 'K' in locals(): - K=k_filled - else: - K=np.concatenate([K,k_filled]) - # Remove any empty rows - K_nonempty=[] - events_out=[] - for i in range(0,K_width): - if not np.all(K[:,i]==0): - K_nonempty.append(K[:,i]) - events_out.append(i) - K=np.array(K_nonempty).T - K=K.tolist() - K_width=len(K[0]) - # Add an extra row to K, so average moment = 1 - K.append(np.ones(K_width) * (1. / K_width)) - print "\nCreated Kernel matrix: " - print('\n'.join([''.join([str(round(float(item),3)).ljust(6)\ - for item in row]) for row in K])) - Krounded = np.around(K, decimals = 4) - # Create a weighting matrix to put emphasis on the final row. - W = np.matrix(np.identity(len(K))) - # the final element of W = the number of stations*number of events - W[-1,-1] = len(K)-1 - # Make K into a matrix - K = np.matrix(K) - - ############ - - # Solve using the weighted least squares equation, K.T is K transpose - Kinv = np.array(np.linalg.inv(K.T*W*K) * K.T * W) - - # M are the relative moments of the events - M = Kinv[:, -1] - - return M, events_out -
-if __name__ == '__main__': - """ - Code to loop through a database and make a shit-tonne of magnitude picks-boi! - - Coded to run through SEISAN databases. - """ - import sys - if len(sys.argv) < 6 or len(sys.argv) > 7: - msg='Insufficient arguments, needs the database to calculate over, and'+\ - ' the ouptut database, paths to REA dir (not year/mm dirs) for both'+\ - ' please, and the path to the CAL directory, and the start and'+\ - ' stop dates as yyyymmddhhmmss' - raise IOError(msg) - indir=str(sys.argv[1]) - outdir=str(sys.argv[2]) - calpath=str(sys.argv[3]) - startdate=str(sys.argv[4]) - enddate=str(sys.argv[5]) - if len(sys.argv) == 7: - wavepath=sys.argv[6] - elif len(sys.argv) == 6: - wavepath=None - import glob - import shutil - import datetime as dt - try: - startdate=dt.datetime.strptime(startdate.ljust(14,'0'), '%Y%m%d%H%M%S') - except: - raise IOError('start date is not yyyymmddhhmmss form') - try: - stopdate=dt.datetime.strptime(enddate.ljust(14,'0'), '%Y%m%d%H%M%S') - except: - raise IOError('end date is not yyyymmddhhmmss form') - kdays=((stopdate+dt.timedelta(1))-startdate).days - for i in xrange(kdays): - day=startdate+dt.timedelta(i) - print 'Working on '+str(day) - sfiles=glob.glob(indir+'/'+str(day.year)+'/'+str(day.month).zfill(2)+\ - '/'+str(day.day).zfill(2)+'-*L.S'+str(day.year)+\ - str(day.month).zfill(2)) - datetimes=[dt.datetime.strptime(sfiles[i].split('/')[-1], '%d-%H%M-%SL.S%Y%m')\ - for i in xrange(len(sfiles))] - sfiles=[sfiles[i] for i in xrange(len(sfiles)) if datetimes[i] > startdate and - datetimes[i] < stopdate] - if not wavepath: - wavedir="/".join(indir.split('/')[:-2])+'/WAV/'+\ - indir.split('/')[-1]+'/'+str(day.year)+'/'+\ - str(day.month).zfill(2) - else: - wavedir=wavepath+'/'+str(day.year)+'/'+\ - str(day.month).zfill(2) - sfiles.sort() - for sfile in sfiles: - # Make the picks! - print ' Working on Sfile: '+sfile - picks=Amp_pick_sfile(sfile, wavedir, calpath) - # Copy the mag_calc.out file to the correct place - shutil.copyfile('mag_calc.out', outdir+'/'+str(day.year)+'/'+\ - str(day.month).zfill(2)+'/'+sfile.split('/')[-1]) -
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/match_filter.html b/_modules/match_filter.html deleted file mode 100644 index 7f8536748..000000000 --- a/_modules/match_filter.html +++ /dev/null @@ -1,751 +0,0 @@ - - - - - - - - - - match_filter — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for match_filter

-#!/usr/bin/python
-"""
-Function to cross-correlate templates generated by template_gen function with\
-data and output the detecitons.  The main component of this script is the\
-normxcorr2 function from the openCV image processing package.  This is a highly\
-optimized and accurate normalized cross-correlation routine.  The details of\
-this code can be found here:\
-* http://www.cs.ubc.ca/research/deaton/remarks_ncc.html\
-The cpp code was first tested using the Matlab mex wrapper, and has since been\
-ported to a python callable dynamic library.
-
-Part of the EQcorrscan module to integrate seisan nordic files into a full\
-cross-channel correlation for detection routine.\
-EQcorrscan is a python module designed to run match filter routines for\
-seismology, within it are routines for integration to seisan and obspy.\
-With obspy integration (which is necessary) all main waveform formats can be\
-read in and output.
-
-This main section contains a script, LFE_search.py which demonstrates the usage\
-of the built in functions from template generation from picked waveforms\
-through detection by match filter of continuous data to the generation of lag\
-times to be used for relative locations.
-
-The match-filter routine described here was used a previous Matlab code for the\
-Chamberlain et al. 2014 G-cubed publication.  The basis for the lag-time\
-generation section is outlined in Hardebeck & Shelly 2011, GRL.
-
-Code generated by Calum John Chamberlain of Victoria University of Wellington,\
-2015.
-
-
-.. rubric:: Note
-Pre-requisites:
-    - gcc             - for the installation of the openCV correlation routine
-    - python-cv2      - Python bindings for the openCV routines
-    - python-joblib   - used for parallel processing
-    - python-obspy    - used for lots of common seismological processing
-                        - requires:
-                            - numpy
-                            - scipy
-                            - matplotlib
-    - NonLinLoc       - used outside of all codes for travel-time generation
-
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-import numpy as np
-import warnings
-
-
[docs]class DETECTION(object): - """ - Information required for a full detection based on cross-channel - correlation sums. - - Attributes: - :type template_name: str - :param template_name: The name of the template for which this detection\ - was made - :type detect_time: :class: 'obspy.UTCDateTime' - :param detect_time: Time of detection as an obspy UTCDateTime object - :type no_chans: int - :param no_chans: The number of channels for which the cross-channel\ - correlation sum was calculated over. - :type chans: list of str - :param chans: List of stations for the detection - :type cccsum_val: float - :param cccsum_val: The raw value of the cross-channel correlation sum\ - for this detection. - :type threshold: float - :param threshold: The value of the threshold used for this detection,\ - will be the raw threshold value related to the cccsum. - :type typeofdet: str - :param typeofdet: Type of detection, STA, corr, bright - """ - detectioncount=0 - def __init__(self, template_name, detect_time, - no_chans, detect_val, - threshold, typeofdet, - chans=None): - - self.template_name=template_name - self.detect_time=detect_time - self.no_chans=no_chans - self.chans=chans - self.detect_val=detect_val - self.threshold=threshold - self.typeofdet=typeofdet - self.detectioncount+=1 - def __repr__(self): - return "DETECTION()" - def __str__(self): - print_str="Detection on "+self.template_name+" at "+str(self.detect_time) - return print_str -
-
[docs]def normxcorr2(template, image): - """ - Base function to call the c++ correlation routine from the openCV image - processing suite. Requires you to have installed the openCV python - bindings, which can be downloaded on Linux machines using: - **sudo apt-get install python-openCV** - Here we use the cv2.TM_CCOEFF_NORMED method within openCV to give the - normalized cross-correaltion. Documentation on this function can be - found here: - **http://docs.opencv.org/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#cv2.matchTemplate** - - :type template: :class: 'numpy.array' - :param template: Template array - :type image: :class: 'numpy.array' - :param image: image to scan\ - the template through. The order of these matters, if you put the template\ - after the image you will get a reversed correaltion matrix - - :return: New :class: 'numpy.array' object of the correlation values for the\ - correlation of the image with the template. - """ - import cv2 - # Check that we have been passed numpy arrays - if type(template) != np.ndarray or type(image) != np.ndarray: - print 'You have not provided numpy arrays, I will not convert them' - return 'NaN' - # Convert numpy arrays to float 32 - cv_template=template.astype(np.float32) - cv_image=image.astype(np.float32) - ccc=cv2.matchTemplate(cv_image,cv_template,cv2.TM_CCOEFF_NORMED) - if np.all(np.isnan(cv_image)) and np.all(np.isnan(cv_template)): - ccc=np.zeros(len(ccc)) - if np.all(ccc==1.0) and (np.all(np.isnan(cv_template))\ - or np.all(np.isnan(cv_image))): - ccc=np.zeros(len(ccc)) - # Convert an array of perfect correlations to zero cross-correlations - # Reshape ccc to be a 1D vector as is useful for seismic data - ccc=ccc.reshape((1,len(ccc))) - return ccc -
-
[docs]def _template_loop(template, chan, station, channel, debug=0, i=0): - """ - Sister loop to handle the correlation of a single template (of multiple - channels) with a single channel of data. - - :type template: obspy.Stream - :type chan: np.array - :type station: String - :type channel: String - :type i: Int - :param i: Optional argument, used to keep track of which process is being\ - run. - - :returns: tuple of (i,ccc) with ccc as an ndarray - """ - from eqcorrscan.utils.timer import Timer - - ccc=np.array([np.nan] * (len(chan) - len(template[0].data) + 1),\ - dtype=np.float16) - ccc=ccc.reshape((1,len(ccc))) # Set default value for - # cross-channel correlation in - # case there are no data that - # match our channels. - with Timer() as t: - # While each bit of this loop isn't slow, looping through the if statement when - # I don't need to adds up, I should work this out earlier - template_data=template.select(station=station, \ - channel=channel) - template_data=template_data[0] # Assuming you only have one template per channel - delay=template_data.stats.starttime - \ - template.sort(['starttime'])[0].stats.starttime - pad=np.array([0] * int(round(delay * \ - template_data.stats.sampling_rate))) - image=np.append(chan,pad)[len(pad):] - ccc=(normxcorr2(template_data.data, image)) - ccc=ccc.astype(np.float16) - # Convert to float16 to save memory for large problems - lose some - # accuracy which will affect detections very close to threshold - if debug >= 2 and t.secs > 4: - print "Single if statement took %s s" % t.secs - if not template_data: - print "Didn't even correlate!" - print station+' '+channel - elif debug >=2: - print "If statement without correlation took %s s" % t.secs - if debug >= 3: - print '********* DEBUG: '+station+'.'+\ - channel+' ccc MAX: '+str(np.max(ccc[0])) - print '********* DEBUG: '+station+'.'+\ - channel+' ccc MEAN: '+str(np.mean(ccc[0])) - if np.isinf(np.mean(ccc[0])): - warnings.warn('Mean of ccc is infinite, check!') - if debug >=3: - np.save('inf_cccmean_ccc.npy', ccc[0]) - np.save('inf_cccmean_template.npy', template_data.data) - np.save('inf_cccmean_image.npy', image) - if debug >=3: - print 'shape of ccc: '+str(np.shape(ccc)) - print 'A single ccc is using: '+str(ccc.nbytes/1000000)+'MB' - print 'ccc type is: '+str(type(ccc)) - if debug >=3: - print 'shape of ccc: '+str(np.shape(ccc)) - print "Parallel worker "+str(i)+" complete" - return (i, ccc) -
-
[docs]def _channel_loop(templates, stream, cores=1, debug=0): - """ - Loop to generate cross channel correaltion sums for a series of templates - hands off the actual correlations to a sister function which can be run in - parallel. - - :type templates: :class: 'obspy.Stream' - :param templates: A list of templates, where each one should be an\ - obspy.Stream object containing multiple traces of seismic data and the\ - relevant header information. - :param stream: A single obspy.Stream object containing daylong seismic data\ - to be correlated through using the templates. This is in effect the image - :type core: int - :param core: Number of cores to loop over - :type debug: int - :param debug: Debug level. - - :return: New list of :class: 'numpy.array' objects. These will contain the\ - correlation sums for each template for this day of data. - :return: list of ints as number of channels used for each cross-correlation - """ - import time, cv2 - from multiprocessing import Pool - from eqcorrscan.utils.timer import Timer - num_cores=cores - if len(templates) < num_cores: - num_cores = len(templates) - if 'cccs_matrix' in locals(): - del cccs_matrix - # Initialize cccs_matrix, which will be two arrays of len(templates) arrays, - # where the arrays cccs_matrix[0[:]] will be the cross channel sum for each - # template. - - # Note: This requires all templates to be the same length, and all channels - # to be the same length - cccs_matrix=np.array([np.array([np.array([0.0]*(len(stream[0].data)-\ - len(templates[0][0].data)+1))]*\ - len(templates))]*2) - # Initialize number of channels array - no_chans=np.array([0]*len(templates)) - - for tr in stream: - tr_data=tr.data - station=tr.stats.station - channel=tr.stats.channel - if debug >=1: - print "Starting parallel run for station "+station+" channel "+\ - channel - tic=time.clock() - with Timer() as t: - # Send off to sister function - pool=Pool(processes=num_cores, maxtasksperchild=None) - results=[pool.apply_async(_template_loop, args=(templates[i],\ - tr_data, station,\ - channel, i,\ - debug))\ - for i in range(len(templates))] - pool.close() - if debug >=1: - print "--------- TIMER: Correlation loop took: %s s" % t.secs - print " I have "+str(len(results))+" results" - with Timer() as t: - cccs_list=[p.get() for p in results] - pool.join() - if debug >=1: - print "--------- TIMER: Getting results took: %s s" % t.secs - with Timer() as t: - cccs_list.sort(key=lambda tup: tup[0]) # Sort by placeholder returned from function - if debug >=1: - print "--------- TIMER: Sorting took: %s s" % t.secs - with Timer() as t: - cccs_list = [ccc[1] for ccc in cccs_list] - if debug >=1: - print "--------- TIMER: Extracting arrays took: %s s" % t.secs - if debug >= 3: - print 'cccs_list is shaped: '+str(np.shape(cccs_list)) - with Timer() as t: - cccs=np.concatenate(cccs_list, axis=0) - if debug >=1: - print "--------- TIMER: cccs_list conversion: %s s" % t.secs - del cccs_list - if debug >=2: - print 'After looping through templates the cccs is shaped: '+str(np.shape(cccs)) - print 'cccs is using: '+str(cccs.nbytes/1000000)+' MB of memory' - cccs_matrix[1]=np.reshape(cccs, (1,len(templates),max(np.shape(cccs)))) - del cccs - if debug >=2: - print 'cccs_matrix shaped: '+str(np.shape(cccs_matrix)) - print 'cccs_matrix is using '+str(cccs_matrix.nbytes/1000000)+' MB of memory' - # Now we have an array of arrays with the first dimensional index giving the - # channel, the second dimensional index giving the template and the third - # dimensional index giving the position in the ccc, e.g.: - # np.shape(cccsums)=(len(stream), len(templates), len(ccc)) - - if debug >=2: - print 'cccs_matrix as a np.array is shaped: '+str(np.shape(cccs_matrix)) - # First work out how many channels were used - for i in range(0,len(templates)): - if not np.all(cccs_matrix[1][i]==0): - # Check that there are some real numbers in the vector rather - # than being all 0, which is the default case for no match - # of image and template names - no_chans[i]+=1 - # Now sum along the channel axis for each template to give the cccsum values - # for each template for each day - with Timer() as t: - cccsums=cccs_matrix.sum(axis=0).astype(np.float32) - if debug >=1: - print "--------- TIMER: Summing took %s s" % t.secs - if debug>=2: - print 'cccsums is shaped thus: '+str(np.shape(cccsums)) - cccs_matrix[0]=cccsums - del cccsums - toc=time.clock() - if debug >=1: - print "--------- TIMER: Trace loop took "+str(toc-tic)+" s" - if debug >=2: - print 'cccs_matrix is shaped: '+str(np.shape(cccs_matrix)) - cccsums=cccs_matrix[0] - return cccsums, no_chans -
-
[docs]def match_filter(template_names, templates, st, threshold,\ - threshold_type, trig_int, plotvar, plotdir='.', cores=1,\ - tempdir=False, debug=0, plot_format='jpg'): - """ - Over-arching code to run the correlations of given templates with a day of - seismic data and output the detections based on a given threshold. - - :type templates: list :class: 'obspy.Stream' - :param templates: A list of templates of which each template is a Stream of\ - obspy traces containing seismic data and header information. - :type st: :class: 'obspy.Stream' - :param st: An obspy.Stream object containing all the data available and\ - required for the correlations with templates given. For efficiency this\ - should contain no excess traces which are not in one or more of the\ - templates. This will now remove excess traces internally, but will\ - copy the stream and work on the copy, leaving the stream you input\ - untouched. - :type threshold: float - :param threshold: A threshold value set based on the threshold_type - :type threshold_type: str - :param threshold_type: The type of threshold to be used, can be MAD,\ - absolute or av_chan_corr. MAD threshold is calculated as the\ - threshold*(median(abs(cccsum))) where cccsum is the cross-correlation\ - sum for a given template. absolute threhsold is a true absolute\ - threshold based on the cccsum value av_chan_corr is based on the mean\ - values of single-channel cross-correlations assuming all data are\ - present as required for the template, \ - e.g. av_chan_corr_thresh=threshold*(cccsum/len(template)) where\ - template is a single template from the input and the length is the\ - number of channels within this template. - :type trig_int: float - :param trig_int: Minimum gap between detections in seconds. - :type plotvar: bool - :param plotvar: Turn plotting on or off - :type plotdir: str - :param plotdir: Path to plotting folder, plots will be output here, defaults\ - to run location. - :type tempdir: String or False - :param tempdir: Directory to put temporary files, or False - :type cores: int - :param cores: Number of cores to use - :type debug: int - :param debug: Debug output level, the bigger the number, the more the output - - :return: :class: 'DETECTIONS' detections for each channel formatted as\ - :class: 'obspy.UTCDateTime' objects. - - .. rubric:: Note - Plotting within the match-filter routine uses the Agg backend with\ - interactive plotting turned off. This is because the function is\ - designed to work in bulk. If you wish to turn interactive plotting on\ - you must import matplotlib in your script first, when you them import\ - match_filter you will get the warning that this call to matplotlib has\ - no effect, which will mean that match_filter has not changed the plotting\ - behaviour. - - """ - import matplotlib - matplotlib.use('Agg') - import matplotlib.pyplot as plt - plt.ioff() - from eqcorrscan.utils import findpeaks, EQcorrscan_plotting - import time, copy - from obspy import Trace - match_internal=False # Set to True if memory is an issue, if True, will only - # use about the same amount of memory as the seismic dat - # take up. If False, it will use 20-100GB per instance - # Copy the stream here because we will fuck about with it - stream=st.copy() - # Debug option to confirm that the channel names match those in the templates - if debug>=2: - template_stachan=[] - data_stachan=[] - for template in templates: - for tr in template: - template_stachan.append(tr.stats.station+'.'+tr.stats.channel) - for tr in stream: - data_stachan.append(tr.stats.station+'.'+tr.stats.channel) - template_stachan=list(set(template_stachan)) - data_stachan=list(set(data_stachan)) - if debug >= 3: - print 'I have template info for these stations:' - print template_stachan - print 'I have daylong data for these stations:' - print data_stachan - # Perform a check that the daylong vectors are daylong - for tr in stream: - if not tr.stats.sampling_rate*86400 == tr.stats.npts: - raise ValueError ('Data are not daylong for '+tr.stats.station+\ - '.'+tr.stats.channel) - # Call the _template_loop function to do all the correlation work - outtic=time.clock() - # Edit here from previous, stable, but slow match_filter - # Would be worth testing without an if statement, but with every station in - # the possible template stations having data, but for those without real - # data make the data NaN to return NaN ccc_sum - if debug >=2: - print 'Ensuring all template channels have matches in daylong data' - template_stachan=[] - for template in templates: - for tr in template: - template_stachan+=[(tr.stats.station, tr.stats.channel)] - template_stachan=list(set(template_stachan)) - # Copy this here to keep it safe - for stachan in template_stachan: - if not stream.select(station=stachan[0], channel=stachan[1]): - # Add a trace of NaN's - nulltrace=Trace() - nulltrace.stats.station=stachan[0] - nulltrace.stats.channel=stachan[1] - nulltrace.stats.sampling_rate=stream[0].stats.sampling_rate - nulltrace.stats.starttime=stream[0].stats.starttime - nulltrace.data=np.array([np.NaN]*len(stream[0].data), dtype=np.float32) - stream+=nulltrace - # Remove un-needed channels - for tr in stream: - if not (tr.stats.station, tr.stats.channel) in template_stachan: - stream.remove(tr) - # Also pad out templates to have all channels - for template in templates: - for stachan in template_stachan: - if not template.select(station=stachan[0], channel=stachan[1]): - nulltrace=Trace() - nulltrace.stats.station=stachan[0] - nulltrace.stats.channel=stachan[1] - nulltrace.stats.sampling_rate=template[0].stats.sampling_rate - nulltrace.stats.starttime=template[0].stats.starttime - nulltrace.data=np.array([np.NaN]*len(template[0].data), dtype=np.float32) - template+=nulltrace - - if debug >= 2: - print 'Starting the correlation run for this day' - if match_internal: - [cccsums, no_chans] = run_channel_loop(templates, stream, tempdir) - else: - [cccsums, no_chans]=_channel_loop(templates, stream, cores,\ - debug) - if len(cccsums[0])==0: - raise ValueError('Correlation has not run, zero length cccsum') - outtoc=time.clock() - print 'Looping over templates and streams took: '+str(outtoc-outtic)+' s' - if debug>=2: - print 'The shape of the returned cccsums is: '+str(np.shape(cccsums)) - print 'This is from '+str(len(templates))+' templates' - print 'Correlated with '+str(len(stream))+' channels of data' - i=0 - detections=[] - for cccsum in cccsums: - template=templates[i] - if threshold_type=='MAD': - rawthresh=threshold*np.median(np.abs(cccsum)) - elif threshold_type=='absolute': - rawthresh=threshold - elif threshold=='av_chan_corr': - rawthresh=threshold*(cccsum/len(template)) - else: - print 'You have not selected the correct threshold type, I will use MAD as I like it' - rawthresh=threshold*np.mean(np.abs(cccsum)) - # Findpeaks returns a list of tuples in the form [(cccsum, sample)] - print 'Threshold is set at: '+str(rawthresh) - print 'Max of data is: '+str(max(cccsum)) - print 'Mean of data is: '+str(np.mean(cccsum)) - if np.abs(np.mean(cccsum)) > 0.05: - warnings.warn('Mean is not zero! Check this!') - # Set up a trace object for the cccsum as this is easier to plot and - # maintins timing - if plotvar: - stream_plot=copy.deepcopy(stream[0]) - # Downsample for plotting - stream_plot.decimate(int(stream[0].stats.sampling_rate / 10)) - cccsum_plot=Trace(cccsum) - cccsum_plot.stats.sampling_rate=stream[0].stats.sampling_rate - # Resample here to maintain shape better - cccsum_hist=cccsum_plot.copy() - cccsum_hist=cccsum_hist.decimate(int(stream[0].stats.sampling_rate\ - / 10)).data - cccsum_plot=EQcorrscan_plotting.chunk_data(cccsum_plot, 10, 'Maxabs').data - # Enforce same length - stream_plot.data=stream_plot.data[0:len(cccsum_plot)] - cccsum_plot=cccsum_plot[0:len(stream_plot.data)] - cccsum_hist=cccsum_hist[0:len(stream_plot.data)] - EQcorrscan_plotting.triple_plot(cccsum_plot, cccsum_hist, stream_plot,\ - rawthresh, True,\ - plotdir+'/cccsum_plot_'+template_names[i]+'_'+\ - str(stream[0].stats.starttime.year)+'-'+\ - str(stream[0].stats.starttime.month)+'-'+\ - str(stream[0].stats.starttime.day)+'.'+\ - plot_format) - if debug >= 4: - print 'Saved the cccsum to: '+template_names[i]+\ - stream[0].stats.starttime.datetime.strftime('%Y%j') - np.save(template_names[i]+\ - stream[0].stats.starttime.datetime.strftime('%Y%j'),\ - cccsum) - tic=time.clock() - if debug>=4: - np.save('cccsum_'+str(i)+'.npy', cccsum) - if debug>=3 and max(cccsum)>rawthresh: - peaks=findpeaks.find_peaks2_short(cccsum, rawthresh, \ - trig_int*stream[0].stats.sampling_rate,\ - debug, stream[0].stats.starttime, - stream[0].stats.sampling_rate) - elif max(cccsum)>rawthresh: - peaks=findpeaks.find_peaks2_short(cccsum, rawthresh, \ - trig_int*stream[0].stats.sampling_rate,\ - debug) - else: - print 'No peaks found above threshold' - peaks=False - toc=time.clock() - if debug >= 1: - print 'Finding peaks took: '+str(toc-tic)+' s' - if peaks: - for peak in peaks: - detecttime=stream[0].stats.starttime+\ - peak[1]/stream[0].stats.sampling_rate - detections.append(DETECTION(template_names[i], - detecttime, - no_chans[i], peak[0], rawthresh, - 'corr')) - i+=1 - - return detections
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/pre_processing.html b/_modules/pre_processing.html deleted file mode 100644 index bbd025eb9..000000000 --- a/_modules/pre_processing.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - - - - - pre_processing — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for pre_processing

-#!/usr/bin/python
-"""
-Utilities module for the EQcorrscan package written by Calum Chamberlain of
-Victoria University Wlelington.  These functions are designed to do the basic
-processing of the data using obspy modules (which also rely on scipy and numpy).
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-
-from obspy import UTCDateTime
-from obspy.signal.filter import bandpass
-
-
[docs]def _check_daylong(tr): - """ - Function to check the data quality of the daylong file - check to see that - the day isn't just zeros, with large steps, if it is then the resampling will - hate it. - - :type tr: obspy.Trace - :param tr: Trace to check if the data are daylong. - - :return qual: bool - """ - import numpy as np - if len(tr.data)-len(np.nonzero(tr.data)) < 0.5*len(tr.data): - qual=False - else: - qual=True - return qual -
-
[docs]def shortproc(st, lowcut, highcut, filt_order, samp_rate, debug=0): - """ - Basic function to bandpass, downsample. Works in place - on data. This is employed to ensure all parts of the data are processed - in the same way. - - :type st: obspy.Stream - :param st: Stream to process - :type highcut: float - :param highcut: High cut for bandpass in Hz - :type lowcut: float - :param lowcut: Low cut for bandpass in Hz - :type filt_order: int - :param filt_order: Number of corners for bandpass filter - :type samp_rate: float - :param samp_rate: Sampling rate desired in Hz - :type debug: int - :param debug: Debug flag from 0-5, higher numbers = more output - - :return: obspy.Stream - - ..rubric:: Note - Will convert channel names to two charectars long - """ - # Add sanity check for filter - if highcut >= 0.5*samp_rate: - raise IOError('Highcut must be lower than the nyquist') - for tr in st: - if debug > 4: - tr.plot() - # Check data quality first - qual=_check_daylong(tr) - if not qual: - msg="Data have more zeros than actual data, please check the raw" +\ - "data set-up and manually sort it" - raise ValueError(msg) - # Check sampling rate and resample - if tr.stats.sampling_rate != samp_rate: - tr.resample(samp_rate) - - # Filtering section - tr=tr.detrend('simple') # Detrend data before filtering - tr.data=bandpass(tr.data, lowcut, highcut, - tr.stats.sampling_rate, filt_order, True) - # Convert to two charectar channel names - tr.stats.channel=tr.stats.channel[0]+tr.stats.channel[-1] - # Final visual check for debug - if debug > 4: - tr.plot() - return st -
-
[docs]def dayproc(tr, lowcut, highcut, filt_order, samp_rate, debug, starttime): - """ - Basic function to bandpass, downsample and check headers and length of trace - to ensure files start at the start of a day and are daylong. Works in place - on data. This is employed to ensure all parts of the data are processed - in the same way. - - :type tr: obspy.Trace - :param tr: Trace to process - :type highcut: float - :param highcut: High cut in Hz for bandpass - :type lowcut: float - :type lowcut: Low cut in Hz for bandpass - :type filt_order: int - :param filt_order: Corners for bandpass - :type samp_rate: float - :param samp_rate: Desired sampling rate in Hz - :type debug: int - :param debug: Debug output level from 0-5, higher numbers = more output - :type starttime: obspy.UTCDateTime - :param starttime: Desired start of trace - - :return: obspy.Stream - - ..rubric:: Note - Will convert channel names to two charectars long - """ - # Add sanity check - if highcut >= 0.5*samp_rate: - raise IOError('Highcut must be lower than the nyquist') - day=str(starttime.year)+str(starttime.month).zfill(2)+\ - str(starttime.day).zfill(2) - if debug>=2: - print 'Working on: '+tr.stats.station+'.'+tr.stats.channel - if debug >= 5: - tr.plot() - # Do a brute force quality check - qual=_check_daylong(tr) - if not qual: - msg="Data have more zeros than actual data, please check the raw" +\ - "data set-up and manually sort it" - raise ValueError(msg) - tr=tr.detrend('simple') # Detrend data before filtering - - # If there is one sample too many remove the first sample - this occurs - # at station FOZ where the first sample is zero when it shouldn't be, - # Not real sample generated during data download - if len(tr.data)==(86400*tr.stats.sampling_rate)+1: - tr.data=tr.data[1:len(tr.data)] - print 'I have '+str(len(tr.data))+' data points for '+tr.stats.station+'.'\ - +tr.stats.channel+' before processing' - - # Sanity check to ensure files are daylong - if float(tr.stats.npts/tr.stats.sampling_rate) != 86400.0: - if debug >= 2: - print 'Data for '+tr.stats.station+'.'+tr.stats.channel+\ - ' is not of daylong length, will zero pad' - # Work out when the trace thinks it is starting - Aaron's time headers - # are often wrong - traceday=UTCDateTime(str(tr.stats.starttime.year)+'-'+\ - str(tr.stats.starttime.month)+'-'+\ - str(tr.stats.starttime.day)) - # Use obspy's trim function with zero padding - tr=tr.trim(traceday,traceday+86400,pad=True,fill_value=0,\ - nearest_sample=True) - # If there is one sample too many after this remove the last one - # by convention - if len(tr.data)==(86400*tr.stats.sampling_rate)+1: - tr.data=tr.data[1:len(tr.data)] - if not tr.stats.sampling_rate*86400 == tr.stats.npts: - raise ValueError ('Data are not daylong for '+tr.stats.station+\ - '.'+tr.stats.channel) - - print 'I now have '+str(len(tr.data))+' data points after enforcing day length' - - # Check sampling rate and resample - if tr.stats.sampling_rate != samp_rate: - if debug>=2: - print 'Resampling' - tr.resample(samp_rate) - - - # Filtering section - tr=tr.detrend('simple') # Detrend data before filtering - if debug>=2: - print 'Bandpassing' - tr.data=bandpass(tr.data, lowcut, highcut, - tr.stats.sampling_rate, filt_order, True) - - # Account for two letter channel names in s-files and therefore templates - tr.stats.channel=tr.stats.channel[0]+tr.stats.channel[-1] - - # Sanity check the time header - if str(tr.stats.starttime.year)+str(tr.stats.starttime.month).zfill(2)+\ - str(tr.stats.starttime.day).zfill(2) != day: - if debug >= 2: - print "Time headers are wrong: "+str(tr.stats.starttime) - print "Correcting to: "+str(starttime) - tr.stats.starttime=starttime - - # Sanity check to ensure files are daylong - if float(tr.stats.npts/tr.stats.sampling_rate) != 86400.0: - if debug >= 2: - print 'Data for '+tr.stats.station+'.'+tr.stats.channel+\ - ' is not of daylong length, will zero pad' - # Work out when the trace thinks it is starting - Aaron's time headers - # are often wrong - traceday=UTCDateTime(str(tr.stats.starttime.year)+'-'+\ - str(tr.stats.starttime.month)+'-'+\ - str(tr.stats.starttime.day)) - # Use obspy's trim function with zero padding - tr=tr.trim(traceday,traceday+86400,pad=True,fill_value=0,\ - nearest_sample=True) - # If there is one sample too many after this remove the last one - # by convention - if len(tr.data)==(86400*tr.stats.sampling_rate)+1: - tr.data=tr.data[1:len(tr.data)] - if not tr.stats.sampling_rate*86400 == tr.stats.npts: - raise ValueError ('Data are not daylong for '+tr.stats.station+\ - '.'+tr.stats.channel) - # Final visual check for debug - if debug >= 4: - tr.plot() - return tr
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/stacking.html b/_modules/stacking.html deleted file mode 100644 index c3871748b..000000000 --- a/_modules/stacking.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - stacking — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for stacking

-#!/usr/bin/python
-"""
-Utility module of the EQcorrscan package to allow for different methods of
-stacking of seismic signal in one place.
-
-Calum Chamberlain 24/06/2015
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-
-import numpy as np
-
-
[docs]def linstack(streams): - """ - Function to compute the linear stack of a series of seismic streams of - multiplexed data - - :type streams: List of Streams - :param stream: List of streams to stack - - :returns: stack - Stream - """ - # import matplotlib.pyplot as plt - stack=streams[np.argmax([len(stream) for stream in streams])].copy() - for tr in stack: - tr.data=tr.data/np.sqrt(np.mean(np.square(tr.data))) - tr.data=np.nan_to_num(tr.data) - for i in range(1,len(streams)): - # print "Stacking stream "+str(i) - for tr in stack: - # print tr.stats.station+'.'+tr.stats.channel - matchtr=streams[i].select(station=tr.stats.station,\ - channel=tr.stats.channel) - if matchtr: - norm=matchtr[0].data/np.sqrt(np.mean(np.square(matchtr[0].data))) - norm=np.nan_to_num(norm) - tr.data=np.sum((norm,\ - tr.data), axis=0) - return stack -
-
[docs]def PWS_stack(streams, weight=2): - """ - Function to compute the phase weighted stack of a series of streams. - Recommend aligning the traces before stacking. - - :type streams: list of obspy.Stream - :param streams: List of Stream to stack - :type weight: float - :param weight: Exponent to the phase stack used for weighting. - - :return: obspy.Stream - """ - from scipy.signal import hilbert - # First get the linear stack which we will weight by the phase stack - Linstack=linstack(streams) - # Compute the instantaneous phase - instaphases=[] - print "Computing instantaneous phase" - for stream in streams: - instaphase=stream.copy() - for tr in instaphase: - analytic=hilbert(tr.data) - envelope=np.sqrt(np.sum((np.square(analytic),\ - np.square(tr.data)), axis=0)) - tr.data=analytic/envelope - instaphases.append(instaphase) - # Compute the phase stack - print "Computing the phase stack" - Phasestack=linstack(instaphases) - # print type(Phasestack) - # Compute the phase-weighted stack - for tr in Phasestack: - tr.data=Linstack.select(station=tr.stats.station)[0].data*\ - np.abs(tr.data**weight) - return Phasestack -
-
[docs]def align_traces(trace_list, shift_len, master=False): - """ - Function to allign traces relative to each other based on their - cross-correlation value - - :type trace_list: List of Traces - :param trace_list: List of traces to allign - :type shift_len: int - :param shift_len: Length to allow shifting within in samples - :type master: obspy.Trace - :param master: Master trace to align to, if set to False will align to the\ - largest amplitude trace (default) - - :returns: list of shifts for best allignment in seconds - """ - from obspy.signal.cross_correlation import xcorr - from copy import deepcopy - traces=deepcopy(trace_list) - if not master: - # Use trace with largest MAD amplitude as master - master=traces[0] - MAD_master=np.median(np.abs(master.data)) - master_no=0 - for i in xrange(1,len(traces)): - if np.median(np.abs(traces[i])) > MAD_master: - master=traces[i] - MAD_master=np.median(np.abs(master.data)) - master_no=i - else: - print 'Using master given by user' - shifts=[] - ccs=[] - for i in range(len(traces)): - if not master.stats.sampling_rate == traces[i].stats.sampling_rate: - raise ValueError('Sampling rates not the same') - shift, cc=xcorr(master, traces[i], shift_len) - shifts.append(shift/master.stats.sampling_rate) - ccs.append(cc) - return shifts, ccs
-
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_modules/template_gen.html b/_modules/template_gen.html deleted file mode 100644 index 232d802cf..000000000 --- a/_modules/template_gen.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - template_gen — EQcorrscan 0.0.8 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - -
-
-
- -
-
-
- -

Source code for template_gen

-#!/usr/bin/python
-"""
-Function to generate template waveforms and information to go with them for the\
-application of cross-correlation of seismic data for the detection of repeating\
-events.
-
-Part of the EQcorrscan module to read nordic format s-files\
-EQcorrscan is a python module designed to run match filter routines for\
-seismology, within it are routines for integration to seisan and obspy.\
-With obspy integration (which is necessary) all main waveform formats can be\
-read in and output.
-
-This main section contains a script, LFE_search.py which demonstrates the usage\
-of the built in functions from template generation from picked waveforms\
-through detection by match filter of continuous data to the generation of lag\
-times to be used for relative locations.
-
-The match-filter routine described here was used a previous Matlab code for the\
-Chamberlain et al. 2014 G-cubed publication.  The basis for the lag-time\
-generation section is outlined in Hardebeck & Shelly 2011, GRL.
-
-Code generated by Calum John Chamberlain of Victoria University of Wellington,\
-2015.
-
-
-.. rubric:: Note
-Pre-requisites:
-    - gcc             - for the installation of the openCV correlation routine
-    - python-cv2      - Python bindings for the openCV routines
-    - python-joblib   - used for parallel processing
-    - python-obspy    - used for lots of common seismological processing
-                        - requires:
-                            - numpy
-                            - scipy
-                            - matplotlib
-    - NonLinLoc       - used outside of all codes for travel-time generation
-
-Copyright 2015 Calum Chamberlain
-
-This file is part of EQcorrscan.
-
-    EQcorrscan is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    EQcorrscan is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with EQcorrscan.  If not, see <http://www.gnu.org/licenses/>.
-
-"""
-
-
[docs]def from_sfile(sfile, lowcut, highcut, samp_rate, filt_order, length, swin,\ - debug=0): - """ - Function to read in picks from sfile then generate the template from the - picks within this and the wavefile found in the pick file. - - :type sfile: string - :param sfile: sfilename must be the\ - path to a seisan nordic type s-file containing waveform and pick\ - information. - :type lowcut: float - :param lowcut: Low cut (Hz), if set to None will look in template\ - defaults file - :type highcut: float - :param lowcut: High cut (Hz), if set to None will look in template\ - defaults file - :type samp_rate: float - :param samp_rate: New sampling rate in Hz, if set to None will look in\ - template defaults file - :type filt_order: int - :param filt_order: Filter level, if set to None will look in\ - template defaults file - :type swin: str - :param swin: Either 'all', 'P' or 'S', to select which phases to output. - :type length: float - :param length: Extract length in seconds, if None will look in template\ - defaults file. - :type debug: int - :param debug: Debug level, higher number=more output. - """ - # Perform some checks first - import os - import sys - if not os.path.isfile(sfile): - raise IOError('sfile does not exist') - - from eqcorrscan.utils import Sfile_util - # Read in the header of the sfile - wavefiles=Sfile_util.readwavename(sfile) - pathparts=sfile.split('/')[0:len(sfile.split('/'))-1] - wavpath='' - for part in pathparts: - if part == 'REA': - part='WAV' - wavpath+=part+'/' - from obspy import read as obsread - from eqcorrscan.utils import pre_processing - # Read in waveform file - for wavefile in wavefiles: - print "I am going to read waveform data from: "+wavpath+wavefile - if 'st' in locals(): - st+=obsread(wavpath+wavefile) - else: - st=obsread(wavpath+wavefile) - for tr in st: - if tr.stats.sampling_rate < samp_rate: - print 'Sampling rate of data is lower than sampling rate asked for' - print 'As this is not good practice for correlations I will not do this' - raise ValueError("Trace: "+tr.stats.station+" sampling rate: "+\ - str(tr.stats.sampling_rate)) - # Read in pick info - picks=Sfile_util.readpicks(sfile) - print "I have found the following picks" - for pick in picks: - print pick.station+' '+pick.channel+' '+pick.phase+' '+str(pick.time) - - # Process waveform data - st=pre_processing.shortproc(st, lowcut, highcut, filt_order,\ - samp_rate, debug) - st1=_template_gen(picks, st, length, swin) - return st1 -
-
[docs]def from_contbase(sfile, contbase_list, lowcut, highcut, samp_rate, filt_order,\ - length, prepick, swin, debug=0): - """ - Function to read in picks from sfile then generate the template from the - picks within this and the wavefiles from the continous database of day-long - files. Included is a section to sanity check that the files are daylong and - that they start at the start of the day. You should ensure this is the case - otherwise this may alter your data if your data are daylong but the headers - are incorrectly set. - - :type sfile: string - :param sfile: sfilename must be the path to a seisan nordic type s-file \ - containing waveform and pick information, all other arguments can \ - be numbers save for swin which must be either P, S or all \ - (case-sensitive). - :type contbase_list: List of tuple of string - :param contbase_list: List of tuples of the form ['path', 'type', 'network']\ - Where path is the path to the continuous database, type is\ - the directory structure, which can be either Yyyyy/Rjjj.01,\ - which is the standard IRIS Year, julian day structure, or,\ - yyyymmdd which is a single directory for every day. - :type lowcut: float - :param lowcut: Low cut (Hz), if set to None will look in template\ - defaults file - :type highcut: float - :param lowcut: High cut (Hz), if set to None will look in template\ - defaults file - :type samp_rate: float - :param samp_rate: New sampling rate in Hz, if set to None will look in\ - template defaults file - :type filt_order: int - :param filt_order: Filter level, if set to None will look in\ - template defaults file - :type length: float - :param length: Extract length in seconds, if None will look in template\ - defaults file. - :type prepick: float - :param prepick: Pre-pick time in seconds - :type swin: str - :param swin: Either 'all', 'P' or 'S', to select which phases to output. - :type debug: int - :param debug: Level of debugging output, higher=more - """ - # Perform some checks first - import os, sys - if not os.path.isfile(sfile): - raise IOError('sfile does not exist') - - # import some things - from eqcorrscan.utils import Sfile_util - from eqcorrscan.utils import pre_processing - import glob - from obspy import UTCDateTime - - # Read in the header of the sfile - header=Sfile_util.readheader(sfile) - day=UTCDateTime(str(header.time.year)+'-'+str(header.time.month).zfill(2)+\ - '-'+str(header.time.day).zfill(2)) - - # Read in pick info - picks=Sfile_util.readpicks(sfile) - print "I have found the following picks" - pick_chans=[] - used_picks=[] - for pick in picks: - if not pick.station+pick.channel in pick_chans and pick.phase in ['P','S']: - pick_chans.append(pick.station+pick.channel) - used_picks.append(pick) - print pick - for contbase in contbase_list: - if contbase[1] == 'yyyy/mm/dd': - daydir=str(day.year)+'/'+str(day.month).zfill(2)+'/'+\ - str(day.day).zfill(2) - elif contbase[1]=='Yyyyy/Rjjj.01': - daydir='Y'+str(day.year)+'/R'+str(day.julday).zfill(3)+'.01' - elif contbase[1]=='yyyymmdd': - daydir=str(day.year)+str(day.month).zfill(2)+str(day.day).zfill(2) - if 'wavefiles' in locals(): - wavefiles+=glob.glob(contbase[0]+'/'+daydir+'/*'+pick.station+\ - '.*') - else: - wavefiles=(glob.glob(contbase[0]+'/'+daydir+'/*'+pick.station+\ - '.*')) - elif pick.phase in ['P','S']: - print 'Duplicate pick '+pick.station+' '+pick.channel+' '+pick.phase+\ - ' '+str(pick.time) - elif pick.phase =='IAML': - print 'Amplitude pick '+pick.station+' '+pick.channel+' '+pick.phase+\ - ' '+str(pick.time) - picks=used_picks - wavefiles=list(set(wavefiles)) - - # Read in waveform file - from obspy import read as obsread - wavefiles.sort() - for wavefile in wavefiles: - print "I am going to read waveform data from: "+wavefile - if 'st' in locals(): - st+=obsread(wavefile) - else: - st=obsread(wavefile) - # Porcess waveform data - st.merge(fill_value='interpolate') - for tr in st: - tr=pre_processing.dayproc(tr, lowcut, highcut, filt_order,\ - samp_rate, debug, day) - # Cut and extract the templates - st1=_template_gen(picks, st, length, swin, prepick=prepick) - return st1 -
-
[docs]def _template_gen(picks, st, length, swin, prepick=0.05, plot=False): - """ - Function to generate a cut template in the obspy - Stream class from a given set of picks and data, also in an obspy stream - class. Should be given pre-processed data (downsampled and filtered) - - :type picks: :class: 'makesfile.pick' - :param picks: Picks to extract data around - :type st: :class: 'obspy.Stream' - :param st: Stream to etract templates from - :type length: float - :param length: Length of template in seconds - :type swin: string - :param swin: P, S or all - :type prepick: float - :param prepick: Length in seconds to extract before the pick time\ - default is 0.05 seconds - :type plot: bool - :param plot: To plot the template or not, default is True - """ - from eqcorrscan.utils.Sfile_util import PICK - from eqcorrscan.utils.EQcorrscan_plotting import pretty_template_plot as tplot - from obspy import Stream - import copy, warnings - stations=[] - channels=[] - st_stachans=[] - for pick in picks: - stations.append(pick.station) - channels.append(pick.channel) - for tr in st: - st_stachans.append(tr.stats.station+'.'+tr.stats.channel) - for i in xrange(len(stations)): - if not stations[i]+'.'+channels[i] in st_stachans: - warnings.warn('No data provided for '+stations[i]+'.'+channels[i]) - # Select which channels we actually have picks for - for tr in st: - if tr.stats.station in stations: - if swin=='all': - if len(tr.stats.channel)==3: - temp_channel=tr.stats.channel[0]+tr.stats.channel[2] - elif len(tr.stats.channel)==2: - temp_channel=tr.stats.channel - # if temp_channel in channels: - tr.stats.channel=temp_channel - if 'st1' in locals(): - st1+=tr - else: - st1=Stream(tr) - else: - if 'st1' in locals(): - st1+=tr - else: - st1=Stream(tr) - st=copy.deepcopy(st1) - del st1 - if plot: - stplot=st.copy() - from obspy.core.trace import Trace - # Cut the data - for tr in st: - if 'starttime' in locals(): - del starttime - if swin=='all': - for pick in picks: - if pick.station==tr.stats.station and \ - pick.channel==tr.stats.channel and\ - pick.phase=='P': - starttime=pick.time-prepick - elif pick.station==tr.stats.station and\ - tr.stats.channel[-1] in ['1','2','N','E'] and\ - pick.phase=='S': - starttime=pick.time-prepick - else: - for pick in picks: - if pick.station==tr.stats.station and pick.phase==swin: - starttime=pick.time-prepick - if 'starttime' in locals(): - print "Cutting "+tr.stats.station+'.'+tr.stats.channel - tr.trim(starttime=starttime,endtime=starttime+length, nearest_sample=False) - print tr.stats.starttime - print tr.stats.endtime - if 'st1' in locals(): - st1+=tr - else: - st1=Stream(tr) - else: - print 'No pick for '+tr.stats.station+'.'+tr.stats.channel - # Ensure that the template is the correct length - if len(tr.data) == (tr.stats.sampling_rate*length)+1: - tr.data=tr.data[0:-1] - if plot: - tplot(st1, background=stplot.trim(st1.sort(['starttime'])[0].stats.starttime-10,\ - st1.sort(['starttime'])[-1].stats.endtime+10)) - del stplot - del st - # st1.plot(size=(800,600)) - return st1 -
-
[docs]def extract_from_stack(stack, template, length, pre_pick, pre_pad, Z_include=False,\ - pre_processed=True, samp_rate=False,\ - lowcut=False, highcut=False, filt_order=False): - """ - Function to extract a new template from a stack of previous detections. - Requires the stack, the template used to make the detections for the stack, - and we need to know if the stack has been pre-processed. - - :type stack: :class:obspy.Stream - :param stack: Waveform stack from detections. Can be of any length and can\ - have delays already included, or not. - :type template: :class:obspy.Stream - :param template: Template used to make the detections in the stack. Will use\ - the delays of this for the new template. - :type length: float - :param length: Length of new template in seconds - :type pre_pick: float - :param pre_pick: Extract additional data before the detection, seconds - :type pre_pad: float - :param pre_pad: Pad used in seconds when extracting the data, e.g. the time\ - before the detection extracted. If using clustering.extract_detections\ - this half the length of the extracted waveform. - :type Z_include: bool - :param Z_include: If True will include any Z-channels even if there is no\ - template for this channel, as long as there is a template for this station\ - at a different channel. If this is False and Z channels are included in\ - the template Z channels will be included in the new_template any-way. - :type pre_processed: bool - :param pre_processed: Have the data been pre-processed, if True (default)\ - then we will only cut the data here. - :type samp_rate: float - :param samp_rate: If pre_processed=False then this is required, desired\ - sampling rate in Hz, defaults to False. - :type lowcut: float - :param lowcut: If pre_processed=False then this is required, lowcut in Hz,\ - defaults to False - :type highcut: float - :param highcut: If pre_processed=False then this is required, highcut in Hz,\ - defaults to False - :type filt_order: int - :param filt_order: If pre_processed=False then this is required, filter\ - order, defaults to False - - :returns: :class:obspy.Stream Newly cut template - """ - from eqcorrscan.utils import pre_processing - import warnings - new_template=stack.copy() # Copy the data before we trim it to keep the stack safe - # Get the earliest time in the template as this is when the detection is - # taken. - mintime = min([tr.stats.starttime for tr in template]) - # Generate a list of tuples of (station, channel, delay) with delay in seconds - delays=[(tr.stats.station, tr.stats.channel[-1], mintime-tr.stats.starttime)\ - for tr in template] - # Loop through the stack and trim! - for tr in new_template: - # Process the data if necessary - if not pre_processed: - new_template=pre_processing.shortproc(new_template, lowcut, highcut,\ - filt_order, samp_rate, 0) - # Find the matching delay - delay=[d[2] for d in delays if d[0]==tr.stats.station and\ - d[1]==tr.stats.channel[-1]] - if Z_include and len(delay) == 0: - delay=[d[2] for d in delays if d[0]==tr.stats.station] - if len(delay)==0: - warnings.warn('No matching template channel found for stack '+\ - 'channel '+tr.stats.station+' '+tr.stats.channel) - new_template.remove(tr) - elif len(delay) > 1: - warnings.warn('Multiple delays found for stack channel '+\ - tr.stats.station+' '+tr.stats.channel) - else: - tr.trim(starttime=tr.stats.starttime + delay[0] + pre_pad - pre_pick,\ - endtime=tr.stats.starttime + delay[0] + pre_pad + length - pre_pick) - return new_template -
-if __name__=='__main__': - import sys, os - if len(sys.argv) != 2: - print 'Requires 1 arguments: sfilename' - sys.exit() - else: - sfile=str(sys.argv[1]) - template=from_sfile(sfile) - from obspy import read - template.write(sfile+'_template.ms', format="MSEED") -
- -
-
- - -
- -
-

- © Copyright 2015, Calum John Chamberlain. -

-
- - Built with Sphinx using a theme provided by Read the Docs. - -
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_plugins/markdown.rb b/_plugins/markdown.rb new file mode 100644 index 000000000..727bf4027 --- /dev/null +++ b/_plugins/markdown.rb @@ -0,0 +1,23 @@ +=begin + Jekyll tag to include Markdown text from _includes directory preprocessing with Liquid. + Usage: + {% markdown %} + Dependency: + - kramdown +=end +module Jekyll + class MarkdownTag < Liquid::Tag + def initialize(tag_name, text, tokens) + super + @text = text.strip + end + require "kramdown" + def render(context) + tmpl = File.read File.join Dir.pwd, "_includes", @text + site = context.registers[:site] + tmpl = (Liquid::Template.parse tmpl).render site.site_payload + html = Kramdown::Document.new(tmpl).to_html + end + end +end +Liquid::Template.register_tag('markdown', Jekyll::MarkdownTag) diff --git a/_posts/2015-11-20-jekyll-migration.md b/_posts/2015-11-20-jekyll-migration.md new file mode 100644 index 000000000..b133ed944 --- /dev/null +++ b/_posts/2015-11-20-jekyll-migration.md @@ -0,0 +1,16 @@ +--- +layout: post +title: "Jekyll Migration" +date: 2015-11-20 22:58:00 +categories: updates +--- +We have migrated our front-page to a jekyll page, rather than directing you +straight to our API docs (which can now be found +[here](http://eqcorrscan.readthedocs.org/en/latest/?badge=latest)). Hopefully +this page will end up being a place for the developers to update you on +EQcorrscan's progress, what we aim to do, and mostly more textual content +than the real API docs. + +You can always find the code on github however: + +[EQcorrscan-gh]: https://github.com/calum-chamberlain/EQcorrscan diff --git a/_sass/_base.scss b/_sass/_base.scss new file mode 100644 index 000000000..518bf2b0e --- /dev/null +++ b/_sass/_base.scss @@ -0,0 +1,204 @@ +/** + * Reset some basic elements + */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; +} + + + +/** + * Basic styling + */ +body { + font-family: $base-font-family; + font-size: $base-font-size; + line-height: $base-line-height; + font-weight: 300; + color: $text-color; + background-color: $background-color; + -webkit-text-size-adjust: 100%; +} + + + +/** + * Set `margin-bottom` to maintain vertical rhythm + */ +h1, h2, h3, h4, h5, h6, +p, blockquote, pre, +ul, ol, dl, figure, +%vertical-rhythm { + margin-bottom: $spacing-unit / 2; +} + + + +/** + * Images + */ +img { + max-width: 100%; + vertical-align: middle; +} + + + +/** + * Figures + */ +figure > img { + display: block; +} + +figcaption { + font-size: $small-font-size; +} + + + +/** + * Lists + */ +ul, ol { + margin-left: $spacing-unit; +} + +li { + > ul, + > ol { + margin-bottom: 0; + } +} + + + +/** + * Headings + */ +h1, h2, h3, h4, h5, h6 { + font-weight: 300; +} + + + +/** + * Links + */ +a { + color: $brand-color; + text-decoration: none; + + &:visited { + color: darken($brand-color, 15%); + } + + &:hover { + color: $text-color; + text-decoration: underline; + } +} + + + +/** + * Blockquotes + */ +blockquote { + color: $grey-color; + border-left: 4px solid $grey-color-light; + padding-left: $spacing-unit / 2; + font-size: 18px; + letter-spacing: -1px; + font-style: italic; + + > :last-child { + margin-bottom: 0; + } +} + + + +/** + * Code formatting + */ +pre, +code { + font-size: 15px; + border: 1px solid $grey-color-light; + border-radius: 3px; + background-color: #eef; +} + +code { + padding: 1px 5px; +} + +pre { + padding: 8px 12px; + overflow-x: scroll; + + > code { + border: 0; + padding-right: 0; + padding-left: 0; + } +} + + + +/** + * Wrapper + */ +.wrapper { + max-width: -webkit-calc(800px - (#{$spacing-unit} * 2)); + max-width: calc(800px - (#{$spacing-unit} * 2)); + margin-right: auto; + margin-left: auto; + padding-right: $spacing-unit; + padding-left: $spacing-unit; + @extend %clearfix; + + @include media-query($on-laptop) { + max-width: -webkit-calc(800px - (#{$spacing-unit})); + max-width: calc(800px - (#{$spacing-unit})); + padding-right: $spacing-unit / 2; + padding-left: $spacing-unit / 2; + } +} + + + +/** + * Clearfix + */ +%clearfix { + + &:after { + content: ""; + display: table; + clear: both; + } +} + + + +/** + * Icons + */ +.icon { + + > svg { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + + path { + fill: $grey-color; + } + } +} diff --git a/_sass/_layout.scss b/_sass/_layout.scss new file mode 100644 index 000000000..def56f896 --- /dev/null +++ b/_sass/_layout.scss @@ -0,0 +1,236 @@ +/** + * Site header + */ +.site-header { + border-top: 5px solid $grey-color-dark; + border-bottom: 1px solid $grey-color-light; + min-height: 56px; + + // Positioning context for the mobile navigation icon + position: relative; +} + +.site-title { + font-size: 26px; + line-height: 56px; + letter-spacing: -1px; + margin-bottom: 0; + float: left; + + &, + &:visited { + color: $grey-color-dark; + } +} + +.site-nav { + float: right; + line-height: 56px; + + .menu-icon { + display: none; + } + + .page-link { + color: $text-color; + line-height: $base-line-height; + + // Gaps between nav items, but not on the first one + &:not(:first-child) { + margin-left: 20px; + } + } + + @include media-query($on-palm) { + position: absolute; + top: 9px; + right: 30px; + background-color: $background-color; + border: 1px solid $grey-color-light; + border-radius: 5px; + text-align: right; + + .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; + + > svg { + width: 18px; + height: 15px; + + path { + fill: $grey-color-dark; + } + } + } + + .trigger { + clear: both; + display: none; + } + + &:hover .trigger { + display: block; + padding-bottom: 5px; + } + + .page-link { + display: block; + padding: 5px 10px; + } + } +} + + + +/** + * Site footer + */ +.site-footer { + border-top: 1px solid $grey-color-light; + padding: $spacing-unit 0; +} + +.footer-heading { + font-size: 18px; + margin-bottom: $spacing-unit / 2; +} + +.contact-list, +.social-media-list { + list-style: none; + margin-left: 0; +} + +.footer-col-wrapper { + font-size: 15px; + color: $grey-color; + margin-left: -$spacing-unit / 2; + @extend %clearfix; +} + +.footer-col { + float: left; + margin-bottom: $spacing-unit / 2; + padding-left: $spacing-unit / 2; +} + +.footer-col-1 { + width: -webkit-calc(35% - (#{$spacing-unit} / 2)); + width: calc(35% - (#{$spacing-unit} / 2)); +} + +.footer-col-2 { + width: -webkit-calc(20% - (#{$spacing-unit} / 2)); + width: calc(20% - (#{$spacing-unit} / 2)); +} + +.footer-col-3 { + width: -webkit-calc(45% - (#{$spacing-unit} / 2)); + width: calc(45% - (#{$spacing-unit} / 2)); +} + +@include media-query($on-laptop) { + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (#{$spacing-unit} / 2)); + width: calc(50% - (#{$spacing-unit} / 2)); + } + + .footer-col-3 { + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + +@include media-query($on-palm) { + .footer-col { + float: none; + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + + + +/** + * Page content + */ +.page-content { + padding: $spacing-unit 0; +} + +.page-heading { + font-size: 20px; +} + +.post-list { + margin-left: 0; + list-style: none; + + > li { + margin-bottom: $spacing-unit; + } +} + +.post-meta { + font-size: $small-font-size; + color: $grey-color; +} + +.post-link { + display: block; + font-size: 24px; +} + + + +/** + * Posts + */ +.post-header { + margin-bottom: $spacing-unit; +} + +.post-title { + font-size: 42px; + letter-spacing: -1px; + line-height: 1; + + @include media-query($on-laptop) { + font-size: 36px; + } +} + +.post-content { + margin-bottom: $spacing-unit; + + h2 { + font-size: 32px; + + @include media-query($on-laptop) { + font-size: 28px; + } + } + + h3 { + font-size: 26px; + + @include media-query($on-laptop) { + font-size: 22px; + } + } + + h4 { + font-size: 20px; + + @include media-query($on-laptop) { + font-size: 18px; + } + } +} diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss new file mode 100644 index 000000000..e36627da7 --- /dev/null +++ b/_sass/_syntax-highlighting.scss @@ -0,0 +1,67 @@ +/** + * Syntax highlighting styles + */ +.highlight { + background: #fff; + @extend %vertical-rhythm; + + .c { color: #998; font-style: italic } // Comment + .err { color: #a61717; background-color: #e3d2d2 } // Error + .k { font-weight: bold } // Keyword + .o { font-weight: bold } // Operator + .cm { color: #998; font-style: italic } // Comment.Multiline + .cp { color: #999; font-weight: bold } // Comment.Preproc + .c1 { color: #998; font-style: italic } // Comment.Single + .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special + .gd { color: #000; background-color: #fdd } // Generic.Deleted + .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific + .ge { font-style: italic } // Generic.Emph + .gr { color: #a00 } // Generic.Error + .gh { color: #999 } // Generic.Heading + .gi { color: #000; background-color: #dfd } // Generic.Inserted + .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific + .go { color: #888 } // Generic.Output + .gp { color: #555 } // Generic.Prompt + .gs { font-weight: bold } // Generic.Strong + .gu { color: #aaa } // Generic.Subheading + .gt { color: #a00 } // Generic.Traceback + .kc { font-weight: bold } // Keyword.Constant + .kd { font-weight: bold } // Keyword.Declaration + .kp { font-weight: bold } // Keyword.Pseudo + .kr { font-weight: bold } // Keyword.Reserved + .kt { color: #458; font-weight: bold } // Keyword.Type + .m { color: #099 } // Literal.Number + .s { color: #d14 } // Literal.String + .na { color: #008080 } // Name.Attribute + .nb { color: #0086B3 } // Name.Builtin + .nc { color: #458; font-weight: bold } // Name.Class + .no { color: #008080 } // Name.Constant + .ni { color: #800080 } // Name.Entity + .ne { color: #900; font-weight: bold } // Name.Exception + .nf { color: #900; font-weight: bold } // Name.Function + .nn { color: #555 } // Name.Namespace + .nt { color: #000080 } // Name.Tag + .nv { color: #008080 } // Name.Variable + .ow { font-weight: bold } // Operator.Word + .w { color: #bbb } // Text.Whitespace + .mf { color: #099 } // Literal.Number.Float + .mh { color: #099 } // Literal.Number.Hex + .mi { color: #099 } // Literal.Number.Integer + .mo { color: #099 } // Literal.Number.Oct + .sb { color: #d14 } // Literal.String.Backtick + .sc { color: #d14 } // Literal.String.Char + .sd { color: #d14 } // Literal.String.Doc + .s2 { color: #d14 } // Literal.String.Double + .se { color: #d14 } // Literal.String.Escape + .sh { color: #d14 } // Literal.String.Heredoc + .si { color: #d14 } // Literal.String.Interpol + .sx { color: #d14 } // Literal.String.Other + .sr { color: #009926 } // Literal.String.Regex + .s1 { color: #d14 } // Literal.String.Single + .ss { color: #990073 } // Literal.String.Symbol + .bp { color: #999 } // Name.Builtin.Pseudo + .vc { color: #008080 } // Name.Variable.Class + .vg { color: #008080 } // Name.Variable.Global + .vi { color: #008080 } // Name.Variable.Instance + .il { color: #099 } // Literal.Number.Integer.Long +} diff --git a/_sources/core.txt b/_sources/core.txt deleted file mode 100644 index f30f70fa4..000000000 --- a/_sources/core.txt +++ /dev/null @@ -1,12 +0,0 @@ -Core -==== - -Core programs for the EQcorrscan project. - -.. toctree:: - :maxdepth: 4 - - submodules/core.bright_lights - submodules/core.template_gen - submodules/core.match_filter - submodules/core.lag_calc diff --git a/_sources/index.txt b/_sources/index.txt deleted file mode 100644 index 64feb1c10..000000000 --- a/_sources/index.txt +++ /dev/null @@ -1,57 +0,0 @@ -.. EQcorrscan documentation master file, created by - sphinx-quickstart on Mon Mar 23 21:20:41 2015. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to EQcorrscan's documentation -===================================== - -.. image:: EQcorrscan_logo.png - :width: 300px - :align: left - :alt: EQcorrscan_logo.png - :target: https://github.com/calum-chamberlain/EQcorrscan/releases - -EQcorrscan ----------- - -A python package to conduct match-filter earthquake detections. Codes are stored -on github, the bleeding edge master is `here `_, or the latest stable(ish) release -can be found `here `_ - -This package contains routines to enable the user to conduct match-filter earthquake -detections using `Obspy `_ bindings when reading -and writing seismic data, and the correlation routine in `openCV `_. -Neither of these packages are installed by this software, due to a range of -licences being implimented. However, both are open-source and should be installed -before using this package. This package was written to impliment the matlab routines -used by Chamberlain et al. (2014) for the detection of low-frequency earthquakes. - -Also within this package are: - -* Clustering routines for seismic data; -* Peak finding algorithm (basic); -* Automatic amplitude picker for local magnitude scale; -* `Seisan `_ S-file integration for database management and routine earthquake location; -* Stacking routines including phase-weighted stacking based on Thurber at al. (2014); -* Brightness based template creation based on the work of Frank et al. (2014) - -This package is written by Calum Chamberlain of Victoria University of Wellington, and -is distributed under the LGPL GNU Licence, Copyright Calum Chamberlain 2015. - -References ----------- -* CJ Chamberlain, DR Shelly, J Townend, TA Stern (2014) `Low‐frequency earthquakes reveal punctuated slow slip on the deep extent of the Alpine Fault, New Zealand `_, *G-cubed*, doi:10.1002/2014GC005436 -* Thurber, C. H., Zeng, X., Thomas, A. M., & Audet, P. (2014). `Phase‐Weighted Stacking Applied to Low‐Frequency Earthquakes `_, *BSSA*, doi:10.1785/0120140077. -* Frank, W. B., & Shapiro, N. M. (2014). `Automatic detection of low-frequency earthquakes (LFEs) based on a beamformed network response `_, *Geophysical Journal International*, 197(2), 1215-1223, doi:10.1093/gji/ggu058. - -Contents: ---------- - -.. toctree:: - :maxdepth: 4 - - intro - tutorial - core - utils diff --git a/_sources/intro.txt b/_sources/intro.txt deleted file mode 100644 index 1dce0aa47..000000000 --- a/_sources/intro.txt +++ /dev/null @@ -1,75 +0,0 @@ -Introduction to the EQcorrscan package -====================================== - -This document is designed to give you an overview of the capabilities and -implementation of the EQcorrscan python module. - -Why EQcorrscan? ---------------- -EQcorrscan is designed to compute matched-filter detections of earthquakes, -or any seismic signal (explosions work *really* well) by comparing templates -with continuous data. The main benefit of EQcorrscan is the level of -parallelisation that can be achieved. By exploiting the fact that each template -does not rely on any other template, detections from a single template through -a day of seismic data can be computed in parallel. By computing these in parallel -rather than a single template through multiple days we reduce IO load. At a low -level, each time-step is computed in parallel by using the openCV matchTemplate -function. The net result is that these functions are *very* scalable, we have -obtained a speed-up from 2 months to 10 hours by migrating from a small cluster -to a large one (for a 6.5 year long continuous dataset and 800 templates). - -Installation ------------- -A fresh install should be as simple as: - -**pip install eqcorrscan** - -Most codes should work without any effort on your part. However you may need to -install the openCV-python package yourself. - -This install has only been tested on Linux and OSX machines. You -should be prepared for small differences in the results of your correlations -relating to foating-point truncation differences between 32 and 64-Bit -machines. - -If you plan to run the bright_lights.py routines you will need to have -NonLinLoc installed on your machine. This is not provided here and should -be sourced from `NonLinLoc `_ This will provide -the Grid2Time routine which is required to set-up a lag-time grid for your -velocity model. You should read the NonLinLoc documentation for more -information regarding how this process works and the input files you are -required to give. - -Functions ---------- - -This package is divided into sub-directories of *core* and *utils*. The -*utils* directory contains simple functions for integration with -`seisan `_, these are in the *Sfile_util.py* -module and functions therein which are essentially barebones and do not have the -full functionality that seisan can handle. *utils* also contains a simple -peak-finding algorithm *find_peaks.py* which looks for peaks within noisy data -above a certain threshold and within windows. Many other functions have been -added to this module to handle the analysis of repeating and near-repeating -earthquakes, including stacking routines, clustering algorithms, magnitude -calculation both by amplitude picking and by singular value decomposition. I -recommend you take a look in here to see if any of it is useful. There are also -some plotting routines that make handling large datasets a little simpler. Most -recently I have added a simple synthetic seismogram generator, which is currently -my main project focus. - -Since earlier versions the *core* modules have moved away from using parameter -files, and instead rely on explicit argument calls. The parameter files are -still included by not documented here (see inside the par files), and remain -useful when generating batch scripts (see the scripts in the github repo). - -Within *core* you will find the core routines to generate templates, -*(template_gen)* search for likely templates *(bright_lights)* and -compute cross-channel correlations from these templates *(match_filter)*. The -bright_lights and match_filter submodules have been designed with parallel -computing in mind, to the extent that the more cores and machines you have -running them the better. These rely on the python multiprocesisng module to -handle parallelisation at lower-levels. You can also do some 'brute-force' -parallelisation on a day level when computing detections over multiple days. -I tend to run one day per node of a cluster computer, with each day running -templates in parallel. diff --git a/_sources/submodules/core.bright_lights.txt b/_sources/submodules/core.bright_lights.txt deleted file mode 100644 index 1863ff07b..000000000 --- a/_sources/submodules/core.bright_lights.txt +++ /dev/null @@ -1,5 +0,0 @@ -bright_lights -------------- -.. automodule:: bright_lights - :members: - :private-members: diff --git a/_sources/submodules/core.lag_calc.txt b/_sources/submodules/core.lag_calc.txt deleted file mode 100644 index 71e3b3b6b..000000000 --- a/_sources/submodules/core.lag_calc.txt +++ /dev/null @@ -1,5 +0,0 @@ -lag_calc --------- -.. automodule:: lag_calc - :members: - :private-members: diff --git a/_sources/submodules/core.match_filter.txt b/_sources/submodules/core.match_filter.txt deleted file mode 100644 index ad149361d..000000000 --- a/_sources/submodules/core.match_filter.txt +++ /dev/null @@ -1,5 +0,0 @@ -match_filter ------------- -.. automodule:: match_filter - :members: - :private-members: diff --git a/_sources/submodules/core.template_gen.txt b/_sources/submodules/core.template_gen.txt deleted file mode 100644 index a60969be7..000000000 --- a/_sources/submodules/core.template_gen.txt +++ /dev/null @@ -1,5 +0,0 @@ -template_gen ------------- -.. automodule:: template_gen - :members: - :private-members: diff --git a/_sources/submodules/utils.EQcorrscan_plotting.txt b/_sources/submodules/utils.EQcorrscan_plotting.txt deleted file mode 100644 index ecdd0e1ab..000000000 --- a/_sources/submodules/utils.EQcorrscan_plotting.txt +++ /dev/null @@ -1,5 +0,0 @@ -EQcorrscan_plotting -------------------- -.. automodule:: EQcorrscan_plotting - :members: - :private-members: diff --git a/_sources/submodules/utils.Sfile_util.txt b/_sources/submodules/utils.Sfile_util.txt deleted file mode 100644 index 50f77f8a8..000000000 --- a/_sources/submodules/utils.Sfile_util.txt +++ /dev/null @@ -1,5 +0,0 @@ -Sfile_util ----------- -.. automodule:: Sfile_util - :members: - :private-members: diff --git a/_sources/submodules/utils.catalogue2DD.txt b/_sources/submodules/utils.catalogue2DD.txt deleted file mode 100644 index ad96cd9e9..000000000 --- a/_sources/submodules/utils.catalogue2DD.txt +++ /dev/null @@ -1,6 +0,0 @@ - -catalogue2DD ------------- -.. automodule:: catalogue2DD - :members: - :private-members: diff --git a/_sources/submodules/utils.clustering.txt b/_sources/submodules/utils.clustering.txt deleted file mode 100644 index 506a5a35b..000000000 --- a/_sources/submodules/utils.clustering.txt +++ /dev/null @@ -1,6 +0,0 @@ - -clustering ----------- -.. automodule:: clustering - :members: - :private-members: diff --git a/_sources/submodules/utils.findpeaks.txt b/_sources/submodules/utils.findpeaks.txt deleted file mode 100644 index 685c2d2e4..000000000 --- a/_sources/submodules/utils.findpeaks.txt +++ /dev/null @@ -1,6 +0,0 @@ - -findpeaks ----------- -.. automodule:: findpeaks - :members: - :private-members: diff --git a/_sources/submodules/utils.mag_calc.txt b/_sources/submodules/utils.mag_calc.txt deleted file mode 100644 index f19705194..000000000 --- a/_sources/submodules/utils.mag_calc.txt +++ /dev/null @@ -1,6 +0,0 @@ - -mag_calc --------- -.. automodule:: mag_calc - :members: - :private-members: diff --git a/_sources/submodules/utils.pre_processing.txt b/_sources/submodules/utils.pre_processing.txt deleted file mode 100644 index 9d4fcf55c..000000000 --- a/_sources/submodules/utils.pre_processing.txt +++ /dev/null @@ -1,5 +0,0 @@ -pre_processing --------------- -.. automodule:: pre_processing - :members: - :private-members: diff --git a/_sources/submodules/utils.stacking.txt b/_sources/submodules/utils.stacking.txt deleted file mode 100644 index 81e70b808..000000000 --- a/_sources/submodules/utils.stacking.txt +++ /dev/null @@ -1,6 +0,0 @@ - -stacking --------- -.. automodule:: stacking - :members: - :private-members: diff --git a/_sources/tutorial.txt b/_sources/tutorial.txt deleted file mode 100644 index ae50dd93f..000000000 --- a/_sources/tutorial.txt +++ /dev/null @@ -1,85 +0,0 @@ -EQcorrscan tutorial -=================== -Welcome to EQcorrscan - this package is designed to compute earthquake detections -using a paralleled match-filter network cross-correlation routine. The inner -loop of this package is the cross-correaltion of templates of seismic data -with daylong seismic data. This inner function is the openCV.match_template -function - this appears to be a well optimized cross-correlation function written -in c++. Cross-correlations are computed in the frequency domain for large -datasets, for which a day of seismic data usually qualifies. - -Before continuing with this tutorial please check that you have installed all -the pre-requisite modules, as this won't be done for you. The list of these is -in the Introduction section of this documentation. - -As you will see, this package is divided into three main sub-modules, the -Core, Utils and Par sub-modules. The Core sub-module contains the main, high-level -functions: - -:bright_lights: - A brightness based template detection routine; -:template_gen: - A series of routines to generate templates for match-filter detection - from continuous or cut data, with pick-times defined either manually, or from a - *Seian* s-file; -:match_filter: - The main match-filter routines, this is split into several - smaller functions to allow python based parallelisation; -:lag_calc: - Routines for calculating optimal lag-times for events detected - by the match-filter routine, these lags can then be used to define new picks - for high accuracy reloactions. - -The Par sub-module contains parameter files which are provided to allow for simple -bulk processing of large datasets. These *MUST* be edited by the user for their -dataset. - -The Utils sub-module contains useful, but small functions. These functions are -rarely cpu intensive, but perform vital operations, such as reading *Seisan* s-files, -finding peaks in noisy data, converting a seisan database to hypoDD formatted -files and computing cross-correlations between detections for hypoDD (a double -difference reloaction software), calculating magnitudes, clustering detections, -stacking detections, making pretty plots, and processing seismic data in the -same way repeatedly using *Obspy*'s functionality. - - -Match-filter detection ----------------------- - -In this section we will discuss generating a template from a *Seisan* s-file, and -using this template to scan for similar earthquakes within a day of data. This single -template and single day of data does not truely exploit the parallel operations within -this package however, so you would be encouraged to think about where parallel operations -occur (*hint, the code can run one template per cpu*), and why there are --instance and ---splits flags (*hint, if you have heaps of memory and cpus you can do some brute -force day parallelisation!*). - -The following script is included in the top-level directory alongside the full-scripts -used by the author to generate a 6.5 year long catalogue of low-frequency earthquakes -for the central Southern Alps of New Zealand. - -This tutorial script highlights the ability of the match-filter method in detecting -earthquakes of near-repeating nature. The dataset is a day of data taken from the -New Zealand national database, and the Southern Alp Microearthquake Borehole Array -(SAMBA) network (Boese et al. 2012). This day was found to contain a swarm of -earthquakes, as published by Boese et al. (2014), the s-file provided is one of -these events. - -The main processing flow is outlined in the figure below, note the main speedups -in this process are achioeved by running multiple templates at once, however this -increaces memory usage. If memory is problem there are flags (mem_issue) in the -match_filter.py source that can be turned on - the codes will then write temporary -files, which is slower, but can allow for more data crunching at once, your trade-off, -your call. - -.. image:: processing_flow.png - :width: 600px - :align: center - :alt: processing_flow.png - -References ----------- -* CM Boese, J Townend, E Smith, T Stern (2012). `Microseismicity and stress in the vicinity of the Alpine Fault, central Southern Alps, New Zealand `_, *JGR*, doi:10.1029/2011JB008460 -* CM Boese, KM Jacobs, EGC Smith, TA Stern, J Townend (2014). `Background and delayed-triggered swarms in the central Southern Alps, South Island, New Zealand `_, *G-cubed*, doi:10.1002/2013GC005171 - -.. literalinclude:: ../tutorial.py diff --git a/_sources/utils.txt b/_sources/utils.txt deleted file mode 100644 index 39659fd52..000000000 --- a/_sources/utils.txt +++ /dev/null @@ -1,17 +0,0 @@ -Utils -===== - -Utility functions for integration with other software (currently only seisan), -and for the analysis of waveforms detected by cross-correlation. - -.. toctree:: - :maxdepth: 4 - - submodules/utils.Sfile_util - submodules/utils.findpeaks - submodules/utils.clustering - submodules/utils.pre_processing - submodules/utils.EQcorrscan_plotting - submodules/utils.mag_calc - submodules/utils.stacking - submodules/utils.catalogue2DD diff --git a/_static/EQcorrscan_logo.ico b/_static/EQcorrscan_logo.ico deleted file mode 100644 index 4033538a56dabbbcae01c7bcda58f95e488e5de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49310 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 z 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 diff --git a/_static/EQcorrscan_logo.jpg b/_static/EQcorrscan_logo.jpg deleted file mode 100644 index be7458607191737cf846c797a8f401070636edaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10804 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 KxG>3I&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/_static/basic.css b/_static/basic.css deleted file mode 100644 index 9fa77d886..000000000 --- a/_static/basic.css +++ /dev/null @@ -1,599 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- 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%; -} - -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 input[type="text"] { - width: 170px; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - width: 30px; -} - -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%; -} - -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 dl, table.indextable dd { - margin-top: 0; - margin-bottom: 0; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -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; -} - -/* -- general body styles --------------------------------------------------- */ - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.field-list ul { - padding-left: 1em; -} - -.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; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - 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; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.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; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -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; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/_static/comment-bright.png b/_static/comment-bright.png deleted file mode 100644 index 551517b8c83b76f734ff791f847829a760ad1903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3500 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 A2LJ#7 diff --git a/_static/comment.png b/_static/comment.png deleted file mode 100644 index 92feb52b8824c6b0f59b658b1196c61de9162a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3445 zcmV-*4T|!KP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2nzr)JMUJvzW@LNr%6OX zR5;6Zk;`k`RTRfR-*ac2G}PGmXsUu>6ce?Lsn$m^3Q`48f|TwQ+_-Qh=t8Ra7nE)y zf@08(pjZ@22^EVjG*%30TJRMkBUC$WqZ73uoiv&J=APqX;!v%AH}`Vx`999MVjXwy z{f1-vh8P<=plv&cZ>p5jjX~Vt&W0e)wpw1RFRuRdDkwlKb01tp5 zP=trFN0gH^|L4jJkB{6sCV;Q!ewpg-D&4cza%GQ*b>R*=34#dW;ek`FEiB(vnw+U# zpOX5UMJBhIN&;D1!yQoIAySC!9zqJmmfoJqmQp}p&h*HTfMh~u9rKic2oz3sNM^#F zBIq*MRLbsMt%y{EHj8}LeqUUvoxf0=kqji62>ne+U`d#%J)abyK&Y`=eD%oA!36<)baZyK zXJh5im6umkS|_CSGXips$nI)oBHXojzBzyY_M5K*uvb0_9viuBVyV%5VtJ*Am1ag# zczbv4B?u8j68iOz<+)nDu^oWnL+$_G{PZOCcOGQ?!1VCefves~rfpaEZs-PdVYMiV z98ElaJ2}7f;htSXFY#Zv?__sQeckE^HV{ItO=)2hMQs=(_ Xn!ZpXD%P(H00000NkvXXu0mjfa,.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/_static/doctools.js b/_static/doctools.js deleted file mode 100644 index c7bfe760a..000000000 --- a/_static/doctools.js +++ /dev/null @@ -1,263 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2015 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) { - if (node.nodeType == 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/* - * 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(); - }, - - /** - * 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) - 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); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/_static/down-pressed.png b/_static/down-pressed.png deleted file mode 100644 index 7c30d004b71b32bb2fc06b3bd4dc8278baab0946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~&H|6fVxZ#d zAk65bF}ngN$X?><>&kwMor^(NtW3yF87Slz;1l8sq&LUMQwy<>&kwMol#tg zK_ydLmzem(vK1>2TzUEGl*lj!N<7$PCrdoWV0 z$w0*Ap!bZ4if7h;-yfL#MC0e;t{xY+$l~DX2EWYIPet1cohf^BdG+jXhtuq&W-0|c zKPmlKv-7OTjb}T)7@fTGd9y~u4{g8An;)c2U=w=nwQ7}zVDc>n+a diff --git a/_static/file.png b/_static/file.png deleted file mode 100644 index 254c60bfbe2715ae2edca48ebccfd074deb8031d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)FbFd;%$g$s6l5>) z^mS#w%FV~i&ZxO9L3Zxqw8>dd4I&zcKG){Yx14xKr0

ZQJ$m%mv17-NAAj}g)$7-<-@JMA z_U+TRK=AR}yLa#2zkmPX!-tO_KYsf3>Hq)#%qnY_1Fd8&3GxeO2wSmci|LJf=|BO- zByV>Yl`U*PX977no-U3d5|XS39sLdkFt8q|+|QqL_#ErUf6I%zFA7b%b>3$hFGGFs zc72AL|61pRJ1(+5wNdg|xP#*`gQ~lOnTFKiIjl#S3)+QV=h{~`9{M=hx#5uZ&-tIF sG!8onYS_8EFr8v&@CavkqYey&g)1epR*Fkm0PSV)boFyt=akR{044O6bN~PV diff --git a/_static/fonts/fontawesome-webfont.eot b/_static/fonts/fontawesome-webfont.eot deleted file mode 100644 index 7c79c6a6bc9a128a2a8eaffbe49a4338625fdbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38205 zcmZ^IWlSYp%;vqo1upLH?(XjH?(XhB4DRmk?(Q(SyX)W#I)m#B?7N%&@gNzPg3A9y|F{1i{C~vS%_!vmy8pvq0i*!V z04IP4KosB&umrgOcXRyD0su$=wg0R&z!TsAFa@~%hfn~t{zKgUi?RJbIV1oM026@a zKV<`u{HH7cRsj2daa8}Gnk4^EMF2odUHbodF(eRY6Og71NK*#{I$+FQ#4RkN>Xu5t zDV|CZ0erHH%7mJ7f9C(hMgfc`(&`gnuuiqhEZtN@Gm6qm9jtBTu`bUstuVt`VE1U^ zQeRP-GNx@G1O+8HnNjpn78T|1$sHu=pO{n+?Hbd%?rXh*b{x)ZZ9Ey*heliTM$ph9 zeSOvxJI7sn2z_VOStQwpj}H7Y+@M&VY|#ngtbu=`HY)^$pT2Bh?F%Qz)A!hd^bxco z(ph?3k$*g}cpvrc9fcXhjj;5WPot~Co6>e-hv7*v=?ht4ZzfafOKSl*nvanjGNp%5 zqVHEAb0A25 ztDEMbuMI$uR5*rQ;Ex2f;9~>x3rZo2m^kwR6UQRPZz@Czx8NQJM6qF(2xu!inpqCE zp&p-KF}@yM;D2@511uFKw|p7`rR5E%Q=P-zPeXA1Ktriy6is`S1oMudP6;lGGo*>+ z8#MeQ*S6fE;37Z&V&V2oyeT_l1gp@&a)ah*E|M@ELRv^E70jhArQEOCVR(XrnfK5q zp=6hd;d{^XAPeI<#-L-CBvNu5_(Jtd*&!2*tS%|-yzds5)A{0f(w};Y^KBe@AdynU zQL37Co!%Eq%0_)~bcR`#k94J}qgc4SSR@Ul!8_*tW{Z3Z>U6}ivNUHWn8P$)EbfkT z@k>R%?c7o_o;AP3>Pi=p)K`@mYLKBdm&H(%0ai{ls$|XAptE5F3tx6U{?(i@T>GA3 z^_!F+A*NF}bxUB`5ssZLyE(_w@^Dbsgs-6_CGq92Gx|oi!cA-HhDACy{4K)xs|&hF z>LTWj1(w}4LTGz@)0q87y$|wm>pEPvgpR{F10WY$v~2DYt@t>2Z4;zPN_He3aPb@z ziE0^tt>sf2&yu8qR?@PaDB@HEgBHaU>ZnpXEB^D(;d~K@`H3P(?)J@Vn z@CfT^4qS#V(v@+Tim_UUz_Xd-$p=1fq8#h)@{UE|bVYBR`b>ehNCJ;D5bU7L26}ay zF9bjM0OWm1Ao>6*BK&HtwoOBWueI2fo{G7Y(GD|!_MzfV9ur=<&-+oRNRfybM70FE ziI3L556BV<%TDstB!_UPon6HAw*b{&kueNsC+=#&J+)243^;t8PopRU4eb)@)UjTC z%|J@gDtLqz=z5jdArpDBF8$;L=m(uEBXxr?n&v3{9kTU@&#yiW%YPB)RIU}%aSn`6 z$@EM;F;6}0Oe=&L&gfL&?rfC)Kx@IRPdd3jy;|W(cPJI&mJ)b22%#Jh)6+MBXi}{R zv^IAae*Q9Ff|}Y>L3KPUWC=0h^@i;U8!M>_cS{w^1mL3n#)V zzLDJBVg}IArNIql9*}a_j5k%x5~ySF{kx7~rG&ilzkAtDE&P%=41?qbzUVW>mJ;wI zG5?8dPhnkm~3cU8v`qiyh&L1E1^VPh=!%X+Uo>1c96Q;$2#!T1Ajyyr?xG>dq*93%MpnA#<7B$B#7=HPXzf=n$eqoJt`+9|FBhvLb+Wa z4m8GHx>=pcMvH?ROyEX%6zNvTMAD1qZ;AsG_0HNgMRs*xMPr|7Ah1x>6n>WIU!Rbx zAYDQVirff^+o%FmVd0B_;=cS=Pb5fBM{XhmuA5{$CX^gd>K>tNd;Lue-*M39)i8u$ zvloM|Alu~~`DW*t3*x9MP(pP*a$yx_Za4IsuM$&kOP znIjBTyD&_q?33=(F8vwuz4}#@VC5b=BR^1qta#WB)w-2XWN|LD`9AlpS}&US6%rj_ zR)6|i3w@-sbdLY*wIZzMyd+h(eZ#``O&@Bi9YU38yi!ozx7p}(2j2!@LD^z z=Hq^=#||B`(#WvR3+)d*sr80BN|Ky6Jt`#Qjwg11 zG(HT7qi~b5*RMzyF*&HHxNqS2WkJBe>I_J0^)kQLmlNmelxf#>?%GJIl_lQcfQhMcCHR zpjs9>tRLYo;~E98pm1*t7SyL+0x}cVhI- z>CT#lG-N@6SO=jawi;8;(_?PT(9ie_1fvY;Jk2=I_w!E z!Y^R`3t#8*m?I|Ud>4es$FXWl2HUO$%~7*kxDsbkG4Q&Gd8^ez857WVF=K{GnKur# zV9TxY3P)fpjfiFra;dkVwPR>95jhb+kD|;*iA+l2Oqxik?B99KpfozgmzxwxSylWb zg)%DWt{5oQP7NgLljJDmH3}IPvoJ+PtxxycCnYT&69cDw>&}In&F09a^uTC0WeDa( zEL8Nxmcz5q4LfwxV%sU0hvQRh+z2C;vEp+E2B3SEF-f|#6-mSx*mK)c0$fDM7kPz8 z?`_-7=l0}C#Zht53SIt`Y4vfg!7WuL-bBA!&v`K(@{u2PXiuNAgvs0jjDCI?mYq<; z@mZQ{ZtFKytujvz#Oopf6!|7kA*r+I0ob}^W8~7^gRdfY+9S_F(zSHB!HwR(Y{(zI z-ibb7)VpopINsALOXkwt^<)cm?aV--LZ?;j*$ezC^n=3iBOB=!JGQ8>rYy~O6p6Wf zY~=*?XKaLp<&Qo6W*RX!e1xBb&9_ct3YV5z_iE#2JViml)_rvMZsp2wS_7iXxJvew%gf;mkQY%&1+`Gi*e*2*B>O@GO()_#LH6z(C{)jcjQ~2H z)FMk)q>Sp8;Wk^A>(}J1pqse|RN~jF+6{lt1bbson9)wiI+YmW7Np-sVNxH|T&AA! zBI7Xjs!)N);7)_r(h`BeuV_SgPbsHm*uRBUVktIpforWVBjVz-avd%1F&mvltBvF? zfNt|pMlEQ@*r7Zr@j1anSI{yWHPQ$!*)ikAEYb7Vw$0#qFN1VR2OI)KFA*m1z+qk`Qy*pW{`d{N@Nn-0){$edMYF#Lln)aUBU%x zpbeNn0tProp-?4C-fLh&EA7jUs3uXR>mE(WMi;sRvb?M`LI&#S!`abZ>*?LAUzBEv z;)Sf?7eJk&T&RX^Zw74e7XPe{@Ple&hu)^v@rLAWVA)heayJ-&0YhI9ste5a#M@pF z()}*Gekga)6xf{ah%_;p~T z+j{vjFu{}Ns1UWUeQeT)f!3d>d;a(X|5DX!wu&XZ9eRYc!uzZQ6r{8oI2ArhVA%G? zHyb=YT19dD63$YpPa%n8ND7_Z+Jr5NQ>dEfM3VIVW%dBxo*UEF9g+=Z` z3D|>we0$`qMMT%+#&?bKsMuGo8^3qSNM2?u$wL0_nc8UkL68&{gP*hNYcXSBRb%cB?pVTSk*kfIOciI=QQrZ1JZwiYyN9#?{qgO7Q!32 zgX+p(BAS0u%GTgED?@bG%^)gzHm;AuU5;tPf-`#gsCDOP-I(3&c+iFWwqT)~_?WRs z0IY9YJeXjU!Nm%OqKuR|k8Mk;_D%MBlM=Kp?lshdEZwvMKMFR{C5D4la_j_TyeaQ~ zdSvtTk@H$=sJHwFks8_|tO%{fojwPmtKj`Q1zQ>HauCfT53_ze)l zTG-M87<=xxy| zDdO)&IMC;(lZM18FVB?v=R|Rw@)!k9^%zF2N_oFCDrd~Y_ws}mz~dKX%-kV41cU}} zQ~qUWCv|=_P_%uplL?G&6J|d>Wk_c3gKFN@F)jA%#ii3cI4UcpfE7lu4V5L?>N`$! zk)h#WZ(15(Finwk1ceGKs3lJx3!EAjUatNdO{TJTR0f@n1S1an1=2=8TU1Ml9{F^EsNZr(g5=z%U97>sgM zril2uR`W@#-Wt5t4Bn5Yz{|T;kcFdy!DE^@u598ty3OaS54s~Hb)tkY7zz6}Z_G@k z&5BO9g?I?$$5+Ud9=`SC0y?M!A2=yUZ(a`GKLJ%Ec-W*#J(z zal~$;zmv0W6y8{yxu3p}rN~roYmS7RdYm}J=#D391J6{cb%T#4)$PQp>Q8-uV-c7&nmY~uoMX$~7PY5dy=uY?@pM1GFC@wI|v|Qrw-=$Sf4{wk5&4_=sF>gnp z*P({nvArrS(l#^E8wXB^60 zjj8eIprA~2PY#gR{Q)B%m?ITG#X@32;je#;)B6g}9@Lo{@=*J&tl^#@&d70hV zqvdqNZSrNvD`pj@qo;n?u+SB3dYiht9J6DcMtae}KQt|F%fb$wYUmT-k7u?}UG8yl z)Fn}2q?zp*uBGX@u7bNWI76Nt7RMm)!sbX2Hz;8bW%E3gv$UWV_F%`6i4Cp7qpcfJ zDggycgt){-@q3Xf(|fbVc=5I>92_~)!?urM`!cFbfKnO~Et7=kL&!+Ci3&hjX#21i zKFjJr(e$x^2(e2@eFplc?uR%6Bo=N#WU7i-P3r}$20vvC5=maef9!lE`8^MhF~c2C zpe=9m1d%QT;koR$`WI=uIaOv;*&wjp4F`WIs*eFc#p^<+tI9=knDS`Y5Hk`w5F|r_ z4?}k75;f>g@CXGS58Xp^u#Y!M9~*|c8HAWY>=({SS*)Ox9&@4z<~uD-@;AQcA~6`) znp0N7D_`!W=)@bxJMyWUz#U*pQ{cN0!i%$t+J2M;9RU6#E3;dfkcw9t9*NT*lcI1S zbVTz`ZG|Ev(sHZt5`F5KoNfAh|<`q^eO8loN$OjJIl2#PXtQA)~wGv&f^-Al_TjJ58Pa+M5kmz-NhD0 z>XD-aM~}AOprfr!hqfUw;f(eLw$1NUyo!L*Yc&h>8ZR3PcRsr zpYsNmhGRf-y508v%`$L8SaCUt#Le-|`Pk(FB`->6b$q*QiU>;5;ZO^-`(W`&3^SQ( zkqH=nN4>YBjf+!y{$c`$oM{CvIf05nmqxq36o*w@|2|2@sQgRAPEnrIYoiG6NcTuA zi20@ezU2fusTA{G1B8BuLkp+2=rSrPB@K@xP~VI_i<*3sk11&W&=Hk2t3r5-zDpV6 z#dQ?z6_e_cU_h5fCw*a;JR+eAljWPV_Vci#Oh=B8idNeaXLW~$1j{iF5rJu`*b1F% zh*c0OefvNb3TPm=QtqJnS&kg0IhUac=EH`4_JOdO2>dyQq`rdoW9z5}NrSU|aEVe@ z!0U9?EzH~X@v58!f-M3vXUndSwO;G6qI#e7_sY;FZ`~pD{4qHs6Dq@w0jvTvuB-~N z8+2+lf)Uo1oXzp{W-SR*n2#9tSW9am$`FVl_l@Qnkpcu$B>@qN%5&yQ1Sw+BnKemL zRfpwW%f=D?SAe7)%1{97X=s}IQA|YiL6S9K$N>{4hvtXo3ypJsGLwUJwmpXvvPb`i zPkFFE0I#G&1qC%RlILTgZcE(q9+YC<%6We|>5Vf%t>CBZCH(2j~p;r3-+a*1_ko zbDXT3(;;8uXXy6+1Dk)LQsHjW_wQy>RZ=1Ndb*^$3dPZD;?iXgYVT4mXTRmuV@H@d z+u^8>gmn-Ztx&?PG9OW)by86jFo4ZHASsxOGZ=Hk?0FLtV$3cds2baN$3E4A#Cl31p{Ux18pUuLY!{ z4`cJ3-aWj(HRT`W2eeMg9XCNOM0LZ3*_F@?(ptb*MXl6wMq(2O8`(E*p^_64!N@mh zN}T6Iy|eL?DEPiQ3hfe{h(y80^dA*EwBR9&WeP}~^-1)Q!~NsxR;~NduFokawu-+X zBk?;o@e$fU1Ti{AzikyOdXzd22eX9kBS`pQkdEjn{K^EqmgG`{$d@+XqZ9O6SY_gu zVF`tjkVmDrsCq}^dc~hYd`tGM!y0j&M8QMw%5XSu{5J^=s>#z|3VD@{Gx!}uptysk zT-+YXFP4p2TEnMWl(`?Zi-2;tKPjKmJ|@->q=`h8(^8lcI;rt9Vh4rL1X0bU&<>to zQ6;sD%}9Rgx_URn9|V~;>{Y$#W1I~`l^ZP`I}3}K2ERDD$UwHe2|PEk(Z?gSX5)<+ zdUVERMQ8fU8wU?*Omoc^6-f@ZzMlOCCI4JZ6pFU7w%(&U3w2ffD{wNRM)kBsFp1D~ z$hptcdV!tgO9it8id@_=mRh|S1`n@*{P87e8yPYawPY3Ej4zfgPmjpJt2xkQ)}yWE z8!BwmbeSH$?$nPCXocC}BuHU>8G_#JzpON-o8dHDrRT}GC=zG4n-7RYj5gxvKZ=Te zSOn$?;)Y`Oh+*oP4+?!cN|V?jhT*7k+1UwXf3vmw_`8RK38Xw0v`a;iv1{x~`@aLM%hM*qtStGVzXCYf`q* z_(Exk=MfFjEUpAv%V>G@&>gR|FJndsyiouJU(}m+h$7w~k3( zW%y9pi}!Z98ob(Mvpx~OfountwA-jxjjOYhbyE7{fri?p4n@6qdH^jr7&38fVczz`O5|rS zdy!`@=)KgM`o`*xTGX6Xu3ZvA3j2C&@tIF-vj3*NrQ~{bnX;X!<-Ae3z#`X$V(A?- zR>Eba34!GF`jUademjbn#TO6DETFmI1 zzS4Ag!l8Mt{T_^WuF)6(;xNHm4}e?OJGCJrNUFcL`Kh&jmc&pBdHbLT;X{(%Yck+$ z9rjdgp4HO5J=y1e6o0fXPkuh0x`e&vK^jbN zLp|T>34R?^3!C<1=U?}@-t=y2v*M`L27Wk8BFOxfx|1;Xni@||$FAh)b)?sBW> zzw>aD<;V80(-5HXqbXyvg-F(qA6|AbNFJ@SK>r2 z1KK76v~3*m5M?RO@~rZr4@<>T$Pxjuw=^e(_#E?V8&W8b5hz8G9Og?S%wxe24~VR& z0*ZpRTVmJdRbj=qb<5uLm(abvLXYTU9@-jw)?ms&mfc8AE!QY0D)J>g-lmy@O#5rY z6WLsH{weaGczE8jONV{}7m$23_L)sEBHTLA?Zbb6s1(3*q~4x|K72BGM_9-U=s9sU39y!~V5p@k##Z1v$ zRm8R`n7%GrkuQ9-DMesZFZqp1B@nB$^Rq%jm}XzRNYPx9EK!;LbE>VkX}0H7VYmtx zJjuxDl_{Gm<0co4N93{5g1C}PR|$ebo?XxyrGGPoPNS1T35K!QkOYXJjNv~{hQ<}) zj=PwUzrPmNOe$M3S>%bIQ{zQ?gB@@uBh3V44xG940Al0GE|aM6Jr(w5h1=03lZIFbBq;fVp3GD+(ARJ!+=|3t4d~)LXIZ2?0`BfXcHj8 zbFHKWn9noh6O;9%f2%6a{o=6@ySg)Fj7Dl80r{ry(Q=;~OrOv@ysCr@xCg4Q?h) z0>WslwOatjzulyT&7q=aiqW`VEU)869Tu$`L`7jXD3k3&LeBAPXqa?S`Pd|7 z2qFA79}#)cd|QZvZPO?h+Y&M#*`{8bO5oYngy#14(vLt|k0Chlj3L@1ZEP_ANPmHY|$QXQ!wD`4GueT7t zb9DaP`^6}`7+hfI+Lt3byh=*|2RmW|5RYL%|k;X#f~6nsc z*CEiAl#o!);6?bZ&&7Cuw=)?`YsI9rCORFy;ceZau=(}DK+fzi?8WFD6_MBMG$ml= zMsh-4ss&nJ$hgT~NSX41@Jwctel6t^3f!aS7D~w?`X92Uy{}4vADR1Y?ObuRR)4U} z2pv1}O4qjvl5YamQNHtoGN&HSZttO^zz9Oa6hS-=n2);DK{SzE6Q+vde1;^FCjSC9$*dy_*- zJ%hTbBmFU~CdErX%Nyeb$#OsI&ESCeA;@k@I4(q&7^1U1`s(G-VP}*LfJS{r7`{#t z3XBp#j3T)A zE{aoA15z}9lo-8(YRQ(SblP(l(>v_To=WdGwoOA(@uxpNPV2il0IpNJ2f3e-`Bpo!hL?RGM5E3eh8=8p>5^l_lXR9EPYY1}o z(k*0k1kU9Jyl--}Xw&XwA1P8^Q?cdv!cZY&l&Kq>B9GCGmdj4wHT^9dwMXYPap)$` zHcW`T%JL;fA%H>*c_mB?l#JLN?qHDW%PHjlUn{q>GpoUxp}-?hslNMUVKQVajYo`7 z>$&QaAbR9@gn)v*X_q1S^FTc3n^;^>(C45_gJ;x8ksNA!J8?Eww{X(y5t1#x)f`Qv z$afQ#`DUDiAP+HE#XzFQfSdoe-ssF`yXbms&A6+g4ZQu2BGnb5t5;(%?va?q$&kRJ6O8P9QtkTz$f0HLozGu3sL1T)XQ$jv*TKZZcy0*t| zK_TQs!%2>%4P>HGk!Wh`(xKdSBv*e;=wIYw7-Vd3f_575 z(1=MApsGiLJ4hjLR@)szko>7!=Mo)iqa96vMJ&dRf?a3#D;$evQ z{_YY+Q+@rn5PCc^9*jnFAMTfUSH-g22#!1STP2Pao1A(Ln%MXc8bY?jv~j`xipY2wT{IOb13X&AJk-5nTR+wl5td2i1=+j94+tN z#ltppQ4jMkmI!9MfaNY_6h(w`qsE!^;@090RmQ!EZH8N8Qs0vKiosb!dcr~y0z;3Y zc?m2$yi;?v#SgG}?w`?N$lDPxJUGnrqzyF6ECSA6iHE zMmXjfI#M|SwM2gyozz_z3C})%JT?s!dVF)l`84z(f|d!j{UQ}Ap@rBDEw3W{Itg{I zNJZsRdQPFi!zloCuI^&>(+Blj{~CtNs_W>xFkZX125*_wJ98t$i=ehjc`5@(yd(2u zT?>W>QqvI(U(%#Yz#1J9RBWcyAngI(;j%jXs@elcsgk zjas-ld1lL{O~fH~9q|_tC9}!DV`;gM=*! z8ip;mpc5sz9uI7RwZ8;>dJ+ele$aWeoXuWdAdG)CWRFuFEcP@LxmdwxSkc?z&}UJ_ z08WXvLj!wjn}~#TCX9NPIc`2z*W@bg%&xvOIewG`y0STb1mq~gp%uS^6(Q2#as80L z|18VSW315517}JcsqYkA`{6di;aW;2wkA=R*}KLiI|h=(ZGMB;EvE)S-hI2->&k0% z9XqG;&yK?V5qPfiI~0EURzMh8%w+%yGtpQbwTJUzWxcJ04&k#-5q-L>x4-B58gbL6 z2xm7dvGamFUVE4Zr@ae^f-=YsOjlm-GtAO}f{z+x7G{VW%aDvWBS9C{t6kOzj6H0^ z8YEmZmqmb$bHtEg+s8(GP#b=%AwIf3^lBpJg*Iv)ludv@gk@!u2{OHFA6|f=Fq7aj zD+OB~lm_FIcUcWY;}m@2*m(lKDEH|8!o1JKb|~q19`#wLQ_GD~ON#)q2!G}Hvt*)$ zd9t^xsn0=5lknsVSWEoU0229mEB7LcH>W7Vgsl%_@8?~uWwUD} z`XxhMRw~@(gYFi7+syt*GUAJxp0gKYG=_J&X?gwDFQyc*lF^iqR$g!<7wKhv-j6q& zzvr-n4l-w3hE0T=>}pxf__W3O`L&E&t$3^wrU9$^^ zTq~O8NYqYbldSWw*?>enK`TBbRn4&WcxtJ4QS?lHx}AtuYG_I?@`rj4X*rCV_~hukuD?XojV7i&{J2ZIr-*=BAMJ&k0JU9NIq# zkz0mMp78F9fe^?!Lg>!&0Zv9yf1mgsQlc6Q2-;;B1cw%=UqR+R=4DvR@&Cl2mBVKp z^$`k`%+4)*RPDpZ+$`m!LPH4&7pOZJ^plAKLhYLIT;iCK$q`45h2sKPP+o4cvJ{4+ zpZ%hK0QCWZEa(A+(-JPhPI>g+A@NBZ4C1@Z-ovz)*y?$kP0pSY@G|23zIIL@AFT2F zs-71oJ&Y}5MHOWGq@sArAoRIn$v&m}RBSsfUX8-fT)OITeMh~nx83g&vx-Oqcgs|* z0bOZp(4vsA!q{KcO(H5w3TQmzrO>)0VYDJ+$~Uf)iS6H$2*$^fsf}xz&Yd&Y5X0HZ zjHgQtaD};It7$bx3Z?b+Fq}>o!)(VO$Jw!?$W@^;heX|Rh=zOW3}!StFr>yb+lI=g zJcd3Yp$`6a*px@(a0;3x=(&u1`w?jX71o9Wt9FhHFEp(_D{=3x62uA}6M*ayf6r`9 z{auu7q^{SrEDhaj2Rnth^rvap#Bh}zQhGPu7Cg6vIMx20KW7#nSo9ih-fDL||8rD| z?F30se51-f=q|`|T*15_ITLh-woarjY*hr4YRGl)Q{BK8@AEZqf4Nti}!Cu+IxrT8t+nm2+GO*-^Y=+7-}W$WHpXp&=F_>|8~SXJ;k>(5GYwS}>~9;4YWl$R5|{36(|VO1 zwA-mm_p+urSKUi)o32KYVnVxTZ^R6m7W2CBzih2-%sCYD18CZgOx?(EU;#>TVzC z00(zo?At;%HQ60Bfd^w)H!PbA>p26=*O9x30bYiwULWM8Z1)w>k0~~hV*-x2hl`^5 zwvGQLmgWW69OCf}RVH|!GS^Kqj3uFc*8R z>e>_(uv`W0+l#JF-(pIhARC;Vf_Ng2GxaJ;u7u6$exj3mrNpQ&j8R5-_%w#@_dyFn zvfSFh;%61eB05sSi z`Yhwg!&_DQtF z@0MJfCj_nYMS;n0llhGVkt;VYD^)vdca2fi&Jxmb>Q(!TcrtN+d|{4d!pqNB58zvq zN6-gHE(cK#CVr}E+uMbADdD5Fx1CzLaF1G$h-i^8M~qM+U23HtrBU;fPGThCE3r#% zopji+n%!Bnw33WI6yuFBU6F8W<0iVBzZHiZWi_U8T>yt@>h4K-BC1D$QCEsYhW~%%K(pj127tbyQhk7Ay!gYzjdO6Jt%k64wTo!kNfR0(2(dmneO zNT(;B$nIq^p)NRYG&JB=)I$JLR%< zzmjY5$0?7q491IWEL@6lbW(tFH3cm-iZR96WL+7riuoI&%Wvc%f~Rk&UVc2OqyLh0 zt)zq%Ry*TI#p1L$g8ypa{k};(6X(P$bCI95$H>}a^Py)5qYzY!9`U4vuN1P2rcC?$ zlVNL5_VeCzjsC-y)gptp;v=bE95bAGZY=oqD|OdI`#wjEs&x1K_?Vh-aSb&0BW~pF zs_jI6Q42NGbW9u1-kcK!^Cb(GHYHzs2!5ZWm;*f(d>Rf96ldZ=5^gw|n50nHT?n#+ zm;B|@@%4;pV=36ej{7<&-t{k{6hYExI-_M{D1Igphg@gvS5->f7_GdMA|ZD`{{(7& znEZjFK$xuM77w{$+D~*8T*P3WT1s#b5Q4u3&1k}6%e}2$Kk#&_wV}x|e-b-#^-6Fz zYTo-I_g zT!2Be5zcJp=#oOI`tRcwDTDphmGbYOy+Sz4xg5n@({V^nWI{v3uHv~MNTwqAD3yoo zXuN)7AcX>t?kRET5$a=B0h5q9xBQG;s!LDHZ2bYy^Icm_ej+o+SP5`$Jv1f%z~3yf zP$(J&Gv_JQaf`vy|1lauI~cJY`u7{0h;ONdWBoh;0Zu|S9*(5HDdOq;z-DAQ83$ua z$3$3P{qZ%b;Tr8TR6eMpX;~)9WQyE7>E&uHhlxf)j?>=2#ILCvT8Y37Yr(th(MYRWZ!h1J(B(s@fbpan5 zN!;*SXL=%wfQf*u8edjrRe}VIxd)(`@`S8pv<^cB3GPr~O5j%vV+_XR*J?o$HB+kn z4Y9}N78Xe-Kgh_5F}hK3)kB?}_`hl5D_2M)#Dg!nVO|fcgZS;a%r)26Q2> z5s+VrrE-t79bfCeEzP8gG@&>rv>9OLf`*wCd+8eHPnwf^d1b6*BBP#@uy{NcJURbR zn?^PGElmeWUbqANIGDFOsRx{weXt5hSaGCZ5!UuYo_#03-SBZvVyOHi@C7fKc={u! zy4obhWSV$($=o?lSk|VBEosrdiomxzXx0$?t32;oPxD`smBja5{XM|GkytzG7HB+i zI+_xONpRW*Wd-t^I!(3t7vo7RQW9G!Ly6#|(XcAj8qJ;fwg=fURXgNm3T~Jf)b?{AxFghlwu)YxhxEJiZS)NI7FL&!Il2W z_|u~DS1!2t%?WR4WaN05$M-KE7P>R_b}bE5?Q~_J7SKG$*`2s}@rt`P6VF%tDnv(# zFb5Oy28(nbPf?AV@MPu!z;Cr6lx{K#EY5&jGQ`6&(#r#JWGyDOXM1CKL7XH!)0WSWHc&>o0D5 zS0bJEzjr@awn>pb_vpmH0}$;w3^y;zi#CF!#oTN1wYo5-P zBKPi8elw+db`nlW#MhUR`Gybz1|~kx)*uH6Wzad z+4w^?sTHI3FOWV(vrBcNKzGJ*RG`C3rwb)b3H zG2>8)%R{9^uPtgBJe49tAcmer5+`{{ckMtKLJJ}L`+>$>9w!FziW(a1tEOp!jk`8- ziUe|c5+g``wWAGqkR+FCJMleG!nIX)1Exf!WgJwMv=+^n(5_Xq)Sv@`bj(;%W)Gzc z@2ZB@YYM(l#Z<}C#p@me^!LN74(|KfT%uUcU|}+(B_v$!tp1Ij*ivQ!BtjAZ7^_ZW zOr<@(=633BJO%nWl+>z3PW^{!OSd>f(E@ozDI;uR>SxQS=K;IGAvIp9NAeyXR&TQA zszK87!&H|)M~H~41*VL%r0>+ZHg4H8u5s|WOK6Tf0x0}ee<|?ixzaq?qNg0;gBD_S zA(=kCH%5uabf_=}GKd!2$Hm|v=pM*BBGu$WN8UeUKFk(Gu)XRKFBbyA5bdb9su7m6 z&HoE9K+nHtmRW0-n>^F2HS2=1!7d-&=XPeK!D&joa2^FQ1^fOmsnrrI8pg#BK6(W`PW8j-?^%>Y%1# zJ?EQ-4xVGt)JO^*IJ8ZpC%76145J*l%rM_c)PW==CPc^UnFSlp1Zig~W&`_FpnF1Xi-ZmVYk(M)eBG z?*xE7f!3hW&5p7p?Q*68}WEeih55*V?c8|1V$59nxh+M6$Er*@mi zJXApP#GbfKPF`P$tQWePqVvkuTI#?in8t{3n!IC%v?}j4r2w!9kASC#R=ij+*9OHG z#-mmxq*0CxB=RJDD0w~`DJD0d)6Y1526{m8RLF~s$q&f?Eg3~%@3_}Mp{;>m*~d5x zoZNOGoqVK!^*FDEN9}TgK*FJ@=_DSdb4rO|99j7}i zg2nv#36Zvh+*I&0=IS9z8w?l?ItCn>+5A{|YTrTa@BDjBwGKeFmbB{yd@O+>t25QCl;N0D7+GD{+rcr@YAL>3O#8Ao8#IgKqSs++?_8G5&SD8{oeu=_d^ zPQH8nD;}21YI&})RXV>w;%I=wYD<|FyXHY^?LKFo-x=#7y?7wKIv3- z^qm1Qe@X)2nhgT%=@9hxADhYWm^{Tc@-FZ!qeoY1fk_A4>jqT()5WL8QpDkH*#t3V z^q6CIQ=9(-bT*R}(w0_YQ)=so&l84Kl+Z5n_IM4D?fNXDU3A8N-eIYMzQd4^ov#`b z=OMNrM+ovoct55A6Xn^vCn>bwjWsr@k4zjGJVJ*ReuHoK9v2Q2k`mb`A}H-Rl?HqUD-6VE}d{ zKiY)If#boCCP?xG(~-F)BEZ^#M6w8VRAdwTF}}APoU|_`X>tS2)FX#}h+&5MjMjD_ zNb#H_>vxTmnK@S6zz3gUX{Kpb!u(?ki2ZQLB(z3*C~FZY%k+?>R6`9}a17CzKq3IY z6og`t1{o-1@G2?dYR}K$O(bYXbAjQ}KI5~Pqd(1cX102Xv!a@YQ0^N~#8EJ8PR60Z&V|tu8sG~O zUg01sgSE;DQ>mer!Ua2@c@G^BO&6vD@JGmi z&U46(LZ0n^Cm*K{l&cM()za{B2i_ zza!H;u&@;2AN1^9oaU4d1gFo9wWGCeFu5eYJeffpbny^_WC#XJ0Az(?c(*5u!ww*2 z>4*TRoV`h4lCeIr_;@H>rQhFv7}IeGP#9+H$ufm90V#rx)8afQ7Sk}Jj=ZAuQdNny zrWg}qxG6*Hz%)puO@?vnTI;SMggHx7pQ*lXs2EJt0_EYo7q10Uj)2(Y7Mn$zM0 z2;K!2GTt_#I{tVG*R7UlY{@JXLCXhHjyR5jquHnq%~}aRseT#fK(n8n7gEsrC|t9Y zeQwgw{od@g)ecMG4f=c`u!$W98mz;RR17*_1`sMe6pt1vuof<`Rq6V{GN8pd>>HUc#MOtPD5%F% zRl!K!W7Fk2A||J}`DHS*>7KUI?Vov+c2P`yJ4_5MQ4$6eKwPqOdmn zV5adY8IlxSSb6$&EFypH8%8qJNf`X8ODmSwVUgNf07D@1u`==`G1{lR)nCn*?Uaze z8ERJpU?O{DDgeEP3u+nP(dnk&8#Nh(@(X06EOCgvgMvge;pb%p$82x+-$;n}lc5hp zpG$z+hc#3mp?-|6fOKsTDN`FHP^?NB*PUqO*%1{BycWECs%9*x09AB^as8SPBrK=W2-Zg zeLhUvw{SegHUv^P*pRj|RI9YJEHbq?Ik3&E3*mcMp;4|kJ_Bkh?XXo*kz9jEw%|O> zAdP*cBGgJ0uz2SQmQ0E}jenNSVxtW1dv@lN9q4kNGh`W~&}NT9s@F#3veFQcWS1y` zA_lDmAZ+3-4aow?Kq??1S3;p;E5vHNBm@9?+>D8%mIOHPL?$WL5dLlAqP=Q83Q;yu zS{b-J7yI6|9OiA4X@erlLErB|?E4i*3?#}l>`N$&p8gV=Pvqr?ED=fjrWz>1E z6FUJJmx8-a{V8)|W_~tK!M1E{FWA%5M5f8uw@Dd8EY07aYO(d)}rCQOWY65heABPXqQErYW-2fDnrkO ztE2rPTq!g!0x0Atth5e&kuT<(yv#_BF(!)`^SNmJ#{k`<*_prG*ZZNUVx-d-uMkDp zqEKQI!9SFjt0+Qtg)D(CiD&TKLOfrp4g}VXzzU~20OcdVBM3yKcE_5dW@g&?l+>7{ zIv^^qF0z7I(G0j-EA8yVXg&h}`xcAvUJz~!1AmeAS2x5(3a!zyC&<5RnWQK-hqOd_ zc&(bTi8g`G!B9S3vE>@j!HHKS)Cp5?@`OBIP{t;Eh`m;7d7&DDdR06-zI@Q&Zv-Q6 z{oV+P!PH+yFCt{2@6g%lc(b9)+5om{bif=Jxh)rOjZS!2`BEG>Gcw_ZNM5K%vaD(tF!1aj%Rtq_uY^j?pqW2L}L|!!!mNkhB4gzT$Kjv@yA= zJwzG=JTL{22aiBJS5s73{;d*vfJdsGM)K*(8akWp3Y}5?>v&b&zt{&0_g|ruU3^hPfd@fw*3_UfnMaL&{H+@!#6amQ70ET-< zu|Ypz1`Fs?6q8c@vmF*bieE)i2%3jEB6eIxnYLdXs1Ypzl<5;IWn&Y#J>jBb*0aw# zs58CR#-X+&j1K(EE-YHLf{8VZe`mqWH?1F!a9p_HrTLM<2Dz}*rq39~1`Q$QRL-C%0vP5VD zRJBqG!^prX8%vOQ8Rl>)Y*PKEMEU0X1_6a1L<0{AEQ-YAIDy89oQcuUb}=VR@rBu8 zxS^a4jNSU>db0Cx46A4zlb0|pv~5w4(c?Y5GGSaDXCX!{au9dzE*%e(k-{o;TUrAT z?EJxOx1|o@G_ipNNf%>syK^T4yFdxqVnuN^N4mazcURzTMGoA%!Qlgre8$qF+&32E zmkbg_VtL~+4@!v(%fsYHoQpl|MfFJc(u-m!lnD4mQvMeM{-EE5VUY#LUo|A1)_fqy z4e46XLQ%odYP%q#{E9P%MIfveEH?7bM{63%dxtUDP6Pti6c6&Ic?%n#Vdik-WhiVY zI1v_rMF!~t6aU1NDHo8)**-``MT3o*Cj=*f;-8UE;caqdzezL2pO{6hFHn3kOji;( z4EIkc;b@F){zhYjuyu&-O=+d7{`fV5Vs^gS}r zSlnz8Ufy^}Z1`vtnigWm!4?Xime#mJM~<5aKp>h-1zL~HA9X?et-KMkR!ZBBSEup} z<0}P0xUD5UK^yKajIh)6%pnU3$6^cnUjs^(WJkRmGGqQn|94Rz9JC3vPHbpaH}2+m z;UNGc>@|wGTc zn*CC)q?r!38f)2vsgP0}p({#+tte3(dAODUxSkY_Xp6WM(ycQlk>? zi90?Q2y`8f__Bj69I2m_C6sx+$`Ci73zahi4QQ#f7PvCCC--9`@nmIR8rm3^al&0+?ciPZVSfYtY_kBWwX) zp6!T*Elqhf2}~d$8UgO(P0b9H5-m$5i?4DAMEqWaKU51A8=pheK>-U2!brk25D-jZ zlt!DGCN4@pZHe4wRFY$vCjp@%m`2U*lR~5YgMq$kDT+Gx%+D)Pl*Kww`z8%2&`4$& z;gM`8E+{mJ79N7i?emDeL75VTddW}~l79wxVj=@)O1g*oiONH*B7l$$y;QYF{U(f> zbN(Gh22oA$&m}bHx+8Rjz-V4F>1U-sch#wX4$9!Kzf5y?qR6C`%nZ>}i}kNDb=8MW z&@a*la2TgL*_*dnu}`!`tjs3A4frq7=1b0>#>CJTQ;TuLj;|$=Zs#f^#Eso-jzS$n z_#5!N4U<;jYQLfw*}|AGJSzorKs?F-nS@Mo2Cgtjfd;|)WyyXl#t9AVro(Ji)cy#C zI*Tm3cyJh71DShm3fl-!FhCYgK3#Ij0GMny<3MrthIShbB%$A#=jA#HrY>sg)ScIG z>%2(!sh#7(gR&Kv>OZ1q8Sy~2k{-pOw?&-2w*&!cc>&HmLJI@LA&hvKQ3rw;t$`5v zDM*QOIQTChL~kTeu@e*oe=}fE4M$fJA?WR$j+b2PnAyXL(~Vfi`fRoplMeQJ8|Z48UpB~H_8y!d!9pe^6HHD1aUz1_pVYE?jJ+3wcV#7-iw5}o<8 z&AS4Hqy}IF1q{@n(RIvtR6r~&ga8N*@PIlq++i^l|0TDP=;Hq{UyzJ1OVA?6n0 z4QlwkniuXNq0ABZ=3(Ppe^{zWhR61~>Ga27j`Gh254B8-5?STtj!x0X&@q<+fDe)I zaFC3whx5$L`U8{1!ImV2V7Ukv0HLU&fWmrCtO=I2{4MEXZUW% z>9&DLp7LW-HLm7|q{-=nhk~AF6Uzu9Nc$}fQ7bZ)bmUmWU$Hcst&8(uYZeln08gBQ zNRYG0F+E}(L%f@lr$~e7laWe?ngZ6Ds&l|Oe4)ol>_v$V8oJi=6}sJ`EHD946S7pG zs{9ZZr*dt~6UahCj`Op3_JBwW-Q3Bx z|2mRHEuG2CBLVydoBRbJs&_OEv%Wc{5qVaKF18Lc)8n72VHMq4pd}P_Ao+qtQk-mH7em4XOK1+uveEcxLlJ9YyE+iI{!6(Zpc#W~ z%a(LBj{H92-)(`>k@G)^M(jDoLS`@#rbmtnbE)AMo)UTE9rs6T`Fo>R8Tt4bvx`{1(3U}|7q1)xk?AJ;`EsNSj zoot2O!X5_KVP^7>_5!!0H|+N7rH!CY!%5`+ELrOV^?*o~@zJcQuwG06Z&tI-HhTsc z{HWxvNl%VcCoL?if#}y70(3J$`vO8uHU5v75-j7>4w`m>&<7C{nO$X@v(ftV+O*RF)vL#5k^C_^Q%7jjvhR_`)>;Vm+FN|}p z)gymTb9zD5+%icdKC_YHs{l#h9$}Xif)Na9*4p^K@+qRX%9X%h#k+0}fpO6S!m_)2 zx#?$Kec=qO+g5YPdDNb+U4OQ6C0grZf2?JpM}Vk?5ugl9v4p9TqU(R zwehj_SZigl-5|e(BU4I7ot2wHR*M82NJvq#Hemw_Xa!TNSl3#@p-SQx!!Bh?;U2=7 z@7dSC57Ir9kjC3}RhAS{@d#5;1lAS-%N7?X#!ObJ0Q*{#tTKA}X@K(n=oZ40Z8w8j z-H`WFqR5_0%?P&?uV7fD7Ec!bHO2o|x_Vq&66q%du~yNeGg0!a>Cm6Um`808R+Vy0 zFcc69fue?5SA_LF0IxD)W+9-i;G^-Xx(;_@LU#@?kqaCzaFYoyp+cfr&4F^A(ku%? z6b?(lBjCjpw!f^kq;XMRRB{s&WiuQZ@C8d=aq;rB*j0$LOJL}5oV3T`iqZx-PFA*P zxGk`xy)Z(el4?S)0Ki~l*Ubb&k>#cW)6$Ia&5IF?khaEE(;Y?*!LU^}UtLKUw4t{* zc+q~-)bHIzLx@az>jYuL!j~kJaFKFvUR#Ptw#H8#MwEttL32Z4mJ-=K$}Y6L{*L7k zErl;};dP94!}>%8k|o{K%71cf!xyuL{1}bwW}&^qar3-BZKY%;;+f`ci;jQ$4CR^l z)Ya4}O@PFoWsHJW0C{#(t!RP_t`>p?-61{8QJO*~IGFe&CZ%I2zxRnz7+UWuaody- ze6`-on7{<}gW(jCawHQDlYK0-p<`#B58DL+Yl5)ZFcFHK=g5%Ihx58Q$b(o&9%6mCUc^N6v-aAsc ze7TH23DIau58oINcMYJz$zY9a#lDJxq(}hYYA@{%ZE*XTH3u+jmi# z*(?MSVWH2l(OGhB7(Znaj)rjuOi=dh)PIZ^c9TOu0Qv^LFaWl;!T@^PSg={7;ipP- zuK66IeGU`|=NLR{fJD)xb|)=a$8Q!APZ)r&Pl{eK&4c3FoiAJ}IC^goa(@a&XJ$y* zBU3yIMiVK^+^WzU*d{~CS!Q>^d|;i%U>&AFX#fjR(mdSox5_4DWD2m!X!?IkdWbo5U6=| zVPgD^i0w!^S(2L$NHLC>Y%%^q&e@Fk)Muh17!6Urj6@{4C=bT4U_BON11L58s4?PX zF>gdjJ+lvaLS<2FIbxZE+8HVvQCQu*xjBXz&tUJk*c!DIxB28dyFa)SVJTL3D*E5qWqDE7Z`i`Zd*P#PzBqVkyZ z5q%lpV%R|9YCX->J21*3l(8x(<>|n|+n(5AL8=bd1Ry}5wzdQOPW?S;wSfddz=AO+ z!7U^Bjn3$aR_-W+pLpTYsJ*&TzW2{|A>&*in$F9@WI@OArgp_)KHSg33^s( z5~`f2W7b3(+uN`9F+<@5e(Z;3i8qzYNWT|_tjG`ta71e>%F+7AVNV<6Y1}AA&v=Qvs%_gNXx=;*d6MyF0m?T?Un#o31OYwfPZID zZzNh_l4ob41SEtA6oCx7@U6ZIRZ^n0mlJ+8srg`Hxk>aaN5?3Sa|R2;Fj)4moM}UZ zEINtcya{S%&jwoJHO-jj#smn)wjD|WBYNOQlC58nohb2jW;kgbrh(W-)7%G?UyuRK zq#$@)8N|iVL4v!PW4=H@SyOn2@C5{mEGbK_y07%OMkOEMw_}S1z9K~+0eY|#i8L&r z`O$RIAgy_)#!?I{oEbyMwk#>y%Ly`D_c7-lEIxv6s@cGjum~#fakjfVOI#U6$FnS# z9LblHni{IC@p|&viO{*&-8yhv3?c^*I5y;d!(m?ftBs~fM6gn*^zmpW!m?BIcZ98y zTqmBGxINDRj1|tUYb{rhbEx^-$3jOeD1p&73z1b@8nXhKR@@6Nk?lHQ;uBp!ZM%lR zX)|>lLL}?SKA$WH=y@juIcC&!NIHkhOSXnQF*6fAANb7#OM0K-N#muPPZKP~#BHNVp!*5$Nou5LQxB$Zth)w9_gP8MVrYqkOc0 zkHJ$*X%k9xA2m3onQgoigKInz1YaP>Q0Z%VmU+=VfXd_X^0KA0ut4QcWJ^5hJ`6ua zuCpX!n_L+Hpv)nsrl<;kD+}s7la&>tnX#9|>Eg-?JD66St-s=I(J>+j%4L(%SpzF; zS>fk{L`;%*6VFrQ3Ob9LtAU*f7iP)Dxg*8$LpW0nngO&4DGN6Ga zz4D*cG5Y9&*aaW$)`_wl00W@7hzU=vjJ^jKrN|OdB_=|R$)IErcOzU3PXGzP91Hvi z1Hl^^bMsoP8b8*4*}h*`t?5K5o9(L2m_g(;hR6-;>4-nw1Y$essv5)r@mv=#!+mVN zy369O0e5E`5Do^y)Vq4weGDxy==KBE3$&*InScmzgD^d?bg~3>CN7J|hGT#TVq6_H>LXckc$bjRTuVCLUusB6cyzAmf)Ai!_ z#NL7-QejN*Es8S0`o8uSvn&U&yki0>-hGK8%rLOTKyd0wIP}F1=VeljySB4p zAC4tj&8X^{G3FU9TSGOf;e}0Tv1%pb3~bca5GaMH!j^hyKwv2Kkoa#D z;0KmE9^Cr~I>STVp^-DAxC0TX-;T}}5|Tj*&`S6NN=L#tauE?ESk}Y5B?#=6kBD_1 z?hI+lp^#}^Q@oV0SQ}71VqQ0ZWKiZx2cPjU$b?FL&64ep_D%dLZb(=#sQzpHc3_4q zOhFO*A~K*YaSpn7Q^k2$pduQ{R0s?AbcoR~WCYX27hsSq3kKuCmN9KIkwi;E^UrCo z6naP;$%&f&33H(+k6xX;W_o;%+j1sjpg`HqnUg@1&UA@RUDky%TBv-aSXR#SThC9Z zqE0FlL_fE&{ra&uWBs~jX6h&ozJOS-)u3kQ#;1c@bDs8CKdCQ!N)GOMNgPylAM5tB^Tg+x(7axuJy z94GC-zN&g^t1IzBVrkMB9GRjbPOmR0msE+i@AmGVDVox*h+UJysK8Q6=M6dl39=$S zs98&3*h(IP@Y3j|uAJ-d52&RW5E-^N#YWVn{i{27&cWY1_5isF1~i1p&!Ps62gUYd zyxX*Z73$wL|Fz8)_&gFPC#22_m*i9$rLK1YI6@mD*C{G-FlpZYw;i0twe}~AGSfQw z!C0U7L)gp|46XKQ2ep-=RAnwz&dX%Kk=HGRLSn&OW)TMJsy_rj{=1K*&{WXgo*Gc2 zn_nd;t5X*425l}ot30tixWqiA1b!O>c$yy8v)-dFG&L_|65kx4v;YrKVbDI5MHG^R z3el>MOrP7Pj_VrxAhHnyw9!6MCYp9Y1WKWQNh1Zq!Na3sjangyjt@GKro}*W!(I9< zGoj<@=PAKtkg`gB0Ul92Sa+2KJcXg)VL`sCP+QUac}1(GXjdOh0|Rh6EcQPvaEBBi z96an|jEZcYCz24@lz{N2E9Mw#5P;LjI&F=`q~&C7<<)zftjMP@-ieh?ELQcxyhY}# znQ;OSr;t7=q*m{7x~Y88brlsasSa|N%ZuqZnvZIfWvI|-gru{fY0`zn1&Uy9_%Flv zaahF3-!VeC_alhq|Hd7K$NqU#`$(ja5uK6goYrYc9T*cpY^LA_d#(g-s}_hO33!{W zu<;{BC^|VSP^6c|Mx%YvyHsRkzATp8cR(dvA_PUU;>Z~!pgDpzIf!)KvnNFQg2ht9 zM5x*Ffz4G3I?7qoSRr`TivVfRJHd zoJFkEZXfR_Xa$IP;eqzNtvG}ta$SJG&5q4E9gjFE`b*4zE`c%F9HiNZg=JB9(&1{0 zWyr5e$4?g5fi3p+E_BhcYfTh#xGL@-T5T6GH2&F@G&x9)s}12;tzbIaBnvJ$ICaP& ze^nu_1xDfs08>W02FLy635_!IVp;=mhx=QG(k_I zyz44f$^wBYtxB;?Q+L5tvdZh$lFC%@zB?seOIsPAd)7I%!%cw$0D5N!$csEp_%82T z7%1q7K9@w$*S3fTfD8*O_c9H!4uLR$?~8yH_N?EHi{OZ9Y6u7tNkB8xFye@Hy(f;E zy1z0c!an5ClOL9O*+xdH(g?FVCq4%2v4P>XWh({1DkWn~aTXvyP$$oZ`H1u^3@5_j z^`+Zb)|k^Jk!jyz6cunPNEhJ+e^=0dy~U?z$w;8q^|o69JE4ZgJ?kzX4v3@%!{UG6 zu8jx)Li+`<$4Jr70=lW!pVL;v42Vv@+hYx8p4PZTGK!^yK|7RV37)0~2@DJZdm(_Y zWJlV3VBKqk^aw#!Y6ZVl`Rw8zfFUKIMW*0MAmsXzCsH;$_L7IkIfemz5C8}r{r$5D zd{=>IW55BM`8323BGh@z_Wg;tF$51pm=?>I1e?->(hQ|5Q~@HSp6wiM@!z_77*y4n>&`>+j z06xsW@8mRfTozfzz zZ2VlioyxFOLUDBtNoW9stu=ZI4!wsq5=5lHqz<%jQa%WSQ`Dh2B7$2V*<%y{Bqxpr zSK58v zG`SZEQ=|FhA?yJWAsF#gP|xxo3%&nV;a#u9ktlmGOm__!Pz{@VFc|zlsp0ySPu9M? zeaA(C1_wjnsTOhtF-JbpXI+W;8kXGymUz#ppCbUharZ^hLiJ|XU6AwdX=E@`DCkYi z3=}IaC6LkaY~Mqf;N}WLQnyNY<~v!EXk*v|JTf7ph3gU?8Z$A`?Ib|sGDwT&^;jYf z@DX@RLt?)HeKs6-^j?MdWop25`Z*SF_ySTGf+sOT6k#+1Cdoz0C2SltLr1lF;7$^= z?_{OrkFfcWGFgmd(*g@hxl6Gk{Q-XpIj0_6N=__4;69cAsXC+(FRCEY!m+F99IQ-h z1HkwQFlgL2WujwMNFk-Q3r2G;=5^fQHnrRd1G`-$qwpTjGsy}kBbxZ1Dr*#^Ql3RQ ztw$2#r?j~|sOZDDgb;a??gQuu9g9|#=*5hMt?@;l<|9ZCj1 zEcQqS#+J4WAnm_GsU-apwifKKT0X_oO;%S{=_oixDKMnfR#Oy=sa^o1lAjj6pe#zD z(w>71(70IF1Ps95E?yfF;RSSxE~(cug}_ChZD73;>RsK;YhLDP99uish%65nL|wUk z?wifwh;p@{U>OP2NYG0V_h`krC&UzFK53YewW4tCLz~K}yAe7vj9t&o30)KecRGszp2)O(re$IL+ zTFc*{gB=R3l0c!5`xArP0!JG*7)Xp)xg(CFiId6ztZ9+lf*m;#X?Sd+9!5^XepPlm z*BBRwM;+;Lnu&1cW$STl2=-bVP+bvO?VH`;75SKt@9gK zP=cW+lc`mCkoPcV_vszRmD@ex;T!wypI}$sw zSGkxS?#QQ--pnkXWY5NRFV5JZXxqG^`-*(f^#8A^j*cg=Q%EwvQ`n(iguOCU;vEN- zU@zIu0Stu`e?$pkytDqWx9in z*8g$Cq2g$-73Ta+OPoY!HRt5%7`zn?w&ua|(q`eHe*@sk&k`J?f3S72vLk}OA5cI5 zg*}x#yD71X0Gc@0j*;{@`>Ay{JS;HKi`ejso$^(&<{_@iN#8Q2QNO{J1{d~yo_1Pt>@V3Of?LefzId^#%f zyI?dh=n-Xd$mZBb8^9jWI4Ic0Yprv6TnmL0!a^CP#1Dv;TJIV0?1yu8+3rAtP#o?tr>?)Kz|DPY8472R0<|)qKOh0N-uY? zS&<-XyFRE!FFIs42kXNOVLG+K5iKBhV;cT%dqH%71kDgp)& zsgH%$$>utLqrN0_%%VK`;T9?hB)#ddsz`*2dmc9sm|w;-jCV@k;dgQ5m`sG9am$^N zZD7LSP||v>+9wG9AU6Z}%(dV<5jE4cLHkZ%)wx3X&AUmByS}`;)eFW@-42@?xiAs$ zUD#%yNQ&~RHEfPg1B)$?mBQw74TAIh`(0_S0jCS01)VNl+_IwgHLH@%qQh~!1 z0m1J#M%#181prie;{Iw`tcURn`FnB)u=|+MfosUgz+FYVBR`nS(3$e`9#cn0$fCW-{J- zKV70+l`gtvv@?pyCR?*Lt6sBYMFG-59y7P=SB=e znfRUiJj{hf^3dX+Nh}7xaD@Sn6Ca&T(u;o*fYu$urJ>lL!}}XwE0sQaf0?B>Lyt2} zVy#S4W}<1IVC(V+brX(#pBBmxQVOkZ=N~UORTS^?L5OVy4q>5yH34u8o5L4QqBNrX z!^UL!N5JFLNH!*Ei|~J=ECL)M_I!Sm2%9@WW|fvo&?u1v;jBW>IiM{R?6#etr_OVI zIQU&g6E1zW?kwuekEum?T%FjO7V1Q*h_LxLugHDNzqf$Q$Ae5xLa)JzWGHe{CZCQR zy1M;5&tk?0$|yGqfA>VKQl`K!O_QSX`$k4-0vCsQb9_!QwD9RjUu6!ie^~`!zxDX+ zf`K`#*U1MwJ(tgaiC~Ts6ug;b&hl+0412lNDn~fqdp!GdQ=2xB48v0l#V=e z-Zzy}H!z6qYkF0QIkQl*QW0Hwl;>%)y%oUdn#@N04uw9;0I2{h>Kksto%Gz=xnhgB z(YeZSjkYBO3BdYSv<0h};;DWjja)bq&Nr`_1N|zs3hw- zBNC#^WvvX>*R>2&{Jngq>f=lOCRO2GkFp!K7B#3-DVb;Dqk;iwzE<{dn~!|EcjC445>}()P{b< zz^8$<1M&7iz-aM5WDn6INCyA~X0J`n1P*oSK4CzvaFP42tD@&CoV$h|wupoLVU1mn zM$rgRiW7j@v+q{ib}?Hy6%sR)N!DCD2d>M=Vw8qZwpj7u_l8XhK(`7YN%?hUOcx5z3~@%eZ%$4vBxE_@q%u#}-1&pb$uV$*w=4)7;V|ZE5$An? z{9I;)2{=%L3P7i6YKN9$XLEdik#MMHU1S`PDU>vzxV1ANl`#~+Z7z948>~;zO@QH~ zQz`Ok=3%}-%mDYofnd6^5xE}vgClw1%oVuSe(y4S6ro{UJSJtz&cq9*;l328SEN0J ziREB3u>~nC3&n$^XmHnHao*#Xk3C>C6drl7{t7X8TVMt$0>gh7W2y;UfzHci5^E{A zAjoDwhU<$3Nf$+sDx)#@<{^$4RrO=IWjOsz6tKiD`|7ptclbNuMTurBxGQk;8EI=7 zP{QGVgCKjDSi>VyS%65N60zB!ZF-~Khd}XW<;qT)1{FR!9p&*4P%4py_sRs4A)>S^ zE@m-VKUc z!OHht{0<^eb_VU1#JXr9c77(D7hEdo+{6e*O$7S@*M{{GUMNIvWD$AqQ z&=#rOB=m@f09RTZ$vHXq+2f3{Tg&lO6GQca64!0=Aw5UE$l1pJSEU4%g$TpG9kKHIqV!5 zgeI`@2h{R>Z3Njj-G~4Lv*!?(VmAOFbH2j73`2+{U>f<1lxjT|;a-gfDPi=*#Pf9ldF&jevss!IsT^wf9EB1|385PE*HNG`qdf@G z1_m(bjwjzQW&azHfE|co3j-|^%=7{`4EHyFl}=C>HYA&4^3g?+i*I=b%s}}^8mB;l zh_!__{Zdy3=!|9@UW4(FrDYKrMZC?tZl~{q+CodO8-*y(hRh4hOK$GguBQ!f+tM?Z z`M3v{_ok4+;-Zr=Dzi1bPOQ39yGDpO^@@jVf$N6EX1)nkqCTNH#!vSt^@eyqAre-M z#C&S)u>XXeEKi}tDL~`T#6OgH#$g>>YhBZsNLr<9Zb0yh+-2C&Ar_5e3SJ_h#+$_= zmV4BVq4~PWPuncYsg;H|!n}|+cpyoIM774v zO^--5^f&-+{-;gsBT{H`)h7P&H7s@2!yT4Rk%lk|bb(1`V2F2t#L9DrR)aF&m)D{6 z*h~Y;W8X>Q8#;~v^rqD_q#p-Jx8Jb1!bs+VfewgnX`Rp0clH>+LJJEFLX&Z(9s?%% zQRO$<@Xc-+H6Ui1JKUym+-IFW&|OG!B#+gRl#z+)cx(k3OdM@aCyS$}OF$98TO?6_ z#;Mk^JQGrumPEUJ6Voflg1Q%H&UF7YFA3A78q?qTf2xXD*gn#OI_j0tEiU?!{O$}O zWj`g-VXyO9eZ8}k^C`V$c2(JQ={2~wt0nNC44eFvtO}(PCTm!q6}7$mWRE} zw!{JyaK*sQQc$>zr+Mk(A*dC%a}1f|g@+12-H$_gG3_80Sk-6uWY=;5|z`tFl0=f;#mvlGQ?zli^lD$F? z4C6mPY;}ZO!ghjx((8e3Wq!ob4Yvh2R}FF`%K4=VT-FoBtPwG{hl2|uJp#RTG!5kW z+dn9haS~>!qX0{xE@(jLur?H9`H5?dL0zIZT95I@J1-Z}>(q$Z-$R zgTrU<6Z)YW0)Efkr~;NL?7bK7rD#f~3iaa2oGV2|W;?|ByTi?Q;H6Cd((zGs?*{Q$ zqusfyzr098LnDxsBq(-oE~!X4oI|J+S_lteX$SyxV)05`L(MJShk!f)Sei_c$fz4y z{0hOQ7YeMa{Jn~oa2_EA+plYBfq@8;)`abAB-7HW7eP?IAoLL(fuVIJCMeTG?!4r$ zget<&RS@b5FuU`@EB3j}r(n-kLq%22p>bUgVaz?qKk9fOVu{EP-u}7yzJftMZiGg= zPDo7C9UVkE+XcDe_-clr*6u6RVmP3E0t<~wRJf#q-DHzwFhIG)Wx8ni@k30GP*DM|iyK_C#|&%$4$fe|X^3MP=RDL7}@U9SPeHP^N^^sb+1 zp9V2PcFt(@!BR_4!3Eksgk+W$yxv`LRVFeUHfV$v|Gz$m8G+0Y;KMtL7$C8sD&6A^ z8tt3^oyl$j9a`u{^a%e3wlpLpx}o~xJo6k3IAsLJ;0rFHy+=p7$G=cTy<>2ZLJ%Vw zh&s^MSO%6!AovQlBxTyI1!)bagEXAh#COP3Ga5GgI0E|EQKd9qYk8pG@EJMB5F#Ii z(?Zz7?-n5H1*R4AMOltZkSDu<`T+(YBfTzV(scN>_RL@AQ2z|k%$yh<9O^O%+V8H$p^x5B!&fqwM6W5HnQtZ%KgZtYJ;%-J0K`*@RNKb6 za)5XeBeyWXQX7bMpeB$(j!NVcJUvC$v^lklNjy;sn*rn15LkysA=j$g(w$pEBSLVkBB%Y88T_Bl_`FrHJ77>&`7rX90BsbvmY4IU3Ik@&d# z%V0^5Ss$(ec@&20WsU~UsdY+9r8`n&L4}b7D_!|ZNIF?#uzG?vZ&9QH2taFUa;U!) zpOopLPK<+Q2gz_+$(3+r(Is<7@|e>CBxI;{!w8eo0cxTh{@wKG1UN$!2ns5)0UiL` zS^ZJ)5peyp?GBBBF*FkE7F|35xS~-n6BFO}dnnw4UWgx2sQ|l$#kyW0O)N#s;Uh*| zBq}TXPIUZqvNQ-;&gm}{CS;h{G9Rz~#K^@VmI~y?PW@S+Bsvi^Q1QsarV|4NkOenG z+EwQX+zdIWNy2FjLjxNE0_x~>##mpRZP38KfcC8+Dk+IlBLT!>3HlPDT^PRuv#vR5 z;W~d@MG}Ja(g*~_Y`}dqie{ADK#J>}C)kdxy%WoW_3lEWpJ9`UK1P&|j*Pj2GCp zWO8?>j97(h8LiI1Fdak=rg+nF*6O7Q*-Lrtn}jy=mm??!+jXvgS}lbgqg!qHo(L5q zGnw$|r3yz`YrF|Ad6pj8!nvd{nc@)iIy2xJ3fg)d z;X;~y_gH9gr0i!OO-bO5xJUadI~D@^(*)GM85dI6=x`j^3T)idi0ST+0ZHy8e!Uew zAAn&6zXu95(GS12jO_}Eh>tLc_}5U3-GD4k6Y``J#UQCk{HX;)60)9Z53kunrzrXk z#FWflWssd;p@KC%(t9ig7xte~4F-jBIEQ>Q%xYxLyW(aav*v!r)YQuY6DY8U#_N@j z!q^OtWE{nwF}tm>Bko_+iRyxQ#u>ftBx#bmPU@1G*XHG4((<1qwqs3)v|2=Z93W^B>lK@N%1DWH4 zh-s>K6QbdX`{5=`X|U0dH8iO2L!8lTwZ5@G8LRCq07R^VY0X_96LH$gDf*#fC7 z*>*NZ#d$6hNI@Vnr~2GoDt(H}Td9 z#W+(W!}0*A3t{vR__%C4|h><<(a9k0mV89;2~y0GLbaWqfqb&Wdz+2 z3KG|Q9N3(hLI)18PI36QP$0m+oB}7zoK=gipwZ35Mh;wUPl5W9?igb(VyT3ff#^g0x^$1zxXFf!HQkK zS{puhkV&Ig{Nc*%cR(7`rnp9-8`s!kd}3fgASbXLHq zzATe?n}agP1VU6Md0b$;cBXcE9cL zVR4aVL`QsTXbZup5SGk+Wr>#~gv45ic1M~gy+@flV56X0T5vuO>3d#i*x44r;fBGWnXCgZ3w))l+TvRFz}E-@;kRK zoigNz#0I2Hp_bTx1F_l5jZz64O~lS1P(WMWYSqKy^>86z9$jj&NP;0v^krWlV2lDa zP)$LNhM)yw-Z@FZ&jhPn_K}kk7NtaQTMLI*fkKFk*aH0la&yH3TI*q9T~3T_;;Z1Y z+t*=2kKrg5fZVHPu=(nkezaBSUU)z>3|Fc`_?=El@VefO=oo!#-O*%@N=lG=0J@+x zqR5msA@8Z}2t#rRsTFu+X>W@II`HJr3KsRvHSa8Cte4vW%zrVOWb$(gIya=L&F$o8 zC!W)pomoa``&sOPNNy)jWAuZ?Rn%oh!j=Lkb>4hg*+KkM6IiJPh%is>)uF2#S2@}I zC)f9Fwm<%b41e=g!jkwC>*Hj*LPdKyL|oQ*K~DOA6erODf?pG%!i`9Ev{G_4KG-z55hx3fZ+5}ux zFll&T+^*}r;D#@5E_TJGY{}FywEI5_<gk-VGiT)19+e5*NrCbeBIB}VH$^_t0a~>~ zjTLN?6QB}6UB2u@JG%2%H!9(dsA_mf^+gn0)Jdgh;*=@P?aGNXsLTneKH&8AIwx8} zPiEIK;(Xd9%UyTw%bNqwQp9dR@lAY=E=_w>b_JZYYy?BicG)gTXLb^MH(wyr(xVwiY5GrR^@E#4%k`@6b9;KCHZZ z%L?u_GUh+{HCeE#LOvoSNMb+~aAnpUfvf!mZfG}eWeau!ARQ1TjWEb8dkAp39Vj~U zv@iG5SJew&N^U1T(A+vFra=^5vu2PrEM!F6TUH}CoL6JJZcM2#mC?`?XOy`@g)wL5 zKteUGP|MIw*v4}(AQ()W033j#<$fR)qHJ+JC5vlZwg>X zD_$6PGfZir)_HHmiaBCg4}{=Z6jOaWzLqhEi4eguCgSCnrqG0wgwkGg8&Y13uzZDN z#*>x?-GL|;`zd%;0YvDoArwX`WKaa#Rx8dVrbIP~RV6UPt-Cnt>|lp53j8Tr@fshj z@l7;VkOrIjJ`Gw^xsa&sS_)x;0c)Qi5k%+ds3yD$Bf#3c>MM?6fiA+19}qV*hiFgG zt0D4Fz=E)~Kg6+=(-{WUX(TkALind7oaCB#Yea=&TcAKDj@j5}@WE42@&fFrUg&=Y zymO9hZh!_3`Jm&_bFz{+Ym%+~jJE}KoP&fWh9{OYUVA&h0L%n|X^!?3kRZeNcv|ZN z?lr6BvY@e{w^7Zst)uFD>Kop?J#{8%t0xUE8)5DgL{V`|a-epGv(n-Pq*F|(>>0NK z>f%sQQiXmM7F7W&B(Rd8P8lYmaS23{uO+NYkda|K6kBPt}dP~TV`5-bc z2sk3(hh$&~q!HdAbcAFdkXRhNJgjhlc~JNf)FY_IE*O|*V9OD?15Jj2400KoH0WjV zp9Z28gk1q~1j!ICB)~&(kO2Y$H3-uWTpXk`NMvC7Ln4MJ40Ippe!-$cfQ2v#LKDm= z&`_YDK@);zg4PDO3WOC1Ens|rssL&N><9P?;5C3LK(zsD0=@?T2pj$Xj{m!S>;D7& z|L{IieNpqEupdodiF~W@|1tRQ@muAWsJ?#vX!z*%yTG4P{5E=f;iJZ7(0Ajn@T#4z4zC7QD2%3Ff)Ocg-i0?QXz&0ASR~&F~(D z4+FO)zwl+Ru{)gF&e(R9ye*gahqMOOdS_{`p&TZbN3} zO4>MqZ5rdExMe&rj;N5jxiq|QdR&K4@n$r5YVhF7^ggha6Y%&gcSaJzeSVDx4g+gLDYO6l@O(c_MRFWi2fFL0*d2lr) z8n#&-XQxbsNQp1-1>ZE|25lV(ItxN336wT|AOUA~<$G#-Lm;EUflWQ2PaKt!V0)2@ zjJ^F|+4&{1156y1XVhq>2He_=DqEeIy1hpzgCD+R&0^9)0J$9*>C2In3%|&ElmRjaUw6#F0}I9dQeSkV z^RzLX`Af@FJ2@Woj(}VlLHkjbhA`x+CcA>^#@fP__w;dyboTg56DwFGCb^;j5X8cR zLI{`Gb#h_5wKMp3fnJO4ppzx@>y2a(Io#{*0K_;QW;p`_@ys!fAt{OENE;VuFUsbC z40h0pe4(G)dKLkoLJvYaa^3p$CM(sf4-6kw&$s8>k>#d3MdQwty-GY+EW*B82yv!H z8Fn=-o&)#nl90Ts0VOSU&X&>=kMHhvbI0fY{(po}wG&vZJ1Jm_MJ znZg=Dkqpd@MdosKGVTZb?tb%;6?47t(q~qaF@Efi<-zN6t1FL;l|p`+*eXW$PP8xU zwWe{O_Xtuc+^SR3q|qm4G$l~R@qD`i7bMI(4}Xz8p=K+^y_=BS%Lg9Q6@x9R42G{_ z3ujo$F#cfmIf!D-V!92kt)M)q0D%-tAve2&X~N~C(5xJOS!o9sX5A#7=E-d828}6u zEb|K&T5zgCoJb4p$9EH%f$C+G{LUH~tv){r`^C=p-iX<)ZyiuM4Ejlj;Qv_AJ(c<1^(u_O? z!9h&{iHbJXecG1W(?@=BXRrQfFq_r>Ns)O5dSc{+eKeE=LOWeoQOS>{1I3Ae^qV~& zMVyz(&kg>Lss1J>_F3JQ!_(JMF8oZMFC>f!8((o%fP?>WM~N{K#TOxx2Vhi)P6SnG z)VYfB8mattOu)u&z%DmUTfB(}1hry-W*%Yg>w+FF)KGK#rMv?{gx4!L8ZvRY&?8aA z;?n6XbgqHq_MOB=vo=uJ@dBJizk1;t-NhFZbHOU^dIl=QTGU~9L~Nxz!`v4c?YE}^ z4+HBd(|2gGF>P2X@V2WdAP`hl5OzNW-tpn--;vOvJ>heyF11A#Oo;gW?0Uow;-T@b z87P-Fkc% z~9spB&5E0V2-wEC_4B>(&?nod9X8@&nMmf`& zo$*$@gQu^K+>qXKi|&%C5CBQn7X`%)XlLO0#_N}~Ut#AR2aZTmd*lP))3~cX>ZY-5 z)zaJ>3=Mgmg{PR(r*IL{;-cKyzQcsI%^R(R*z=GO28L`>2+IhR4ekE+4 zM+Gjxzqe4kWU~R-5>VMZT-3ZM(po&(PI(v(&1dv(86XaN;BvHm}^fU38+P=hf%-Z4PrXG}u{ z^{g=)0^+lVS>{0*NjXNV8&_q+Y)FC5rw3J)qxWAWsHWI1Q7czoL5fLjuNaLok>pJ0 zQivnSZfgD;R3V$T#E<_`Og=^fL87?6@mL~$cPHC8+zk`RkkHzqC2ee!6OOT25}?Au z8lo5|NxX-eBv?+_Jl(h9D~;e6g@3JwzU4b}rUS0FtbaUHZZ$m{NtvL!ESZJHISL z#$q3276qW>>e0K9BC6Lm!PDcC*mJ>96;}jV-`)zxB`?jOs*Xw=t0)s{mG?QRw~8qt zfu=rKWTTDPq=!y;1b*tE3H@nBXu_aSH~}ouMp}xlRsiQy|?8 z+=eFuOFpAznJa$ z9HP}Oq&hZZjUr$CB~(eAM!iJ*;=b?Yrx6h>^|H)MP==A9VPv1#j0hS{CaVQ1a0U*_ zOPt|Q3|tBH4>cTq2$K@~xI!3~L_nbiL8%UpJy?`vZOB>f8|q^o(U}ch?lcb}gFn9* z1|~O!l8`0`5O(Y2Oh~*GnI51ZmY26LDazLJ5qc&Ez{Mb8VGH2izKeuw*Z=?k00000 E0QL`y%>V!Z diff --git a/_static/fonts/fontawesome-webfont.svg b/_static/fonts/fontawesome-webfont.svg deleted file mode 100644 index 45fdf3383..000000000 --- a/_static/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_static/fonts/fontawesome-webfont.ttf b/_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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 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: deletedIds.sort, - splice: deletedIds.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( support.ownLast ) { - for ( key in obj ) { - return hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1, IE<9 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( indexOf ) { - return indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - while ( j < len ) { - first[ i++ ] = second[ j++ ]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if ( len !== len ) { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: function() { - return +( new Date() ); - }, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v1.10.19 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-04-18 - */ -(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" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== strundefined && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, - doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", function() { - setDocument(); - }, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", function() { - setDocument(); - }); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - 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 !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.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 - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowclip^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( 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 ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( 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.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = "
"; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - - } else if ( !(--remaining) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -}); - -/** - * Clean-up method for dom ready events - */ -function detach() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } -} - -/** - * The ready event handler and self cleanup method - */ -function completed() { - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - - -var strundefined = typeof undefined; - - - -// Support: IE<9 -// Iteration over object's inherited properties before its own -var i; -for ( i in jQuery( support ) ) { - break; -} -support.ownLast = i !== "0"; - -// Note: most support tests are defined in their respective modules. -// false until the test is run -support.inlineBlockNeedsLayout = false; - -// Execute ASAP in case we need to set body.style.zoom -jQuery(function() { - // Minified: var a,b,c,d - var val, div, body, container; - - body = document.getElementsByTagName( "body" )[ 0 ]; - if ( !body || !body.style ) { - // Return for frameset docs that don't have a body - return; - } - - // Setup - div = document.createElement( "div" ); - container = document.createElement( "div" ); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild( container ).appendChild( div ); - - if ( typeof div.style.zoom !== strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; - - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if ( val ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); -}); - - - - -(function() { - var div = document.createElement( "div" ); - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - } - - // Null elements to avoid leaks in IE. - div = null; -})(); - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( elem ) { - var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], - nodeType = +elem.nodeType || 1; - - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : - - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute("classid") === noData; -}; - - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - -function internalData( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[0], - attrs = elem && elem.attributes; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; -}; -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - // Minified: var a,b,c - var input = document.createElement( "input" ), - div = document.createElement( "div" ), - fragment = document.createDocumentFragment(); - - // Setup - div.innerHTML = "
a"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName( "tbody" ).length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild( input ); - support.appendChecked = input.checked; - - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild( div ); - div.innerHTML = ""; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - support.noCloneEvent = true; - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - } -})(); - - -(function() { - var i, eventName, - div = document.createElement( "div" ); - - // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) - for ( i in { submit: true, change: true, focusin: true }) { - eventName = "on" + i; - - if ( !(support[ i + "Bubbles" ] = eventName in window) ) { - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute( eventName, "t" ); - support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; - } - } - - // Null elements to avoid leaks in IE. - div = null; -})(); - - -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: IE < 9, Android < 4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - jQuery._removeData( doc, fix ); - } else { - jQuery._data( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
", "
" ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - col: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!support.noCloneEvent || !support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - deletedIds.push( id ); - } - } - } - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optmization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "