From 545e6defe5c59ea1f9c01a4813342610139dc9f5 Mon Sep 17 00:00:00 2001 From: David Cramer Date: Wed, 20 Oct 2010 17:01:14 -0700 Subject: [PATCH] Basic docs --- README.rst | 309 +------------- docs/Makefile | 130 ++++++ docs/_build/doctrees/config.doctree | Bin 0 -> 24931 bytes docs/_build/doctrees/environment.pickle | Bin 0 -> 15795 bytes docs/_build/doctrees/extensions.doctree | Bin 0 -> 16273 bytes docs/_build/doctrees/index.doctree | Bin 0 -> 3834 bytes docs/_build/doctrees/install.doctree | Bin 0 -> 18549 bytes docs/_build/html/.buildinfo | 4 + docs/_build/html/_sources/config.txt | 138 ++++++ docs/_build/html/_sources/extensions.txt | 107 +++++ docs/_build/html/_sources/index.txt | 16 + docs/_build/html/_sources/install.txt | 96 +++++ docs/_build/html/_static/basic.css | 509 ++++++++++++++++++++++ docs/_build/html/_static/default.css | 256 +++++++++++ docs/_build/html/_static/doctools.js | 247 +++++++++++ docs/_build/html/_static/file.png | Bin 0 -> 392 bytes docs/_build/html/_static/jquery.js | 154 +++++++ docs/_build/html/_static/minus.png | Bin 0 -> 199 bytes docs/_build/html/_static/plus.png | Bin 0 -> 199 bytes docs/_build/html/_static/pygments.css | 62 +++ docs/_build/html/_static/searchtools.js | 518 +++++++++++++++++++++++ docs/_build/html/_static/sidebar.js | 148 +++++++ docs/_build/html/_static/underscore.js | 16 + docs/_build/html/config.html | 250 +++++++++++ docs/_build/html/extensions.html | 205 +++++++++ docs/_build/html/genindex.html | 90 ++++ docs/_build/html/index.html | 127 ++++++ docs/_build/html/install.html | 210 +++++++++ docs/_build/html/objects.inv | Bin 0 -> 205 bytes docs/_build/html/search.html | 96 +++++ docs/_build/html/searchindex.js | 1 + docs/conf.py | 217 ++++++++++ docs/config.rst | 138 ++++++ docs/extensions.rst | 107 +++++ docs/index.rst | 16 + docs/install.rst | 96 +++++ docs/make.bat | 155 +++++++ 37 files changed, 4113 insertions(+), 305 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/_build/doctrees/config.doctree create mode 100644 docs/_build/doctrees/environment.pickle create mode 100644 docs/_build/doctrees/extensions.doctree create mode 100644 docs/_build/doctrees/index.doctree create mode 100644 docs/_build/doctrees/install.doctree create mode 100644 docs/_build/html/.buildinfo create mode 100644 docs/_build/html/_sources/config.txt create mode 100644 docs/_build/html/_sources/extensions.txt create mode 100644 docs/_build/html/_sources/index.txt create mode 100644 docs/_build/html/_sources/install.txt create mode 100644 docs/_build/html/_static/basic.css create mode 100644 docs/_build/html/_static/default.css create mode 100644 docs/_build/html/_static/doctools.js create mode 100644 docs/_build/html/_static/file.png create mode 100644 docs/_build/html/_static/jquery.js create mode 100644 docs/_build/html/_static/minus.png create mode 100644 docs/_build/html/_static/plus.png create mode 100644 docs/_build/html/_static/pygments.css create mode 100644 docs/_build/html/_static/searchtools.js create mode 100644 docs/_build/html/_static/sidebar.js create mode 100644 docs/_build/html/_static/underscore.js create mode 100644 docs/_build/html/config.html create mode 100644 docs/_build/html/extensions.html create mode 100644 docs/_build/html/genindex.html create mode 100644 docs/_build/html/index.html create mode 100644 docs/_build/html/install.html create mode 100644 docs/_build/html/objects.inv create mode 100644 docs/_build/html/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/conf.py create mode 100644 docs/config.rst create mode 100644 docs/extensions.rst create mode 100644 docs/index.rst create mode 100644 docs/install.rst create mode 100644 docs/make.bat diff --git a/README.rst b/README.rst index 40e5b44..f0573bf 100644 --- a/README.rst +++ b/README.rst @@ -1,311 +1,10 @@ -------------- -django-sentry -------------- +------ +Sentry +------ Sentry provides you with a generic interface to view and interact with your error logs. By default, it will catch any exception thrown by Django and store it in a database. With this it allows you to interact and view near real-time information to discover issues and more easily trace them in your application. -========== -Screenshot -========== - -.. image:: http://dl.dropbox.com/u/116385/Screenshots/l6xk.png - -============ -Requirements -============ - - - **Django >= 1.2** (to use a secondary database to store error logs) - - **django-indexer** (stores metadata indexes) - - **django-paging** - -========= -Upgrading -========= - -If you use South migrations, simply run:: - - python manage.py migrate sentry - -If you don't use South, then start. - -======= -Install -======= - -The easiest way to install the package is via pip:: - - pip install django-sentry --upgrade - -OR, if you're not quite on the same page (work on that), with setuptools:: - - easy_install django-sentry - -Once installed, update your settings.py and add ``sentry``, ``sentry.client``, ``indexer``, and ``paging`` to ``INSTALLED_APPS``:: - - INSTALLED_APPS = ( - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - - # don't forget to add the dependancies! - 'indexer', - 'paging', - 'sentry', - 'sentry.client', - ... - ) - -We also highly recommend setting ``TEMPLATE_DEBUG=True`` in your environment (not to be confused with ``DEBUG``). This will allow -Sentry to receive template debug information when it hits a syntax error. - -Finally, run ``python manage.py syncdb`` to create the database tables. - -(If you use South, you'll need to use ``python manage.py migrate sentry``) - -========================= -Error Handling Middleware -========================= - -If you already have middleware in place that handles ``process_exception`` you will need to take extra care when using Sentry. - -For example, the following middleware would suppress Sentry logging due to it returning a response:: - - class MyMiddleware(object): - def process_exception(self, request, exception): - return HttpResponse('foo') - -To work around this, you can either disable your error handling middleware, or add something like the following:: - - from django.core.signals import got_request_exception - class MyMiddleware(object): - def process_exception(self, request, exception): - # Make sure the exception signal is fired for Sentry - got_request_exception.send(sender=self, request=request) - return HttpResponse('foo') - -Or, alternatively, you can just enable Sentry responses:: - - from sentry.client.models import sentry_exception_handler - class MyMiddleware(object): - def process_exception(self, request, exception): - # Make sure the exception signal is fired for Sentry - sentry_exception_handler(request=request) - return HttpResponse('foo') - -========================== -Multi-server configuration -========================== - -To configure Sentry for use in a multi-server environment, first you'll want to configure your Sentry server (not your application):: - - INSTALLED_APPS = [ - ... - 'indexer', - 'paging', - 'sentry', - 'sentry.client', - ] - - SENTRY_KEY = '0123456789abcde' - -And on each of your application servers, specify the URL of the Sentry server, add ``sentry.client`` to ``INSTALLED_APPS``, and specify the same key used in your Sentry server's settings:: - - # This should be the absolute URI of sentries store view - SENTRY_REMOTE_URL = 'http://your.sentry.server/sentry/store/' - - INSTALLED_APPS = [ - ... - 'sentry.client', - ] - - SENTRY_KEY = '0123456789abcde' - -You may also specify an alternative timeout to the default (which is 5 seconds) for all outgoing logging requests (only works with python 2.6 and above):: - - SENTRY_REMOTE_TIMEOUT = 5 - -Sentry also allows you to support high availability by pushing to multiple servers:: - - SENTRY_REMOTE_URL = ['http://server1/sentry/store/', 'http://server2/sentry/store/'] - -============================ -Integration with ``logging`` -============================ - -django-sentry supports the ability to directly tie into the ``logging`` module. To use it simply add ``SentryHandler`` to your logger:: - - import logging - from sentry.client.handlers import SentryHandler - - logging.getLogger().addHandler(SentryHandler()) - - # Add StreamHandler to sentry's default so you can catch missed exceptions - logger = logging.getLogger('sentry.errors') - logger.propagate = False - logger.addHandler(logging.StreamHandler()) - -You can also use the ``exc_info`` and ``extra=dict(url=foo)`` arguments on your ``log`` methods. This will store the appropriate information and allow django-sentry to render it based on that information:: - - logging.error('There was some crazy error', exc_info=sys.exc_info(), extra={'url': request.build_absolute_uri()}) - -You may also pass additional information to be stored as meta information with the event. As long as the key -name is not reserved and not private (_foo) it will be displayed on the Sentry dashboard. To do this, pass it as ``data`` within -your ``extra`` clause:: - - logging.error('There was some crazy error', exc_info=sys.exc_info(), extra={ - # Optionally pass a request and we'll grab any information we can - 'request': request, - - # Otherwise you can pass additional arguments to specify request info - 'view': 'my.view.name', - 'url': request.build_absolute_url(), - - 'data': { - # You may specify any values here and Sentry will log and output them - 'username': request.user.username - } - }) - -=========================== -Other configuration options -=========================== - -Several options exist to configure django-sentry via your ``settings.py``: - -############# -SENTRY_CLIENT -############# - -In some situations you may wish for a slightly different behavior to how Sentry communicates with your server. For -this, Sentry allows you to specify a custom client:: - - SENTRY_CLIENT = 'sentry.client.base.SentryClient' - -In addition to the default client (which will handle multi-db and REMOTE_URL for you) we also include two additional options: - -##################################### -sentry.client.log.LoggingSentryClient -##################################### - -Pipes all Sentry errors to a named logger: ``sentry``. If you wish to use Sentry in a strictly client based logging mode -this would be the way to do it. - -####################################### -sentry.client.celery.CelerySentryClient -####################################### - -Integrates with the Celery message queue (http://celeryproject.org/). To use this you will also need to add ``sentry.client.celery`` to ``INSTALLED_APPS`` for ``tasks.py`` auto discovery. You may also specify ``SENTRY_CELERY_ROUTING_KEY`` to change the task queue -name (defaults to ``sentry``). - -############# -SENTRY_ADMINS -############# - -On smaller sites you may wish to enable throttled emails, we recommend doing this by first -removing the ``ADMINS`` setting in Django, and adding in ``SENTRY_ADMINS``:: - - ADMINS = () - SENTRY_ADMINS = ('root@localhost',) - -This will send out a notification the first time an error is seen, and the first time an error is -seen after it has been resolved. - - -############## -SENTRY_TESTING -############## - -Enabling this setting allows the testing of Sentry exception handler even if Django DEBUG is enabled. - -Default value is ``False`` - -.. note:: Normally when Django DEBUG is enabled the Sentry exception handler is immediately skipped - -########### -SENTRY_NAME -########### - -This will override the ``server_name`` value for this installation. Defaults to ``socket.get_hostname()``. - -===== -Usage -===== - -Set up a viewer server (or use your existing application server) and add sentry to your INSTALLED_APPS and your included URLs:: - - # urls.py - urlpatterns = patterns('', - (r'^admin/', include(admin.site.urls)), - (r'^sentry/', include('sentry.urls')), - ) - -Now enjoy your beautiful new error tracking at ``/sentry/``. - -======= -Plugins -======= - -_The plugin interface is a work in progress and will most likely change before a final version._ - -Add plugins to your installed apps, and voila:: - - INSTALLED_APPS = [ - ... - 'sentry.plugins.sentry_servers', - 'sentry.plugins.sentry_sites', - 'sentry.plugins.sentry_urls', - ] - -More and better docs coming soon. - -=== -API -=== - -For the technical, here's some further docs: - -If you wish to access these within your own views and models, you may do so via the standard model API:: - - from sentry.models import Message, GroupedMessage - - # Pull the last 10 unresolved errors. - GroupedMessage.objects.filter(status=0).order_by('-last_seen')[0:10] - -You can also record errors outside of handler if you want:: - - from sentry.client.base import SentryClient - - try: - ... - except Exception, exc: - SentryClient().create_from_exception([exc_info=None, url=None, view=None]) - -If you wish to log normal messages (useful for non-``logging`` integration):: - - from sentry.client.base import SentryClient - import logging - - SentryClient().create_from_text('Message Message'[, level=logging.WARNING, url=None]) - -Both the ``url`` and ``level`` parameters are optional. ``level`` should be one of the following: - -* ``logging.DEBUG`` -* ``logging.INFO`` -* ``logging.WARNING`` -* ``logging.ERROR`` -* ``logging.FATAL`` - -If you have a custom exception class, similar to Http404, or something else you don't want to log, -you can also add ``skip_sentry = True`` to your exception class or instance, and sentry will simply ignore -the error. - -===== -Notes -===== - -* sentry-client will automatically integrate with django-idmapper. -* sentry-client supports South migrations. \ No newline at end of file +See the included docs for more information. \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..c2f455a --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Sentry.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Sentry.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Sentry" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Sentry" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/docs/_build/doctrees/config.doctree b/docs/_build/doctrees/config.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3cb17c440d40556b2d2c7ecc8e36b79e0e8645b8 GIT binary patch literal 24931 zcmeHP2Y4LC*)|3joo%^cim~y60iD1;VX840Ft!21SvIx~&VV?b?pE59Pj|Q9-bog) z^xk{#y#&$=3F(1UQb|upNbjUqlKk)c&F*PW7A^b`lK=PPXW!GzH#6V&&NpReX6KBt zxqLZSs}_o0qEyb?UW|YC+ofvE-JmNwaBoGX`l3cWR>k2|G3JsYC^ zwPLlf(6eR07OPRB*<@C(I*9V@D)aK(sqMAYbg$NptgE1_T*~C_9?zZTyVFz6m8^Jn zrr-9wY%e&P(do`iHRoy~ASL6KYm&3wt=m(vyqzltddzB1&B)fO<(_i6S}IrVj91M{ z)!pXkEm9L`ZXxfv+xqTyac6vL#wb*8?@UN-7a@8fiC!2IJ=>X>nqnwg7|^_f(^L-% zNS@=wQj-EHrFgD0DK&F6f_HQ#rMW-@H9Jb}!p8WWoT;g1B^J~N z#O_>6P0TrkVjg6<^E=&LMmnTt=g4==-4*`0oA0*3A0;~&&>ByTNsR~pbiY<-Y-)TE zzWc~*#I8uKRLH@}W9}a5#c+bQ6db^7%jX1yOWO*2z%G_6bpEz{U$)d+hL-g1Hna(^ z&6tu9uj(#1_e^)8?rLHYCAyCxaGZo8Lt5WE$fhu>A@9q^(P0ZISl=IxZ zJKcR!6LQ6@=i#q?JKgOT>g?w1?ksfL zQsXp*yTXCiE8`AyJ=}qcM>tUINC!Hta-hjkH3tefL9s`VEVaYlgx(`LN>Qu9Tf6VB zfg%ozT~_PP*18>5>{{PF2EnN@!`e7|QjK-0#(JvJK{ZlT<5*{>EHydKY0graaiKEl zxI=3<`0nwvmQ8*23pe!>P}o{yx}!FqsD*X1u#;F=hJ|&pq{d>po#ad9orA4;-?eEg z%h{l|j^qlSn?+Yyabj){^zQXth{x0CLhp`py<@Vi_3DULPg$&*XIq7mm9?S`&9X}a z1u2*4ybG+J0=(23D%Vs<2Wfgq7lgt#jTW7P*3Y@qD*Rn%^)=)xdJ^s18yr zRBg!?Gu_23Js0h@_dfgXxBub;vfa77 z-Qo^KJYq_NdhW^eic`=(Z|W~D@hVvid#9!*R>W2>bA9^9Y4nuS*|nTO$2pVkau(gC zDRh^!;V%Cs+s=V=oa?*ifnM#222BUWrg^^aUO?6#2kXm9c?)wJJDYQ?a?fV%2D1jv zE4&4kSFv-2o*@f!2`jZONn!pBTC)*bU}f`ptECGBU2L*lU5)kI)dgXc9nIFm zsA6rjhuAOV*)eS1x?8;ZJO(ZL!r}UJv>9Kd&G=&0#wDzrOIb~qv0g4`z03^j<%&2e zX8mhpzI!E@zsh&7CdIE+8P~w_^K0_>Icf zP2}rl@^uUOx|Mw0#&&!@$Ku;T)$mj|s8sh37Yt8zUSl`+)C0$Vg7dH}@6yA!_@uYWpT?`v|ptl-jiAM@QOLI-_pxVwJRcR$X0 zzX|oepS3)2z+Uu(>|Piu^1qa$Z=GpF>67_(rzP{X8n?3%>hB z*1{WG(=VYCo;0q*F5_w6{W6u_9`putp`hh=tXjQtO{xPecwhG`k($$H_|uiSKU_E}5wf8O7-cDideH*p+;@Lj~_P*o0-wj>+>0#G?)_1>0{W_?hc`s1UhD(+Q zJ&ykzJ-k|_QkJUa6ngOQ~rcz{gh_S56$`+%;Mnv8ffMI9EAMBcYjICU#l{H1;d{mc7*4A z_t$lz&7`SKh7-)lsCr~8`-(dt9Lt^3gL$n)>%Lw_LceuV~Ml*)-GG}=LCJDjtADrRtVE~cNvFYzKqwu5k zvx!iB2OuVJS^{RAGKb;G^aSJ^kRx*u1a)@=_%aXApw9ZJ3M$lT<6MrFiWeNQRBR_B zmOdZ(G%SLJ9f}vsnoM7U4kTX?tk7Y&s}{I0fe;R$5!q2CNYGrK%j+4*=+JXW`I?kSy2O*0z z9)#@001&b_5rphR1R?tpLCAhUIu1*qXidcUI%GjOHE!cC*8piZRFt)&En7?3-f|D!gpjDQ-O`cR0?b?X8_n(K?EBsiD2V! zBG@uO3O0Gd< z-R|HmM%HS&V}f+_H8dcO?m<(J^+>tjyt)hpFPjO+G$_vsL>tVB#e$THUb~vqh8Ay4 zpgji7Fy0^?Z*7gm=3C3KPO-i!cD6r|(s_o?K(NFRPMI;s<`g7{2{x7yF?sGUV5vKA z*_(29g)8}7W3-BSnPQ97}}P97lwgq=D>27KEM121X>)|6dcYuqKWN zZ)im)0DL(S&#)EI!*!0KV^OEZpJd|GPoYI^2wX~Mx?BP`gAAN1Qz-S6F>G*Qtg8!q z50YJ)FXXE6niQ8}d##mm(yN=A9+&O3Ve0sV80>30<-CW%iAw{61-#ao7k}oDwQ#td z6zFy=Mf%OACX3S9w$(U9qSa#~Di7B#RITnTy&mONooqFl93xr=mW>?Iy3|@YUzU+@ zzHTC%GDk$0l_$a(Z6KX-zt9_)(i0@y^sLy4#1a!ipO6>ybluSgIEi}7_?DS z7K4K%*+D0Bk5T05(*Ju)!t51|h-*56EtpMQ{+R5|inP$T-YaY6yeU z0{~wJ@eF;1%0zqIaY&`rFPlt~Ax(0!Ns=CpJ_R9-cAct{ejvGRVAm)vB&RVgOgvp> zVd5DKfQe@kVd7atn0Pi3CY}R~ns_e5le&jJij&HDh=#T21AMsv&(K<`7`1k$TDzG; z%Y`O`i!_6aO$J)pDBdrZAij}_OEukPK{`$&gC-)EQx=wAp>eSMN(R94tBA1tY9cJZ zh6u~A1x78uj^WAlmdF!bv|NurVd)J3Uv9)Rw3I4DEv?bge@6qAn~aJ#tBSW671RGd zb#8?Q_1X&O1h=Vjw+G6(hFos)n6We7(t!gEHn#t;lv&0e0d~1h9

?ZCSw4SUb+8 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 EKc~i+%K!iX literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/extensions.doctree b/docs/_build/doctrees/extensions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..35dbfb19c73a8ae0ed8f0f17544aeff655c339ac GIT binary patch literal 16273 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e21937348ba8db85e389065b93f3d25dbb91b85c GIT binary patch literal 3834 zcmeHK=bsx#89twVMY8XFc3c9s$x;Fr$VqXW*v3E%i3#OE6nm1Rh-I`p(u}>@-FIg8 zBoUUxK%5-C_uhLCz4zXG@4fvAJhNJz&-V*o!dJej%)IaOKF{0chVdXwg3PMO)Z!!* zrs}?SMQp3I;iA(tp3}y8R*896*g+}`ZOUn4X>x3A%;1b3&}74~Z6<3Ot1QeUu^)=I zp{bmv*=)+S5q?(~!#lWJX;PKV2AS5l>zgFgfuPL|Rt-gvXzp&)mIm9-Gn=%N#Kwsg zzOh_enpxbyrW^_t8k)^%tDIz$C4@P{rUR*>5N2sxleVu9$%w$&uF`pkXh%*v5s~J- z62LAt#wLLjm}s{ghuI;p^VgfvBGp-}0?<^Y+btae33Xsqt?wp}JHt9}mDu}o-_;%+e-GxoJcyLNP-Y;y@UD-xQ(%qUgFXuR$7~Z<5Nq3i% zJY$<86$`q@;y6r}Qq#q9T!OfT`Sl?~)Cj@Wz*{}1OXlUSLi^)G?f1*wa)&%$?veZ0 zL~)cZm4JI-UIOH064)-6Ky*+7%pnN~hcgM!vh;V)_3loHKJxC!S|9fUQ}@p4K5#9a zzk1f);? z=m#QoN#|LqlV0q#2HvqEBMRHbCR(^_Dh7^_Ti)VE)VymQFe{a*;y)fmNpA=kxC)RC zj>A@fj0M-87Cc(8stapzJJH>uid-C_GC{H|w5N>85VyP5h1aU!Mnwb9>LOq%x(-AU z9#7LqAqK#%(f!tlTUq6ou52RMNr=mg$068J&#$p1C?A2fI{ zl7BI$hq&Z-dK|sgs}|kDBylt#e}!%8L`jPtzv6rr-dnDL1P);6AP6?)I*vlW zYd5Jg-&mSL^HnisLllubL#k2qj39~IszWEw(5c2!6-UrdL~M}HhN3gn6>L(fFvOUM zSJ)O62T_I^RuSwbO-kpblqY2**mRfoL)5P%S{%f9MkdzO zql5iZwKVQfZ;g}_g(2!Y9S8GlW2O~7Vd(&z+!o8%ImVyp^v)gQPjZZ3&#D2Mg+f;X zFE`|Lnr%2LuQN`FC%f{V8zsY2vX%f1F4@>-^pn`Q4ulkXYJ<(J4)9_w-I&uEHjR(N zX>?OgH?ui2=(du`ADuL`(xj)cZRd>t;`Y;<^bEFR-EqJ8>zPe@7OMox7H!MWvzzoB zhmUO;?HR?qdoI?BRfK0ZlIJz)`3_c^Xp8`QL4!@Juv|G_h?QezEfzyBYSN3@%*fdg zz)Ny^DVsxLD~&b7$F|ZD*3iqE^l~RqY${S01L`vlVDOC%HfvC2sgIO&JB*<>K}cl$8aQue z6T{*E7B&-M!^x2FI3EgnD;q~)y^U3h#Id}a(%T)xf?Pjxs}a2eYsVIZfo(A!?tAaV z`X_m0%LDIPoM1C0h;qYucSByjP;Lf>D3?RU%O%2=^W~=fX0$BH=K?XruSC ziBPn%4!y6z<^losM_cb)0Ix6xo78dj=@qt7#LM)VMj2OXL>3~BZbYAT^!3vOSyt>IF^>#=4)x?X zK^rVuc^UENSJ>v^`s};xr7r-c%h5Gi_C>f@M?8IrO=PycaG1W#s^xW;&|krA6|a?u zzRD`a$pwQx|24MN$C|@ipt9uU>kU>x1*dSR`t%JnrV4f|zo$Yp^KUNVO>%A?(YM$H zJ8?B!f16E>o+RI4hi>a)|6Nuowo2|4`5y2WS#p-Q@1r7|{HsO#19m}Kw7p)hmJY1M z^5u#)6w7s-GyrOR@)kDh8kK)G@*lHt71B@OAJg3}@ufgNU158Me69R8r{Bprxx*l>);=bO^ literal 0 HcmV?d00001 diff --git a/docs/_build/doctrees/install.doctree b/docs/_build/doctrees/install.doctree new file mode 100644 index 0000000000000000000000000000000000000000..07f2ed058bbff4ad84a2a4ff3a7fd70d4ed7de98 GIT binary patch literal 18549 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 0000000..b00df92 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 979b7d2cf813e4c8ee7f1aafccd2b79b +tags: fbb0d17656682115ca4d033fb2f83ba1 diff --git a/docs/_build/html/_sources/config.txt b/docs/_build/html/_sources/config.txt new file mode 100644 index 0000000..62d43a7 --- /dev/null +++ b/docs/_build/html/_sources/config.txt @@ -0,0 +1,138 @@ +Configuration +============= + +Multi-server configuration +-------------------------- + +To configure Sentry for use in a multi-server environment, first you'll want to configure your Sentry server (not your application):: + + INSTALLED_APPS = [ + ... + 'indexer', + 'paging', + 'sentry', + 'sentry.client', + ] + + SENTRY_KEY = '0123456789abcde' + +And on each of your application servers, specify the URL of the Sentry server, add ``sentry.client`` to ``INSTALLED_APPS``, and specify the same key used in your Sentry server's settings:: + + # This should be the absolute URI of sentries store view + SENTRY_REMOTE_URL = 'http://your.sentry.server/sentry/store/' + + INSTALLED_APPS = [ + ... + 'sentry.client', + ] + + SENTRY_KEY = '0123456789abcde' + +You may also specify an alternative timeout to the default (which is 5 seconds) for all outgoing logging requests (only works with python 2.6 and above):: + + SENTRY_REMOTE_TIMEOUT = 5 + +Sentry also allows you to support high availability by pushing to multiple servers:: + + SENTRY_REMOTE_URL = ['http://server1/sentry/store/', 'http://server2/sentry/store/'] + +Integration with ``logging`` +---------------------------- + +django-sentry supports the ability to directly tie into the ``logging`` module. To use it simply add ``SentryHandler`` to your logger:: + + import logging + from sentry.client.handlers import SentryHandler + + logging.getLogger().addHandler(SentryHandler()) + + # Add StreamHandler to sentry's default so you can catch missed exceptions + logger = logging.getLogger('sentry.errors') + logger.propagate = False + logger.addHandler(logging.StreamHandler()) + +You can also use the ``exc_info`` and ``extra=dict(url=foo)`` arguments on your ``log`` methods. This will store the appropriate information and allow django-sentry to render it based on that information:: + + logging.error('There was some crazy error', exc_info=sys.exc_info(), extra={'url': request.build_absolute_uri()}) + +You may also pass additional information to be stored as meta information with the event. As long as the key +name is not reserved and not private (_foo) it will be displayed on the Sentry dashboard. To do this, pass it as ``data`` within +your ``extra`` clause:: + + logging.error('There was some crazy error', exc_info=sys.exc_info(), extra={ + # Optionally pass a request and we'll grab any information we can + 'request': request, + + # Otherwise you can pass additional arguments to specify request info + 'view': 'my.view.name', + 'url': request.build_absolute_url(), + + 'data': { + # You may specify any values here and Sentry will log and output them + 'username': request.user.username + } + }) + +Other Settings +-------------- + +Several options exist to configure django-sentry via your ``settings.py``: + +############# +SENTRY_CLIENT +############# + +In some situations you may wish for a slightly different behavior to how Sentry communicates with your server. For +this, Sentry allows you to specify a custom client:: + + SENTRY_CLIENT = 'sentry.client.base.SentryClient' + +In addition to the default client (which will handle multi-db and REMOTE_URL for you) we also include two additional options: + +******************* +LoggingSentryClient +******************* + +Pipes all Sentry errors to a named logger: ``sentry``. If you wish to use Sentry in a strictly client based logging mode +this would be the way to do it. + + SENTRY_CLIENT = 'sentry.client.log.LoggingSentryClient' + +****************** +CelerySentryClient +****************** + +Integrates with the Celery message queue (http://celeryproject.org/). To use this you will also need to add ``sentry.client.celery`` to ``INSTALLED_APPS`` for ``tasks.py`` auto discovery. You may also specify ``SENTRY_CELERY_ROUTING_KEY`` to change the task queue +name (defaults to ``sentry``). + + SENTRY_CLIENT = 'sentry.client.celery.CelerySentryClient' + +############# +SENTRY_ADMINS +############# + +On smaller sites you may wish to enable throttled emails, we recommend doing this by first +removing the ``ADMINS`` setting in Django, and adding in ``SENTRY_ADMINS``:: + + ADMINS = () + SENTRY_ADMINS = ('root@localhost',) + +This will send out a notification the first time an error is seen, and the first time an error is +seen after it has been resolved. + + +############## +SENTRY_TESTING +############## + +Enabling this setting allows the testing of Sentry exception handler even if Django DEBUG is enabled. + +Default value is ``False`` + +.. note:: Normally when Django DEBUG is enabled the Sentry exception handler is immediately skipped + +########### +SENTRY_NAME +########### + +This will override the ``server_name`` value for this installation. Defaults to ``socket.get_hostname()``. \ No newline at end of file diff --git a/docs/_build/html/_sources/extensions.txt b/docs/_build/html/_sources/extensions.txt new file mode 100644 index 0000000..f17bb87 --- /dev/null +++ b/docs/_build/html/_sources/extensions.txt @@ -0,0 +1,107 @@ +Extending Sentry +================ + +There are several interfaces currently available to extend Sentry. These are a work in +progress and the API is not frozen. + +.. note:: + + If you write a plugin be prepared to maintain it until we're content with the API. + +Bundled Plugins +--------------- + +Sentry includes several plugins by default. To enable a plugin, it's as simple as adding it to +your ``INSTALLED_APPS``:: + + INSTALLED_APPS = [ + ... + 'sentry.plugins.sentry_servers', + 'sentry.plugins.sentry_sites', + 'sentry.plugins.sentry_urls', + ] + +Servers +******* + +Enables a list of most seen servers in the message details sidebar, as well +as a dedicated panel to view all servers a message has been seen on. + +:: + + INSTALLED_APPS = [ + 'sentry.plugins.sentry_servers', + ] + +URLs +**** + +Enables a list of most seen urls in the message details sidebar, as well +as a dedicated panel to view all urls a message has been seen on. + +:: + + INSTALLED_APPS = [ + 'sentry.plugins.sentry_urls', + ] + +Sites +***** + +.. versionadded:: 1.3.13 + +Enables a list of most seen sites in the message details sidebar, as well +as a dedicated panel to view all sites a message has been seen on. + +:: + + INSTALLED_APPS = [ + 'sentry.plugins.sentry_sites', + ] + +Building Plugins +---------------- + +*The plugin interface is a work in progress and the API is not frozen.** + +More and better docs coming soon. + +API +--- + +For the technical, here's some further docs: + +If you wish to access these within your own views and models, you may do so via the standard model API:: + + from sentry.models import Message, GroupedMessage + + # Pull the last 10 unresolved errors. + GroupedMessage.objects.filter(status=0).order_by('-last_seen')[0:10] + +You can also record errors outside of handler if you want:: + + from sentry.client.base import SentryClient + + try: + ... + except Exception, exc: + SentryClient().create_from_exception([exc_info=None, url=None, view=None]) + +If you wish to log normal messages (useful for non-``logging`` integration):: + + from sentry.client.base import SentryClient + import logging + + SentryClient().create_from_text('Message Message'[, level=logging.WARNING, url=None]) + +Both the ``url`` and ``level`` parameters are optional. ``level`` should be one of the following: + +* ``logging.DEBUG`` +* ``logging.INFO`` +* ``logging.WARNING`` +* ``logging.ERROR`` +* ``logging.FATAL`` + +If you have a custom exception class, similar to Http404, or something else you don't want to log, +you can also add ``skip_sentry = True`` to your exception class or instance, and sentry will simply ignore +the error. \ No newline at end of file diff --git a/docs/_build/html/_sources/index.txt b/docs/_build/html/_sources/index.txt new file mode 100644 index 0000000..49c8973 --- /dev/null +++ b/docs/_build/html/_sources/index.txt @@ -0,0 +1,16 @@ +Sentry +====== + +Sentry provides you with a generic interface to view and interact with your error logs. By +default, it will catch any exception thrown by Django and store it in a database. With this +it allows you to interact and view near real-time information to discover issues and more +easily trace them in your application. + +.. toctree:: + :maxdepth: 2 + + install + config + extensions + +.. image:: http://dl.dropbox.com/u/116385/Screenshots/l6xk.png \ No newline at end of file diff --git a/docs/_build/html/_sources/install.txt b/docs/_build/html/_sources/install.txt new file mode 100644 index 0000000..1ec540d --- /dev/null +++ b/docs/_build/html/_sources/install.txt @@ -0,0 +1,96 @@ +Install +======= + +If you haven't already, start by downloading Sentry. The easiest way is with *pip*:: + + pip install django-sentry --upgrade + +Or with *setuptools*:: + + easy_install django-sentry -U + +Once installed, update your settings.py and add ``sentry``, ``sentry.client``, ``indexer``, and ``paging`` to ``INSTALLED_APPS``:: + + INSTALLED_APPS = ( + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + + # don't forget to add the dependancies! + 'indexer', + 'paging', + 'sentry', + 'sentry.client', + ... + ) + +We also highly recommend setting ``TEMPLATE_DEBUG=True`` in your environment (not to be confused with ``DEBUG``). This will allow +Sentry to receive template debug information when it hits a syntax error. + +Finally, run ``python manage.py syncdb`` to create the database tables. + +.. note:: + + We recommend using South for migrations, in which you would run ``python manage.py migrate sentry`` instead of ``syncdb`` + +.. seealso:: + + See :doc:`extensions` for information on additional plugins and functionality included. + +Requirements +------------ + +If you're installing it by hand, you'll need to fulfill the following requirements: + + - **Django >= 1.1** + - **django-indexer** (stores metadata indexes) + - **django-paging** + +Upgrading +--------- + +Upgrading Sentry is fairly painless with South migrations:: + + python manage.py migrate sentry + +If you don't use South, then start. + +Caveats +------- + +######################### +Error Handling Middleware +######################### + +If you already have middleware in place that handles ``process_exception`` you will need to take extra care when using Sentry. + +For example, the following middleware would suppress Sentry logging due to it returning a response:: + + class MyMiddleware(object): + def process_exception(self, request, exception): + return HttpResponse('foo') + +To work around this, you can either disable your error handling middleware, or add something like the following:: + + from django.core.signals import got_request_exception + class MyMiddleware(object): + def process_exception(self, request, exception): + # Make sure the exception signal is fired for Sentry + got_request_exception.send(sender=self, request=request) + return HttpResponse('foo') + +Or, alternatively, you can just enable Sentry responses:: + + from sentry.client.models import sentry_exception_handler + class MyMiddleware(object): + def process_exception(self, request, exception): + # Make sure the exception signal is fired for Sentry + sentry_exception_handler(request=request) + return HttpResponse('foo') + +Deprecation Notes +----------------- + +Milestones releases are 1.3 or 1.4, and our deprecation policy is to a two version step. For example, +a feature will be deprecated in 1.3, and completely removed in 1.4. \ No newline at end of file diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 0000000..69f30d4 --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,509 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2010 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; +} + +img { + border: 0; +} + +/* -- 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 { + 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; +} + +.align-left { + text-align: left; +} + +.align-center { + clear: both; + 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.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; +} + +/* -- 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; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.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; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; +} + +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; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + 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; + } +} diff --git a/docs/_build/html/_static/default.css b/docs/_build/html/_static/default.css new file mode 100644 index 0000000..2a3ac13 --- /dev/null +++ b/docs/_build/html/_static/default.css @@ -0,0 +1,256 @@ +/* + * default.css_t + * ~~~~~~~~~~~~~ + * + * Sphinx stylesheet -- default theme. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + + + +/* -- hyperlink styles ------------------------------------------------------ */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:visited { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + + + +/* -- body styles ----------------------------------------------------------- */ + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +th { + background-color: #ede; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +} + +.viewcode-back { + font-family: sans-serif; +} + +div.viewcode-block:target { + background-color: #f4debf; + border-top: 1px solid #ac9; + border-bottom: 1px solid #ac9; +} \ No newline at end of file diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 0000000..eeea95e --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,247 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilties for all documentation. + * + * :copyright: Copyright 2007-2010 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; +}; + +/** + * small function to check if an array contains + * a given item. + */ +jQuery.contains = function(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == item) + return true; + } + return false; +}; + +/** + * 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); + }); +}; + +/** + * 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 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('

') + .appendTo($('.sidebar .this-page-menu')); + } + }, + + /** + * 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() { + $('.sidebar .this-page-menu li.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/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d18082e397e7e54f20721af768c4c2983258f1b4 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js new file mode 100644 index 0000000..7c24308 --- /dev/null +++ b/docs/_build/html/_static/jquery.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..da1c5620d10c047525a467a425abe9ff5269cfc2 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1SHkYJtzcHoCO|{#XvD(5N2eUHAey{$X?>< z>&kweokM_|(Po{+Q=kw>iEBiObAE1aYF-J$w=>iB1I2R$WLpMkF=>bh=@O1TaS?83{1OVknK< z>&kweokM`jkU7Va11Q8%;u=xnoS&PUnpeW`?aZ|OK(QcC7sn8Z%gHvy&v=;Q4jejg zV8NnAO`-4Z@2~&zopr02WF_WB>pF literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 0000000..1a14f2a --- /dev/null +++ b/docs/_build/html/_static/pygments.css @@ -0,0 +1,62 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #303030 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0040D0 } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 0000000..5cbfe00 --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,518 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilties for the full-text search. + * + * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words, hlwords is the list of normal, unstemmed + * words. the first one is used to find the occurance, the + * latter for highlighting it. + */ + +jQuery.makeSearchSummary = function(text, keywords, hlwords) { + var textLower = text.toLowerCase(); + var start = 0; + $.each(keywords, function() { + var i = textLower.indexOf(this.toLowerCase()); + if (i > -1) + start = i; + }); + start = Math.max(start - 120, 0); + var excerpt = ((start > 0) ? '...' : '') + + $.trim(text.substr(start, 240)) + + ((start + 240 - text.length) ? '...' : ''); + var rv = $('
').text(excerpt); + $.each(hlwords, function() { + rv = rv.highlightText(this, 'highlighted'); + }); + return rv; +} + +/** + * Porter Stemmer + */ +var PorterStemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + + +/** + * Search Module + */ +var Search = { + + _index : null, + _queued_query : null, + _pulse_status : -1, + + init : function() { + var params = $.getQueryParameters(); + if (params.q) { + var query = params.q[0]; + $('input[name="q"]')[0].value = query; + this.performSearch(query); + } + }, + + loadIndex : function(url) { + $.ajax({type: "GET", url: url, data: null, success: null, + dataType: "script", cache: true}); + }, + + setIndex : function(index) { + var q; + this._index = index; + if ((q = this._queued_query) !== null) { + this._queued_query = null; + Search.query(q); + } + }, + + hasIndex : function() { + return this._index !== null; + }, + + deferQuery : function(query) { + this._queued_query = query; + }, + + stopPulse : function() { + this._pulse_status = 0; + }, + + startPulse : function() { + if (this._pulse_status >= 0) + return; + function pulse() { + Search._pulse_status = (Search._pulse_status + 1) % 4; + var dotString = ''; + for (var i = 0; i < Search._pulse_status; i++) + dotString += '.'; + Search.dots.text(dotString); + if (Search._pulse_status > -1) + window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something + */ + performSearch : function(query) { + // create the required interface elements + this.out = $('#search-results'); + this.title = $('

' + _('Searching') + '

').appendTo(this.out); + this.dots = $('').appendTo(this.title); + this.status = $('

').appendTo(this.out); + this.output = $('