summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Shepelev <temotor@gmail.com>2021-09-01 12:15:40 +0300
committerSergey Shepelev <temotor@gmail.com>2021-09-01 12:33:39 +0300
commit09acfdeb64ca04849aef56a3fd29a698afca0d3b (patch)
tree246f1fd50f8ffb8ed0ba77dfcf98a3ece5f12b46
parent96eee9240b01df5c77b3459e5a8ba38f30d16f49 (diff)
downloadeventlet-09acfdeb64ca04849aef56a3fd29a698afca0d3b.tar.gz
Website built from v0.32.0
-rw-r--r--.gitignore1
-rw-r--r--doc/_sources/changelog.rst.txt10
-rw-r--r--doc/_static/basic.css252
-rw-r--r--doc/_static/classic.css6
-rw-r--r--doc/_static/doctools.js16
-rw-r--r--doc/_static/documentation_options.js2
-rw-r--r--doc/_static/jquery-3.5.1.js (renamed from doc/_static/jquery-3.4.1.js)1238
-rw-r--r--doc/_static/jquery.js4
-rw-r--r--doc/_static/language_data.js6
-rw-r--r--doc/_static/pygments.css7
-rw-r--r--doc/_static/searchtools.js41
-rw-r--r--doc/_static/sidebar.js2
-rw-r--r--doc/_static/underscore-1.13.1.js2042
-rw-r--r--doc/_static/underscore-1.3.1.js999
-rw-r--r--doc/_static/underscore.js37
-rw-r--r--doc/authors.html48
-rw-r--r--doc/basic_usage.html108
-rw-r--r--doc/changelog.html612
-rw-r--r--doc/design_patterns.html53
-rw-r--r--doc/environment.html28
-rw-r--r--doc/examples.html72
-rw-r--r--doc/genindex.html28
-rw-r--r--doc/history.html28
-rw-r--r--doc/hubs.html52
-rw-r--r--doc/index.html44
-rw-r--r--doc/modules.html28
-rw-r--r--doc/modules/backdoor.html50
-rw-r--r--doc/modules/corolocal.html40
-rw-r--r--doc/modules/dagpool.html152
-rw-r--r--doc/modules/db_pool.html248
-rw-r--r--doc/modules/debug.html130
-rw-r--r--doc/modules/event.html52
-rw-r--r--doc/modules/greenpool.html130
-rw-r--r--doc/modules/greenthread.html218
-rw-r--r--doc/modules/pools.html72
-rw-r--r--doc/modules/queue.html170
-rw-r--r--doc/modules/semaphore.html92
-rw-r--r--doc/modules/timeout.html48
-rw-r--r--doc/modules/websocket.html88
-rw-r--r--doc/modules/wsgi.html60
-rw-r--r--doc/modules/zmq.html32
-rw-r--r--doc/objects.invbin2772 -> 2828 bytes
-rw-r--r--doc/patching.html48
-rw-r--r--doc/py-modindex.html23
-rw-r--r--doc/search.html32
-rw-r--r--doc/searchindex.js2
-rw-r--r--doc/ssl.html32
-rw-r--r--doc/testing.html48
-rw-r--r--doc/threading.html62
-rw-r--r--doc/zeromq.html36
50 files changed, 4623 insertions, 3006 deletions
diff --git a/.gitignore b/.gitignore
index 1b8c256..d522da4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
.*
bin/
build/
+coverage.xml
dist/
doc/changelog.rst
venv*
diff --git a/doc/_sources/changelog.rst.txt b/doc/_sources/changelog.rst.txt
index f138134..5551849 100644
--- a/doc/_sources/changelog.rst.txt
+++ b/doc/_sources/changelog.rst.txt
@@ -1,3 +1,13 @@
+0.32.0
+======
+* greendns: compatibility with dnspython v2 https://github.com/eventlet/eventlet/pull/722
+* green.ssl: wrap_socket now accepts argument `ciphers` https://github.com/eventlet/eventlet/pull/718
+* websocket: control frames are now always uncompressed per RFC 7692; Thanks to Onno Kortmann
+
+0.31.1
+======
+* ssl: py3.6 using client certificates raised ValueError: check_hostname needs server_hostname argument https://github.com/eventlet/eventlet/pull/705
+
0.31.0
======
* IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2
diff --git a/doc/_static/basic.css b/doc/_static/basic.css
index 0119285..912859b 100644
--- a/doc/_static/basic.css
+++ b/doc/_static/basic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -15,6 +15,12 @@ div.clearer {
clear: both;
}
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
/* -- relbar ---------------------------------------------------------------- */
div.related {
@@ -124,7 +130,7 @@ ul.search li a {
font-weight: bold;
}
-ul.search li div.context {
+ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
@@ -271,25 +277,25 @@ p.rubric {
font-weight: bold;
}
-img.align-left, .figure.align-left, object.align-left {
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
-img.align-right, .figure.align-right, object.align-right {
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
-img.align-center, .figure.align-center, object.align-center {
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
-img.align-default, .figure.align-default {
+img.align-default, figure.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
@@ -313,24 +319,31 @@ img.align-default, .figure.align-default {
/* -- sidebars -------------------------------------------------------------- */
-div.sidebar {
+div.sidebar,
+aside.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
- padding: 7px 7px 0 7px;
+ padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
+ clear: right;
+ overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
- padding: 7px 7px 0 7px;
+ padding: 7px;
margin: 10px 0 10px 0;
}
@@ -352,10 +365,6 @@ div.admonition dt {
font-weight: bold;
}
-div.admonition dl {
- margin-bottom: 0;
-}
-
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
@@ -366,9 +375,30 @@ div.body p.centered {
margin-top: 25px;
}
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
/* -- tables ---------------------------------------------------------------- */
table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
@@ -416,32 +446,34 @@ table.citation td {
border-bottom: none;
}
-th > p:first-child,
-td > p:first-child {
+th > :first-child,
+td > :first-child {
margin-top: 0px;
}
-th > p:last-child,
-td > p:last-child {
+th > :last-child,
+td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
-div.figure {
+div.figure, figure {
margin: 0.5em;
padding: 0.5em;
}
-div.figure p.caption {
+div.figure p.caption, figcaption {
padding: 0.3em;
}
-div.figure p.caption span.caption-number {
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
font-style: italic;
}
-div.figure p.caption span.caption-text {
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
@@ -468,10 +500,71 @@ table.field-list td, table.field-list th {
/* -- hlist styles ---------------------------------------------------------- */
+table.hlist {
+ margin: 1em 0;
+}
+
table.hlist td {
vertical-align: top;
}
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
/* -- other body styles ----------------------------------------------------- */
@@ -495,17 +588,37 @@ ol.upperroman {
list-style: upper-roman;
}
-li > p:first-child {
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
-li > p:last-child {
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
dl.footnote > dt,
dl.citation > dt {
float: left;
+ margin-right: 0.5em;
}
dl.footnote > dd,
@@ -546,7 +659,7 @@ dl {
margin-bottom: 15px;
}
-dd > p:first-child {
+dd > :first-child {
margin-top: 0px;
}
@@ -560,6 +673,11 @@ dd {
margin-left: 30px;
}
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
dt:target, span.highlighted {
background-color: #fbe54e;
}
@@ -573,14 +691,6 @@ dl.glossary dt {
font-size: 1.1em;
}
-.optional {
- font-size: 1.3em;
-}
-
-.sig-paren {
- font-size: larger;
-}
-
.versionmodified {
font-style: italic;
}
@@ -637,6 +747,10 @@ pre {
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
@@ -644,22 +758,57 @@ span.pre {
hyphens: none;
}
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
td.linenos pre {
- padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
- margin-left: 0.5em;
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
}
table.highlighttable td {
- padding: 0 0.5em 0 0.5em;
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
}
div.code-block-caption {
+ margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
@@ -668,12 +817,14 @@ div.code-block-caption code {
background-color: transparent;
}
-div.code-block-caption + div > div.highlight > pre {
- margin-top: 0;
-}
-
-div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
- user-select: none;
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
}
div.code-block-caption span.caption-number {
@@ -685,21 +836,7 @@ div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
- padding: 1em 1em 0;
-}
-
-div.literal-block-wrapper div.highlight {
- margin: 0;
-}
-
-code.descname {
- background-color: transparent;
- font-weight: bold;
- font-size: 1.2em;
-}
-
-code.descclassname {
- background-color: transparent;
+ margin: 1em 0;
}
code.xref, a code {
@@ -740,8 +877,7 @@ span.eqno {
}
span.eqno a.headerlink {
- position: relative;
- left: 0px;
+ position: absolute;
z-index: 1;
}
diff --git a/doc/_static/classic.css b/doc/_static/classic.css
index b4fd80f..dcae946 100644
--- a/doc/_static/classic.css
+++ b/doc/_static/classic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- classic theme.
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -224,8 +224,8 @@ p.admonition-title:after {
pre {
padding: 5px;
- background-color: #eeffcc;
- color: #333333;
+ background-color: unset;
+ color: unset;
line-height: 120%;
border: 1px solid #ac9;
border-left: none;
diff --git a/doc/_static/doctools.js b/doc/_static/doctools.js
index daccd20..8cbf1b1 100644
--- a/doc/_static/doctools.js
+++ b/doc/_static/doctools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for all documentation.
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -29,9 +29,14 @@ if (!window.console || !console.firebug) {
/**
* small helper function to urldecode strings
+ *
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
- return decodeURIComponent(x).replace(/\+/g, ' ');
+ if (!x) {
+ return x
+ }
+ return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
@@ -285,9 +290,10 @@ var Documentation = {
initOnKeyListeners: function() {
$(document).keydown(function(event) {
var activeElementType = document.activeElement.tagName;
- // don't navigate when in search box or textarea
+ // don't navigate when in search box, textarea, dropdown or button
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
- && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
+ && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey
+ && !event.shiftKey) {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
@@ -295,12 +301,14 @@ var Documentation = {
window.location.href = prevHref;
return false;
}
+ break;
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
+ break;
}
}
});
diff --git a/doc/_static/documentation_options.js b/doc/_static/documentation_options.js
index 17ee98c..20a86e9 100644
--- a/doc/_static/documentation_options.js
+++ b/doc/_static/documentation_options.js
@@ -1,6 +1,6 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
- VERSION: '0.31.0',
+ VERSION: '0.32.0',
LANGUAGE: 'None',
COLLAPSE_INDEX: false,
BUILDER: 'html',
diff --git a/doc/_static/jquery-3.4.1.js b/doc/_static/jquery-3.5.1.js
index 773ad95..5093733 100644
--- a/doc/_static/jquery-3.4.1.js
+++ b/doc/_static/jquery-3.5.1.js
@@ -1,5 +1,5 @@
/*!
- * jQuery JavaScript Library v3.4.1
+ * jQuery JavaScript Library v3.5.1
* https://jquery.com/
*
* Includes Sizzle.js
@@ -9,7 +9,7 @@
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2019-05-01T21:04Z
+ * Date: 2020-05-04T22:49Z
*/
( function( global, factory ) {
@@ -47,13 +47,16 @@
var arr = [];
-var document = window.document;
-
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
-var concat = arr.concat;
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
var push = arr.push;
@@ -86,6 +89,8 @@ var isWindow = function isWindow( obj ) {
};
+var document = window.document;
+
var preservedScriptAttributes = {
@@ -142,7 +147,7 @@ function toType( obj ) {
var
- version = "3.4.1",
+ version = "3.5.1",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -150,11 +155,7 @@ var
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init( selector, context );
- },
-
- // Support: Android <=4.0 only
- // Make sure we trim BOM and NBSP
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+ };
jQuery.fn = jQuery.prototype = {
@@ -220,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
return this.eq( -1 );
},
+ even: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return ( i + 1 ) % 2;
+ } ) );
+ },
+
+ odd: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return i % 2;
+ } ) );
+ },
+
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +366,10 @@ jQuery.extend( {
return true;
},
- // Evaluates a script in a global context
- globalEval: function( code, options ) {
- DOMEval( code, { nonce: options && options.nonce } );
+ // Evaluates a script in a provided context; falls back to the global one
+ // if not specified.
+ globalEval: function( code, options, doc ) {
+ DOMEval( code, { nonce: options && options.nonce }, doc );
},
each: function( obj, callback ) {
@@ -379,13 +393,6 @@ jQuery.extend( {
return obj;
},
- // Support: Android <=4.0 only
- trim: function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
// results is for internal usage only
makeArray: function( arr, results ) {
var ret = results || [];
@@ -472,7 +479,7 @@ jQuery.extend( {
}
// Flatten any nested arrays
- return concat.apply( [], ret );
+ return flat( ret );
},
// A global GUID counter for objects
@@ -489,7 +496,7 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
+function( _i, name ) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );
@@ -511,17 +518,16 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.4
+ * Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2019-04-08
+ * Date: 2020-03-14
*/
-(function( window ) {
-
+( function( window ) {
var i,
support,
Expr,
@@ -561,59 +567,70 @@ var i,
},
// Instance methods
- hasOwn = ({}).hasOwnProperty,
+ hasOwn = ( {} ).hasOwnProperty,
arr = [],
pop = arr.pop,
- push_native = arr.push,
+ pushNative = arr.push,
push = arr.push,
slice = arr.slice,
+
// Use a stripped-down indexOf as it's faster than native
// https://jsperf.com/thor-indexof-vs-for/5
indexOf = function( list, elem ) {
var i = 0,
len = list.length;
for ( ; i < len; i++ ) {
- if ( list[i] === elem ) {
+ if ( list[ i ] === elem ) {
return i;
}
}
return -1;
},
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+ "ismap|loop|multiple|open|readonly|required|scoped",
// Regular expressions
// http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]",
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
// Operator (capture 2)
"*([*^$|!~]?=)" + whitespace +
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
- "*\\]",
+
+ // "Attribute values must be CSS identifiers [capture 5]
+ // or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+ whitespace + "*\\]",
pseudos = ":(" + identifier + ")(?:\\((" +
+
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
// 1. quoted (capture 3; capture 4 or capture 5)
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
// 2. simple (capture 6)
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
// 3. anything else (capture 2)
".*" +
")\\)|)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+ whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+ "*" ),
rdescend = new RegExp( whitespace + "|>" ),
rpseudo = new RegExp( pseudos ),
@@ -625,14 +642,16 @@ var i,
"TAG": new RegExp( "^(" + identifier + "|[*])" ),
"ATTR": new RegExp( "^" + attributes ),
"PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
// For use in libraries implementing .is()
// We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ "needsContext": new RegExp( "^" + whitespace +
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
rhtml = /HTML$/i,
@@ -648,18 +667,21 @@ var i,
// CSS escapes
// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
- funescape = function( _, escaped, escapedWhitespace ) {
- var high = "0x" + escaped - 0x10000;
- // NaN means non-codepoint
- // Support: Firefox<24
- // Workaround erroneous numeric interpretation of +"0x"
- return high !== high || escapedWhitespace ?
- escaped :
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+ funescape = function( escape, nonHex ) {
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+ return nonHex ?
+
+ // Strip the backslash prefix from a non-hex escape sequence
+ nonHex :
+
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
+ // Support: IE <=11+
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
+ // surrogate pair
high < 0 ?
- // BMP codepoint
String.fromCharCode( high + 0x10000 ) :
- // Supplemental Plane codepoint (surrogate pair)
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
},
@@ -675,7 +697,8 @@ var i,
}
// Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ return ch.slice( 0, -1 ) + "\\" +
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
}
// Other potentially-special ASCII characters get backslash-escaped
@@ -700,18 +723,20 @@ var i,
// Optimize for push.apply( _, NodeList )
try {
push.apply(
- (arr = slice.call( preferredDoc.childNodes )),
+ ( arr = slice.call( preferredDoc.childNodes ) ),
preferredDoc.childNodes
);
+
// Support: Android<4.0
// Detect silently failing push.apply
+ // eslint-disable-next-line no-unused-expressions
arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
push = { apply: arr.length ?
// Leverage slice if possible
function( target, els ) {
- push_native.apply( target, slice.call(els) );
+ pushNative.apply( target, slice.call( els ) );
} :
// Support: IE<9
@@ -719,8 +744,9 @@ try {
function( target, els ) {
var j = target.length,
i = 0;
+
// Can't trust NodeList.length
- while ( (target[j++] = els[i++]) ) {}
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
target.length = j - 1;
}
};
@@ -744,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
// Try to shortcut find operations (as opposed to filters) in HTML documents
if ( !seed ) {
-
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
- setDocument( context );
- }
+ setDocument( context );
context = context || document;
if ( documentIsHTML ) {
// If the selector is sufficiently simple, try using a "get*By*" DOM method
// (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
// ID selector
- if ( (m = match[1]) ) {
+ if ( ( m = match[ 1 ] ) ) {
// Document context
if ( nodeType === 9 ) {
- if ( (elem = context.getElementById( m )) ) {
+ if ( ( elem = context.getElementById( m ) ) ) {
// Support: IE, Opera, Webkit
// TODO: identify versions
@@ -780,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
// Support: IE, Opera, Webkit
// TODO: identify versions
// getElementById can match elements by name instead of ID
- if ( newContext && (elem = newContext.getElementById( m )) &&
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
contains( context, elem ) &&
elem.id === m ) {
@@ -790,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
}
// Type selector
- } else if ( match[2] ) {
+ } else if ( match[ 2 ] ) {
push.apply( results, context.getElementsByTagName( selector ) );
return results;
// Class selector
- } else if ( (m = match[3]) && support.getElementsByClassName &&
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
context.getElementsByClassName ) {
push.apply( results, context.getElementsByClassName( m ) );
@@ -806,11 +829,11 @@ function Sizzle( selector, context, results, seed ) {
// Take advantage of querySelectorAll
if ( support.qsa &&
!nonnativeSelectorCache[ selector + " " ] &&
- (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
// Support: IE 8 only
// Exclude object elements
- (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
newSelector = selector;
newContext = context;
@@ -819,27 +842,36 @@ function Sizzle( selector, context, results, seed ) {
// descendant combinators, which is not what we want.
// In such cases, we work around the behavior by prefixing every selector in the
// list with an ID selector referencing the scope context.
+ // The technique has to be used as well when a leading combinator is used
+ // as such selectors are not recognized by querySelectorAll.
// Thanks to Andrew Dupont for this technique.
- if ( nodeType === 1 && rdescend.test( selector ) ) {
+ if ( nodeType === 1 &&
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
- // Capture the context ID, setting it first if necessary
- if ( (nid = context.getAttribute( "id" )) ) {
- nid = nid.replace( rcssescape, fcssescape );
- } else {
- context.setAttribute( "id", (nid = expando) );
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+
+ // We can use :scope instead of the ID hack if the browser
+ // supports it & if we're not changing the context.
+ if ( newContext !== context || !support.scope ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", ( nid = expando ) );
+ }
}
// Prefix every selector in the list
groups = tokenize( selector );
i = groups.length;
while ( i-- ) {
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+ toSelector( groups[ i ] );
}
newSelector = groups.join( "," );
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
}
try {
@@ -872,12 +904,14 @@ function createCache() {
var keys = [];
function cache( key, value ) {
+
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
// Only keep the most recent entries
delete cache[ keys.shift() ];
}
- return (cache[ key + " " ] = value);
+ return ( cache[ key + " " ] = value );
}
return cache;
}
@@ -896,17 +930,19 @@ function markFunction( fn ) {
* @param {Function} fn Passed the created element and returns a boolean result
*/
function assert( fn ) {
- var el = document.createElement("fieldset");
+ var el = document.createElement( "fieldset" );
try {
return !!fn( el );
- } catch (e) {
+ } catch ( e ) {
return false;
} finally {
+
// Remove from its parent by default
if ( el.parentNode ) {
el.parentNode.removeChild( el );
}
+
// release memory in IE
el = null;
}
@@ -918,11 +954,11 @@ function assert( fn ) {
* @param {Function} handler The method that will be applied
*/
function addHandle( attrs, handler ) {
- var arr = attrs.split("|"),
+ var arr = attrs.split( "|" ),
i = arr.length;
while ( i-- ) {
- Expr.attrHandle[ arr[i] ] = handler;
+ Expr.attrHandle[ arr[ i ] ] = handler;
}
}
@@ -944,7 +980,7 @@ function siblingCheck( a, b ) {
// Check if b follows a
if ( cur ) {
- while ( (cur = cur.nextSibling) ) {
+ while ( ( cur = cur.nextSibling ) ) {
if ( cur === b ) {
return -1;
}
@@ -972,7 +1008,7 @@ function createInputPseudo( type ) {
function createButtonPseudo( type ) {
return function( elem ) {
var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
+ return ( name === "input" || name === "button" ) && elem.type === type;
};
}
@@ -1015,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
// Where there is no isDisabled, check manually
/* jshint -W018 */
elem.isDisabled !== !disabled &&
- inDisabledFieldset( elem ) === disabled;
+ inDisabledFieldset( elem ) === disabled;
}
return elem.disabled === disabled;
@@ -1037,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
* @param {Function} fn
*/
function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
+ return markFunction( function( argument ) {
argument = +argument;
- return markFunction(function( seed, matches ) {
+ return markFunction( function( seed, matches ) {
var j,
matchIndexes = fn( [], seed.length, argument ),
i = matchIndexes.length;
// Match elements found at the specified indexes
while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
}
}
- });
- });
+ } );
+ } );
}
/**
@@ -1073,7 +1109,7 @@ support = Sizzle.support = {};
*/
isXML = Sizzle.isXML = function( elem ) {
var namespace = elem.namespaceURI,
- docElem = (elem.ownerDocument || elem).documentElement;
+ docElem = ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -1091,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
doc = node ? node.ownerDocument || node : preferredDoc;
// Return early if doc is invalid or already selected
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
return document;
}
@@ -1100,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
docElem = document.documentElement;
documentIsHTML = !isXML( document );
- // Support: IE 9-11, Edge
+ // Support: IE 9 - 11+, Edge 12 - 18+
// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- if ( preferredDoc !== document &&
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( preferredDoc != document &&
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
// Support: IE 11, Edge
if ( subWindow.addEventListener ) {
@@ -1115,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
}
}
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
+ // Support: Safari 6.0 only
+ // Safari 6.0 supports :scope but it's an alias of :root there.
+ support.scope = assert( function( el ) {
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+ return typeof el.querySelectorAll !== "undefined" &&
+ !el.querySelectorAll( ":scope fieldset div" ).length;
+ } );
+
/* Attributes
---------------------------------------------------------------------- */
// Support: IE<8
// Verify that getAttribute really returns attributes and not properties
// (excepting IE8 booleans)
- support.attributes = assert(function( el ) {
+ support.attributes = assert( function( el ) {
el.className = "i";
- return !el.getAttribute("className");
- });
+ return !el.getAttribute( "className" );
+ } );
/* getElement(s)By*
---------------------------------------------------------------------- */
// Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert(function( el ) {
- el.appendChild( document.createComment("") );
- return !el.getElementsByTagName("*").length;
- });
+ support.getElementsByTagName = assert( function( el ) {
+ el.appendChild( document.createComment( "" ) );
+ return !el.getElementsByTagName( "*" ).length;
+ } );
// Support: IE<9
support.getElementsByClassName = rnative.test( document.getElementsByClassName );
@@ -1142,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
// Check if getElementById returns elements by name
// The broken getElementById methods don't pick up programmatically-set names,
// so use a roundabout getElementsByName test
- support.getById = assert(function( el ) {
+ support.getById = assert( function( el ) {
docElem.appendChild( el ).id = expando;
return !document.getElementsByName || !document.getElementsByName( expando ).length;
- });
+ } );
// ID filter and find
if ( support.getById ) {
- Expr.filter["ID"] = function( id ) {
+ Expr.filter[ "ID" ] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
- return elem.getAttribute("id") === attrId;
+ return elem.getAttribute( "id" ) === attrId;
};
};
- Expr.find["ID"] = function( id, context ) {
+ Expr.find[ "ID" ] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var elem = context.getElementById( id );
return elem ? [ elem ] : [];
}
};
} else {
- Expr.filter["ID"] = function( id ) {
+ Expr.filter[ "ID" ] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
var node = typeof elem.getAttributeNode !== "undefined" &&
- elem.getAttributeNode("id");
+ elem.getAttributeNode( "id" );
return node && node.value === attrId;
};
};
// Support: IE 6 - 7 only
// getElementById is not reliable as a find shortcut
- Expr.find["ID"] = function( id, context ) {
+ Expr.find[ "ID" ] = function( id, context ) {
if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var node, i, elems,
elem = context.getElementById( id );
@@ -1181,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
if ( elem ) {
// Verify the id attribute
- node = elem.getAttributeNode("id");
+ node = elem.getAttributeNode( "id" );
if ( node && node.value === id ) {
return [ elem ];
}
@@ -1189,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
// Fall back on getElementsByName
elems = context.getElementsByName( id );
i = 0;
- while ( (elem = elems[i++]) ) {
- node = elem.getAttributeNode("id");
+ while ( ( elem = elems[ i++ ] ) ) {
+ node = elem.getAttributeNode( "id" );
if ( node && node.value === id ) {
return [ elem ];
}
@@ -1203,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
}
// Tag
- Expr.find["TAG"] = support.getElementsByTagName ?
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
function( tag, context ) {
if ( typeof context.getElementsByTagName !== "undefined" ) {
return context.getElementsByTagName( tag );
@@ -1218,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
var elem,
tmp = [],
i = 0,
+
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context.getElementsByTagName( tag );
// Filter out possible comments
if ( tag === "*" ) {
- while ( (elem = results[i++]) ) {
+ while ( ( elem = results[ i++ ] ) ) {
if ( elem.nodeType === 1 ) {
tmp.push( elem );
}
@@ -1235,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
};
// Class
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
return context.getElementsByClassName( className );
}
@@ -1256,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
// See https://bugs.jquery.com/ticket/13378
rbuggyQSA = [];
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
// Build QSA regex
// Regex strategy adopted from Diego Perini
- assert(function( el ) {
+ assert( function( el ) {
+
+ var input;
+
// Select is set to empty string on purpose
// This is to test IE's treatment of not explicitly
// setting a boolean content attribute,
@@ -1273,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
// Nothing should be selected when empty strings follow ^= or $= or *=
// The test attribute must be unknown in Opera but "safe" for WinRT
// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
}
// Support: IE8
// Boolean attributes and "value" are not treated correctly
- if ( !el.querySelectorAll("[selected]").length ) {
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
}
// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push("~=");
+ rbuggyQSA.push( "~=" );
+ }
+
+ // Support: IE 11+, Edge 15 - 18+
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
+ // Adding a temporary attribute to the document before the selection works
+ // around the issue.
+ // Interestingly, IE 10 & older don't seem to have the issue.
+ input = document.createElement( "input" );
+ input.setAttribute( "name", "" );
+ el.appendChild( input );
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+ whitespace + "*(?:''|\"\")" );
}
// Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests
- if ( !el.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
+ if ( !el.querySelectorAll( ":checked" ).length ) {
+ rbuggyQSA.push( ":checked" );
}
// Support: Safari 8+, iOS 8+
// https://bugs.webkit.org/show_bug.cgi?id=136851
// In-page `selector#id sibling-combinator selector` fails
if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push(".#.+[+~]");
+ rbuggyQSA.push( ".#.+[+~]" );
}
- });
- assert(function( el ) {
+ // Support: Firefox <=3.6 - 5 only
+ // Old Firefox doesn't throw on a badly-escaped identifier.
+ el.querySelectorAll( "\\\f" );
+ rbuggyQSA.push( "[\\r\\n\\f]" );
+ } );
+
+ assert( function( el ) {
el.innerHTML = "<a href='' disabled='disabled'></a>" +
"<select disabled='disabled'><option/></select>";
// Support: Windows 8 Native Apps
// The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement("input");
+ var input = document.createElement( "input" );
input.setAttribute( "type", "hidden" );
el.appendChild( input ).setAttribute( "name", "D" );
// Support: IE8
// Enforce case-sensitivity of name attribute
- if ( el.querySelectorAll("[name=d]").length ) {
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
}
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here and will not see later tests
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Support: IE9-11+
// IE's :disabled selector does not pick up the children of disabled fieldsets
docElem.appendChild( el ).disabled = true;
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
+ // Support: Opera 10 - 11 only
// Opera 10-11 does not throw on post-comma invalid pseudos
- el.querySelectorAll("*,:x");
- rbuggyQSA.push(",.*:");
- });
+ el.querySelectorAll( "*,:x" );
+ rbuggyQSA.push( ",.*:" );
+ } );
}
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
docElem.webkitMatchesSelector ||
docElem.mozMatchesSelector ||
docElem.oMatchesSelector ||
- docElem.msMatchesSelector) )) ) {
+ docElem.msMatchesSelector ) ) ) ) {
+
+ assert( function( el ) {
- assert(function( el ) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9)
support.disconnectedMatch = matches.call( el, "*" );
@@ -1353,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
// Gecko does not error, returns false instead
matches.call( el, "[s!='']:x" );
rbuggyMatches.push( "!=", pseudos );
- });
+ } );
}
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
/* Contains
---------------------------------------------------------------------- */
@@ -1374,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
adown.contains ?
adown.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ));
+ ) );
} :
function( a, b ) {
if ( b ) {
- while ( (b = b.parentNode) ) {
+ while ( ( b = b.parentNode ) ) {
if ( b === a ) {
return true;
}
@@ -1407,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
}
// Calculate position if both inputs belong to the same document
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
a.compareDocumentPosition( b ) :
// Otherwise we know they are disconnected
@@ -1415,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
// Disconnected nodes
if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
// Choose the first element that is related to our preferred document
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( a == document || a.ownerDocument == preferredDoc &&
+ contains( preferredDoc, a ) ) {
return -1;
}
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( b == document || b.ownerDocument == preferredDoc &&
+ contains( preferredDoc, b ) ) {
return 1;
}
@@ -1434,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
return compare & 4 ? -1 : 1;
} :
function( a, b ) {
+
// Exit early if the nodes are identical
if ( a === b ) {
hasDuplicate = true;
@@ -1449,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
// Parentless nodes are either documents or disconnected
if ( !aup || !bup ) {
- return a === document ? -1 :
- b === document ? 1 :
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ return a == document ? -1 :
+ b == document ? 1 :
+ /* eslint-enable eqeqeq */
aup ? -1 :
bup ? 1 :
sortInput ?
@@ -1464,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
// Otherwise we need full lists of their ancestors for comparison
cur = a;
- while ( (cur = cur.parentNode) ) {
+ while ( ( cur = cur.parentNode ) ) {
ap.unshift( cur );
}
cur = b;
- while ( (cur = cur.parentNode) ) {
+ while ( ( cur = cur.parentNode ) ) {
bp.unshift( cur );
}
// Walk down the tree looking for a discrepancy
- while ( ap[i] === bp[i] ) {
+ while ( ap[ i ] === bp[ i ] ) {
i++;
}
return i ?
+
// Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[i], bp[i] ) :
+ siblingCheck( ap[ i ], bp[ i ] ) :
// Otherwise nodes in our document sort first
- ap[i] === preferredDoc ? -1 :
- bp[i] === preferredDoc ? 1 :
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ ap[ i ] == preferredDoc ? -1 :
+ bp[ i ] == preferredDoc ? 1 :
+ /* eslint-enable eqeqeq */
0;
};
@@ -1495,10 +1603,7 @@ Sizzle.matches = function( expr, elements ) {
};
Sizzle.matchesSelector = function( elem, expr ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
+ setDocument( elem );
if ( support.matchesSelector && documentIsHTML &&
!nonnativeSelectorCache[ expr + " " ] &&
@@ -1510,12 +1615,13 @@ Sizzle.matchesSelector = function( elem, expr ) {
// IE 9's matchesSelector returns false on disconnected nodes
if ( ret || support.disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
+
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
return ret;
}
- } catch (e) {
+ } catch ( e ) {
nonnativeSelectorCache( expr, true );
}
}
@@ -1524,20 +1630,31 @@ Sizzle.matchesSelector = function( elem, expr ) {
};
Sizzle.contains = function( context, elem ) {
+
// Set document vars if needed
- if ( ( context.ownerDocument || context ) !== document ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( context.ownerDocument || context ) != document ) {
setDocument( context );
}
return contains( context, elem );
};
Sizzle.attr = function( elem, name ) {
+
// Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( elem.ownerDocument || elem ) != document ) {
setDocument( elem );
}
var fn = Expr.attrHandle[ name.toLowerCase() ],
+
// Don't get fooled by Object.prototype properties (jQuery #13807)
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
fn( elem, name, !documentIsHTML ) :
@@ -1547,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
val :
support.attributes || !documentIsHTML ?
elem.getAttribute( name ) :
- (val = elem.getAttributeNode(name)) && val.specified ?
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
val.value :
null;
};
Sizzle.escape = function( sel ) {
- return (sel + "").replace( rcssescape, fcssescape );
+ return ( sel + "" ).replace( rcssescape, fcssescape );
};
Sizzle.error = function( msg ) {
@@ -1576,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
results.sort( sortOrder );
if ( hasDuplicate ) {
- while ( (elem = results[i++]) ) {
+ while ( ( elem = results[ i++ ] ) ) {
if ( elem === results[ i ] ) {
j = duplicates.push( i );
}
@@ -1604,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
nodeType = elem.nodeType;
if ( !nodeType ) {
+
// If no nodeType, this is expected to be an array
- while ( (node = elem[i++]) ) {
+ while ( ( node = elem[ i++ ] ) ) {
+
// Do not traverse comment nodes
ret += getText( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
// Use textContent for elements
// innerText usage removed for consistency of new lines (jQuery #11153)
if ( typeof elem.textContent === "string" ) {
return elem.textContent;
} else {
+
// Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem );
@@ -1623,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
+
// Do not include comment or processing instruction nodes
return ret;
@@ -1650,19 +1772,21 @@ Expr = Sizzle.selectors = {
preFilter: {
"ATTR": function( match ) {
- match[1] = match[1].replace( runescape, funescape );
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+ match[ 5 ] || "" ).replace( runescape, funescape );
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
+ if ( match[ 2 ] === "~=" ) {
+ match[ 3 ] = " " + match[ 3 ] + " ";
}
return match.slice( 0, 4 );
},
"CHILD": function( match ) {
+
/* matches from matchExpr["CHILD"]
1 type (only|nth|...)
2 what (child|of-type)
@@ -1673,22 +1797,25 @@ Expr = Sizzle.selectors = {
7 sign of y-component
8 y of y-component
*/
- match[1] = match[1].toLowerCase();
+ match[ 1 ] = match[ 1 ].toLowerCase();
+
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
- if ( match[1].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument
- if ( !match[3] ) {
- Sizzle.error( match[0] );
+ if ( !match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
}
// numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+ match[ 4 ] = +( match[ 4 ] ?
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
- // other types prohibit arguments
- } else if ( match[3] ) {
- Sizzle.error( match[0] );
+ // other types prohibit arguments
+ } else if ( match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
}
return match;
@@ -1696,26 +1823,28 @@ Expr = Sizzle.selectors = {
"PSEUDO": function( match ) {
var excess,
- unquoted = !match[6] && match[2];
+ unquoted = !match[ 6 ] && match[ 2 ];
- if ( matchExpr["CHILD"].test( match[0] ) ) {
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
return null;
}
// Accept quoted arguments as-is
- if ( match[3] ) {
- match[2] = match[4] || match[5] || "";
+ if ( match[ 3 ] ) {
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
// Strip excess characters from unquoted arguments
} else if ( unquoted && rpseudo.test( unquoted ) &&
+
// Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
+ ( excess = tokenize( unquoted, true ) ) &&
+
// advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
// excess is a negative index
- match[0] = match[0].slice( 0, excess );
- match[2] = unquoted.slice( 0, excess );
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
+ match[ 2 ] = unquoted.slice( 0, excess );
}
// Return only captures needed by the pseudo filter method (type and argument)
@@ -1728,7 +1857,9 @@ Expr = Sizzle.selectors = {
"TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
return nodeNameSelector === "*" ?
- function() { return true; } :
+ function() {
+ return true;
+ } :
function( elem ) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
};
@@ -1738,10 +1869,16 @@ Expr = Sizzle.selectors = {
var pattern = classCache[ className + " " ];
return pattern ||
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
- classCache( className, function( elem ) {
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
- });
+ ( pattern = new RegExp( "(^|" + whitespace +
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+ className, function( elem ) {
+ return pattern.test(
+ typeof elem.className === "string" && elem.className ||
+ typeof elem.getAttribute !== "undefined" &&
+ elem.getAttribute( "class" ) ||
+ ""
+ );
+ } );
},
"ATTR": function( name, operator, check ) {
@@ -1757,6 +1894,8 @@ Expr = Sizzle.selectors = {
result += "";
+ /* eslint-disable max-len */
+
return operator === "=" ? result === check :
operator === "!=" ? result !== check :
operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1765,10 +1904,12 @@ Expr = Sizzle.selectors = {
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false;
+ /* eslint-enable max-len */
+
};
},
- "CHILD": function( type, what, argument, first, last ) {
+ "CHILD": function( type, what, _argument, first, last ) {
var simple = type.slice( 0, 3 ) !== "nth",
forward = type.slice( -4 ) !== "last",
ofType = what === "of-type";
@@ -1780,7 +1921,7 @@ Expr = Sizzle.selectors = {
return !!elem.parentNode;
} :
- function( elem, context, xml ) {
+ function( elem, _context, xml ) {
var cache, uniqueCache, outerCache, node, nodeIndex, start,
dir = simple !== forward ? "nextSibling" : "previousSibling",
parent = elem.parentNode,
@@ -1794,7 +1935,7 @@ Expr = Sizzle.selectors = {
if ( simple ) {
while ( dir ) {
node = elem;
- while ( (node = node[ dir ]) ) {
+ while ( ( node = node[ dir ] ) ) {
if ( ofType ?
node.nodeName.toLowerCase() === name :
node.nodeType === 1 ) {
@@ -1802,6 +1943,7 @@ Expr = Sizzle.selectors = {
return false;
}
}
+
// Reverse direction for :only-* (if we haven't yet done so)
start = dir = type === "only" && !start && "nextSibling";
}
@@ -1817,22 +1959,22 @@ Expr = Sizzle.selectors = {
// ...in a gzip-friendly way
node = parent;
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
diff = nodeIndex && cache[ 2 ];
node = nodeIndex && parent.childNodes[ nodeIndex ];
- while ( (node = ++nodeIndex && node && node[ dir ] ||
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
// Fallback to seeking `elem` from the start
- (diff = nodeIndex = 0) || start.pop()) ) {
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
// When found, cache indexes on `parent` and break
if ( node.nodeType === 1 && ++diff && node === elem ) {
@@ -1842,16 +1984,18 @@ Expr = Sizzle.selectors = {
}
} else {
+
// Use previously-cached element index if available
if ( useCache ) {
+
// ...in a gzip-friendly way
node = elem;
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
cache = uniqueCache[ type ] || [];
nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1861,9 +2005,10 @@ Expr = Sizzle.selectors = {
// xml :nth-child(...)
// or :nth-last-child(...) or :nth(-last)?-of-type(...)
if ( diff === false ) {
+
// Use the same loop as above to seek `elem` from the start
- while ( (node = ++nodeIndex && node && node[ dir ] ||
- (diff = nodeIndex = 0) || start.pop()) ) {
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
if ( ( ofType ?
node.nodeName.toLowerCase() === name :
@@ -1872,12 +2017,13 @@ Expr = Sizzle.selectors = {
// Cache the index of each encountered element
if ( useCache ) {
- outerCache = node[ expando ] || (node[ expando ] = {});
+ outerCache = node[ expando ] ||
+ ( node[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
+ ( outerCache[ node.uniqueID ] = {} );
uniqueCache[ type ] = [ dirruns, diff ];
}
@@ -1898,6 +2044,7 @@ Expr = Sizzle.selectors = {
},
"PSEUDO": function( pseudo, argument ) {
+
// pseudo-class names are case-insensitive
// http://www.w3.org/TR/selectors/#pseudo-classes
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@@ -1917,15 +2064,15 @@ Expr = Sizzle.selectors = {
if ( fn.length > 1 ) {
args = [ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
+ markFunction( function( seed, matches ) {
var idx,
matched = fn( seed, argument ),
i = matched.length;
while ( i-- ) {
- idx = indexOf( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
+ idx = indexOf( seed, matched[ i ] );
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
}
- }) :
+ } ) :
function( elem ) {
return fn( elem, 0, args );
};
@@ -1936,8 +2083,10 @@ Expr = Sizzle.selectors = {
},
pseudos: {
+
// Potentially complex pseudos
- "not": markFunction(function( selector ) {
+ "not": markFunction( function( selector ) {
+
// Trim the selector passed to compile
// to avoid treating leading and trailing
// spaces as combinators
@@ -1946,39 +2095,40 @@ Expr = Sizzle.selectors = {
matcher = compile( selector.replace( rtrim, "$1" ) );
return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
+ markFunction( function( seed, matches, _context, xml ) {
var elem,
unmatched = matcher( seed, null, xml, [] ),
i = seed.length;
// Match elements unmatched by `matcher`
while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
+ if ( ( elem = unmatched[ i ] ) ) {
+ seed[ i ] = !( matches[ i ] = elem );
}
}
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
+ } ) :
+ function( elem, _context, xml ) {
+ input[ 0 ] = elem;
matcher( input, null, xml, results );
+
// Don't keep the element (issue #299)
- input[0] = null;
+ input[ 0 ] = null;
return !results.pop();
};
- }),
+ } ),
- "has": markFunction(function( selector ) {
+ "has": markFunction( function( selector ) {
return function( elem ) {
return Sizzle( selector, elem ).length > 0;
};
- }),
+ } ),
- "contains": markFunction(function( text ) {
+ "contains": markFunction( function( text ) {
text = text.replace( runescape, funescape );
return function( elem ) {
return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
};
- }),
+ } ),
// "Whether an element is represented by a :lang() selector
// is based solely on the element's language value
@@ -1988,25 +2138,26 @@ Expr = Sizzle.selectors = {
// The identifier C does not have to be a valid language name."
// http://www.w3.org/TR/selectors/#lang-pseudo
"lang": markFunction( function( lang ) {
+
// lang value must be a valid identifier
- if ( !ridentifier.test(lang || "") ) {
+ if ( !ridentifier.test( lang || "" ) ) {
Sizzle.error( "unsupported lang: " + lang );
}
lang = lang.replace( runescape, funescape ).toLowerCase();
return function( elem ) {
var elemLang;
do {
- if ( (elemLang = documentIsHTML ?
+ if ( ( elemLang = documentIsHTML ?
elem.lang :
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
elemLang = elemLang.toLowerCase();
return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
}
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
return false;
};
- }),
+ } ),
// Miscellaneous
"target": function( elem ) {
@@ -2019,7 +2170,9 @@ Expr = Sizzle.selectors = {
},
"focus": function( elem ) {
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ return elem === document.activeElement &&
+ ( !document.hasFocus || document.hasFocus() ) &&
+ !!( elem.type || elem.href || ~elem.tabIndex );
},
// Boolean properties
@@ -2027,16 +2180,20 @@ Expr = Sizzle.selectors = {
"disabled": createDisabledPseudo( true ),
"checked": function( elem ) {
+
// In CSS3, :checked should return both checked and selected elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ return ( nodeName === "input" && !!elem.checked ) ||
+ ( nodeName === "option" && !!elem.selected );
},
"selected": function( elem ) {
+
// Accessing this property makes selected-by-default
// options in Safari work properly
if ( elem.parentNode ) {
+ // eslint-disable-next-line no-unused-expressions
elem.parentNode.selectedIndex;
}
@@ -2045,6 +2202,7 @@ Expr = Sizzle.selectors = {
// Contents
"empty": function( elem ) {
+
// http://www.w3.org/TR/selectors/#empty-pseudo
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
// but not by others (comment: 8; processing instruction: 7; etc.)
@@ -2058,7 +2216,7 @@ Expr = Sizzle.selectors = {
},
"parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
+ return !Expr.pseudos[ "empty" ]( elem );
},
// Element/input types
@@ -2082,39 +2240,40 @@ Expr = Sizzle.selectors = {
// Support: IE<8
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
+ attr.toLowerCase() === "text" );
},
// Position-in-collection
- "first": createPositionalPseudo(function() {
+ "first": createPositionalPseudo( function() {
return [ 0 ];
- }),
+ } ),
- "last": createPositionalPseudo(function( matchIndexes, length ) {
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
return [ length - 1 ];
- }),
+ } ),
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
return [ argument < 0 ? argument + length : argument ];
- }),
+ } ),
- "even": createPositionalPseudo(function( matchIndexes, length ) {
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
var i = 0;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
- }),
+ } ),
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
var i = 1;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
- }),
+ } ),
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
var i = argument < 0 ?
argument + length :
argument > length ?
@@ -2124,19 +2283,19 @@ Expr = Sizzle.selectors = {
matchIndexes.push( i );
}
return matchIndexes;
- }),
+ } ),
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
for ( ; ++i < length; ) {
matchIndexes.push( i );
}
return matchIndexes;
- })
+ } )
}
};
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2167,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
while ( soFar ) {
// Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
if ( match ) {
+
// Don't consume trailing commas as valid
- soFar = soFar.slice( match[0].length ) || soFar;
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
}
- groups.push( (tokens = []) );
+ groups.push( ( tokens = [] ) );
}
matched = false;
// Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
matched = match.shift();
- tokens.push({
+ tokens.push( {
value: matched,
+
// Cast descendant combinators to space
- type: match[0].replace( rtrim, " " )
- });
+ type: match[ 0 ].replace( rtrim, " " )
+ } );
soFar = soFar.slice( matched.length );
}
// Filters
for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match ))) ) {
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+ ( match = preFilters[ type ]( match ) ) ) ) {
matched = match.shift();
- tokens.push({
+ tokens.push( {
value: matched,
type: type,
matches: match
- });
+ } );
soFar = soFar.slice( matched.length );
}
}
@@ -2214,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
soFar.length :
soFar ?
Sizzle.error( selector ) :
+
// Cache the tokens
tokenCache( selector, groups ).slice( 0 );
};
@@ -2223,7 +2385,7 @@ function toSelector( tokens ) {
len = tokens.length,
selector = "";
for ( ; i < len; i++ ) {
- selector += tokens[i].value;
+ selector += tokens[ i ].value;
}
return selector;
}
@@ -2236,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
doneName = done++;
return combinator.first ?
+
// Check against closest ancestor/preceding element
function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
return matcher( elem, context, xml );
}
@@ -2253,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
if ( xml ) {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
if ( matcher( elem, context, xml ) ) {
return true;
@@ -2261,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
}
}
} else {
- while ( (elem = elem[ dir ]) ) {
+ while ( ( elem = elem[ dir ] ) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || (elem[ expando ] = {});
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
// Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+ uniqueCache = outerCache[ elem.uniqueID ] ||
+ ( outerCache[ elem.uniqueID ] = {} );
if ( skip && skip === elem.nodeName.toLowerCase() ) {
elem = elem[ dir ] || elem;
- } else if ( (oldCache = uniqueCache[ key ]) &&
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
// Assign to newCache so results back-propagate to previous elements
- return (newCache[ 2 ] = oldCache[ 2 ]);
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
} else {
+
// Reuse newcache so results back-propagate to previous elements
uniqueCache[ key ] = newCache;
// A match means we're done; a fail means we have to keep checking
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
return true;
}
}
@@ -2297,20 +2462,20 @@ function elementMatcher( matchers ) {
function( elem, context, xml ) {
var i = matchers.length;
while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
+ if ( !matchers[ i ]( elem, context, xml ) ) {
return false;
}
}
return true;
} :
- matchers[0];
+ matchers[ 0 ];
}
function multipleContexts( selector, contexts, results ) {
var i = 0,
len = contexts.length;
for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
+ Sizzle( selector, contexts[ i ], results );
}
return results;
}
@@ -2323,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) {
mapped = map != null;
for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
+ if ( ( elem = unmatched[ i ] ) ) {
if ( !filter || filter( elem, context, xml ) ) {
newUnmatched.push( elem );
if ( mapped ) {
@@ -2343,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
if ( postFinder && !postFinder[ expando ] ) {
postFinder = setMatcher( postFinder, postSelector );
}
- return markFunction(function( seed, results, context, xml ) {
+ return markFunction( function( seed, results, context, xml ) {
var temp, i, elem,
preMap = [],
postMap = [],
preexisting = results.length,
// Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+ elems = seed || multipleContexts(
+ selector || "*",
+ context.nodeType ? [ context ] : context,
+ []
+ ),
// Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ?
@@ -2358,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
elems,
matcherOut = matcher ?
+
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
@@ -2381,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
// Un-match failing elements by moving them back to matcherIn
i = temp.length;
while ( i-- ) {
- if ( (elem = temp[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ if ( ( elem = temp[ i ] ) ) {
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
}
}
}
@@ -2390,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
if ( seed ) {
if ( postFinder || preFilter ) {
if ( postFinder ) {
+
// Get the final matcherOut by condensing this intermediate into postFinder contexts
temp = [];
i = matcherOut.length;
while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
+ if ( ( elem = matcherOut[ i ] ) ) {
+
// Restore matcherIn since elem is not yet a final match
- temp.push( (matcherIn[i] = elem) );
+ temp.push( ( matcherIn[ i ] = elem ) );
}
}
- postFinder( null, (matcherOut = []), temp, xml );
+ postFinder( null, ( matcherOut = [] ), temp, xml );
}
// Move matched elements from seed to results to keep them synchronized
i = matcherOut.length;
while ( i-- ) {
- if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+ if ( ( elem = matcherOut[ i ] ) &&
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
- seed[temp] = !(results[temp] = elem);
+ seed[ temp ] = !( results[ temp ] = elem );
}
}
}
@@ -2426,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
push.apply( results, matcherOut );
}
}
- });
+ } );
}
function matcherFromTokens( tokens ) {
var checkContext, matcher, j,
len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
i = leadingRelative ? 1 : 0,
// The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2445,38 +2617,43 @@ function matcherFromTokens( tokens ) {
}, implicitRelative, true ),
matchers = [ function( elem, context, xml ) {
var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
+ ( checkContext = context ).nodeType ?
matchContext( elem, context, xml ) :
matchAnyContext( elem, context, xml ) );
+
// Avoid hanging onto element (issue #299)
checkContext = null;
return ret;
} ];
for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
} else {
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
// Return special upon seeing a positional matcher
if ( matcher[ expando ] ) {
+
// Find the next relative operator (if any) for proper handling
j = ++i;
for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
+ if ( Expr.relative[ tokens[ j ].type ] ) {
break;
}
}
return setMatcher(
i > 1 && elementMatcher( matchers ),
i > 1 && toSelector(
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens
+ .slice( 0, i - 1 )
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
).replace( rtrim, "$1" ),
matcher,
i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
j < len && toSelector( tokens )
);
}
@@ -2497,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
unmatched = seed && [],
setMatched = [],
contextBackup = outermostContext,
+
// We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
// Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
len = elems.length;
if ( outermost ) {
- outermostContext = context === document || context || outermost;
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ outermostContext = context == document || context || outermost;
}
// Add elements passing elementMatchers directly to results
// Support: IE<9, Safari
// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
if ( byElement && elem ) {
j = 0;
- if ( !context && elem.ownerDocument !== document ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( !context && elem.ownerDocument != document ) {
setDocument( elem );
xml = !documentIsHTML;
}
- while ( (matcher = elementMatchers[j++]) ) {
- if ( matcher( elem, context || document, xml) ) {
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
+ if ( matcher( elem, context || document, xml ) ) {
results.push( elem );
break;
}
@@ -2530,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
// Track unmatched elements for set filters
if ( bySet ) {
+
// They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
+ if ( ( elem = !matcher && elem ) ) {
matchedCount--;
}
@@ -2555,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
// numerically zero.
if ( bySet && i !== matchedCount ) {
j = 0;
- while ( (matcher = setMatchers[j++]) ) {
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
matcher( unmatched, setMatched, context, xml );
}
if ( seed ) {
+
// Reintegrate element matches to eliminate the need for sorting
if ( matchedCount > 0 ) {
while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+ setMatched[ i ] = pop.call( results );
}
}
}
@@ -2605,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
cached = compilerCache[ selector + " " ];
if ( !cached ) {
+
// Generate a function of recursive functions that can be used to check each element
if ( !match ) {
match = tokenize( selector );
}
i = match.length;
while ( i-- ) {
- cached = matcherFromTokens( match[i] );
+ cached = matcherFromTokens( match[ i ] );
if ( cached[ expando ] ) {
setMatchers.push( cached );
} else {
@@ -2620,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
}
// Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+ cached = compilerCache(
+ selector,
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
+ );
// Save selector and tokenization
cached.selector = selector;
@@ -2640,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
select = Sizzle.select = function( selector, context, results, seed ) {
var i, tokens, token, type, find,
compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( (selector = compiled.selector || selector) );
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
results = results || [];
@@ -2649,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
if ( match.length === 1 ) {
// Reduce context if the leading compound selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
if ( !context ) {
return results;
@@ -2666,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
}
// Fetch a seed set for right-to-left matching
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
while ( i-- ) {
- token = tokens[i];
+ token = tokens[ i ];
// Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
+ if ( Expr.relative[ ( type = token.type ) ] ) {
break;
}
- if ( (find = Expr.find[ type ]) ) {
+ if ( ( find = Expr.find[ type ] ) ) {
+
// Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( runescape, funescape ),
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
- )) ) {
+ if ( ( seed = find(
+ token.matches[ 0 ].replace( runescape, funescape ),
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+ context
+ ) ) ) {
// If seed is empty or no tokens remain, we can return early
tokens.splice( i, 1 );
@@ -2710,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
// One-time assignments
// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
@@ -2721,58 +2919,59 @@ setDocument();
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
+support.sortDetached = assert( function( el ) {
+
// Should return 1, but returns 4 (following)
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-});
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
// Support: IE<8
// Prevent attribute/property "interpolation"
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
+if ( !assert( function( el ) {
el.innerHTML = "<a href='#'></a>";
- return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
+ return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
addHandle( "type|href|height|width", function( elem, name, isXML ) {
if ( !isXML ) {
return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
}
- });
+ } );
}
// Support: IE<9
// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
+if ( !support.attributes || !assert( function( el ) {
el.innerHTML = "<input/>";
el.firstChild.setAttribute( "value", "" );
return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
- addHandle( "value", function( elem, name, isXML ) {
+} ) ) {
+ addHandle( "value", function( elem, _name, isXML ) {
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
return elem.defaultValue;
}
- });
+ } );
}
// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
- return el.getAttribute("disabled") == null;
-}) ) {
+if ( !assert( function( el ) {
+ return el.getAttribute( "disabled" ) == null;
+} ) ) {
addHandle( booleans, function( elem, name, isXML ) {
var val;
if ( !isXML ) {
return elem[ name ] === true ? name.toLowerCase() :
- (val = elem.getAttributeNode( name )) && val.specified ?
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
val.value :
- null;
+ null;
}
- });
+ } );
}
return Sizzle;
-})( window );
+} )( window );
@@ -3141,7 +3340,7 @@ jQuery.each( {
parents: function( elem ) {
return dir( elem, "parentNode" );
},
- parentsUntil: function( elem, i, until ) {
+ parentsUntil: function( elem, _i, until ) {
return dir( elem, "parentNode", until );
},
next: function( elem ) {
@@ -3156,10 +3355,10 @@ jQuery.each( {
prevAll: function( elem ) {
return dir( elem, "previousSibling" );
},
- nextUntil: function( elem, i, until ) {
+ nextUntil: function( elem, _i, until ) {
return dir( elem, "nextSibling", until );
},
- prevUntil: function( elem, i, until ) {
+ prevUntil: function( elem, _i, until ) {
return dir( elem, "previousSibling", until );
},
siblings: function( elem ) {
@@ -3169,7 +3368,13 @@ jQuery.each( {
return siblings( elem.firstChild );
},
contents: function( elem ) {
- if ( typeof elem.contentDocument !== "undefined" ) {
+ if ( elem.contentDocument != null &&
+
+ // Support: IE 11+
+ // <object> elements with no `data` attribute has an object
+ // `contentDocument` with a `null` prototype.
+ getProto( elem.contentDocument ) ) {
+
return elem.contentDocument;
}
@@ -3512,7 +3717,7 @@ jQuery.extend( {
var fns = arguments;
return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
+ jQuery.each( tuples, function( _i, tuple ) {
// Map tuples (progress, done, fail) to arguments (done, fail, progress)
var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3965,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
// ...except when executing function values
} else {
bulk = fn;
- fn = function( elem, key, value ) {
+ fn = function( elem, _key, value ) {
return bulk.call( jQuery( elem ), value );
};
}
@@ -4000,7 +4205,7 @@ var rmsPrefix = /^-ms-/,
rdashAlpha = /-([a-z])/g;
// Used by camelCase as callback to replace()
-function fcamelCase( all, letter ) {
+function fcamelCase( _all, letter ) {
return letter.toUpperCase();
}
@@ -4528,27 +4733,6 @@ var isHiddenWithinTree = function( elem, el ) {
jQuery.css( elem, "display" ) === "none";
};
-var swap = function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
-};
-
-
function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4903,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
// Support: IE <=9 only
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
+ // the select element.
+ div.innerHTML = "<option></option>";
+ support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
// XHTML parsers do not magically insert elements in the
// same way that tag soup parsers do. So we cannot shorten
@@ -4736,12 +4949,14 @@ var wrapMap = {
_default: [ 0, "", "" ]
};
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
+// Support: IE <=9 only
+if ( !support.option ) {
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
function getAll( context, tag ) {
@@ -4874,32 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0 - 4.3 only
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Android <=4.1 only
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE <=11 only
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
var
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -5008,8 +5197,8 @@ jQuery.event = {
special, handlers, type, namespaces, origType,
elemData = dataPriv.get( elem );
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
- if ( !elemData ) {
+ // Only attach events to objects that accept data
+ if ( !acceptData( elem ) ) {
return;
}
@@ -5033,7 +5222,7 @@ jQuery.event = {
// Init the element's event structure and main handler, if this is the first
if ( !( events = elemData.events ) ) {
- events = elemData.events = {};
+ events = elemData.events = Object.create( null );
}
if ( !( eventHandle = elemData.handle ) ) {
eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5380,15 @@ jQuery.event = {
dispatch: function( nativeEvent ) {
- // Make a writable jQuery.Event from the native event object
- var event = jQuery.event.fix( nativeEvent );
-
var i, j, ret, matched, handleObj, handlerQueue,
args = new Array( arguments.length ),
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( nativeEvent ),
+
+ handlers = (
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5771,13 +5963,6 @@ jQuery.fn.extend( {
var
- /* eslint-disable max-len */
-
- // See https://github.com/eslint/eslint/issues/3229
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
- /* eslint-enable */
-
// Support: IE <=10 - 11, Edge 12 - 13 only
// In IE/Edge using regex groups here causes severe slowdowns.
// See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5814,7 +5999,7 @@ function restoreScript( elem ) {
}
function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+ var i, l, type, pdataOld, udataOld, udataCur, events;
if ( dest.nodeType !== 1 ) {
return;
@@ -5822,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
// 1. Copy private data: events, handlers, etc.
if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.access( src );
- pdataCur = dataPriv.set( dest, pdataOld );
+ pdataOld = dataPriv.get( src );
events = pdataOld.events;
if ( events ) {
- delete pdataCur.handle;
- pdataCur.events = {};
+ dataPriv.remove( dest, "handle events" );
for ( type in events ) {
for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5864,7 +6047,7 @@ function fixInput( src, dest ) {
function domManip( collection, args, callback, ignored ) {
// Flatten any nested arrays
- args = concat.apply( [], args );
+ args = flat( args );
var fragment, first, scripts, hasScripts, node, doc,
i = 0,
@@ -5939,7 +6122,7 @@ function domManip( collection, args, callback, ignored ) {
if ( jQuery._evalUrl && !node.noModule ) {
jQuery._evalUrl( node.src, {
nonce: node.nonce || node.getAttribute( "nonce" )
- } );
+ }, doc );
}
} else {
DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
@@ -5976,7 +6159,7 @@ function remove( elem, selector, keepData ) {
jQuery.extend( {
htmlPrefilter: function( html ) {
- return html.replace( rxhtmlTag, "<$1></$2>" );
+ return html;
},
clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -6238,6 +6421,27 @@ var getStyles = function( elem ) {
return view.getComputedStyle( elem );
};
+var swap = function( elem, options, callback ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
@@ -6295,7 +6499,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
}
var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
- reliableMarginLeftVal,
+ reliableTrDimensionsVal, reliableMarginLeftVal,
container = document.createElement( "div" ),
div = document.createElement( "div" );
@@ -6330,6 +6534,35 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
scrollboxSize: function() {
computeStyleTests();
return scrollboxSizeVal;
+ },
+
+ // Support: IE 9 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
+ // some versions of this test; make sure not to make it pass there!
+ reliableTrDimensions: function() {
+ var table, tr, trChild, trStyle;
+ if ( reliableTrDimensionsVal == null ) {
+ table = document.createElement( "table" );
+ tr = document.createElement( "tr" );
+ trChild = document.createElement( "div" );
+
+ table.style.cssText = "position:absolute;left:-11111px";
+ tr.style.height = "1px";
+ trChild.style.height = "9px";
+
+ documentElement
+ .appendChild( table )
+ .appendChild( tr )
+ .appendChild( trChild );
+
+ trStyle = window.getComputedStyle( tr );
+ reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+
+ documentElement.removeChild( table );
+ }
+ return reliableTrDimensionsVal;
}
} );
} )();
@@ -6454,7 +6687,7 @@ var
fontWeight: "400"
};
-function setPositiveNumber( elem, value, subtract ) {
+function setPositiveNumber( _elem, value, subtract ) {
// Any relative (+/-) values have already been
// normalized at this point
@@ -6559,17 +6792,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
}
- // Fall back to offsetWidth/offsetHeight when value is "auto"
- // This happens for inline elements with no explicit setting (gh-3571)
- // Support: Android <=4.1 - 4.3 only
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
- // Support: IE 9-11 only
- // Also use offsetWidth/offsetHeight for when box sizing is unreliable
- // We use getClientRects() to check for hidden/disconnected.
- // In those cases, the computed value can be trusted to be border-box
+ // Support: IE 9 - 11 only
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
+ // In those cases, the computed value can be trusted to be border-box.
if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+ // Support: IE 10 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
val === "auto" ||
+
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+ // Make sure the element is visible & connected
elem.getClientRects().length ) {
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
@@ -6764,7 +7006,7 @@ jQuery.extend( {
}
} );
-jQuery.each( [ "height", "width" ], function( i, dimension ) {
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
jQuery.cssHooks[ dimension ] = {
get: function( elem, computed, extra ) {
if ( computed ) {
@@ -7537,7 +7779,7 @@ jQuery.fn.extend( {
clearQueue = type;
type = undefined;
}
- if ( clearQueue && type !== false ) {
+ if ( clearQueue ) {
this.queue( type || "fx", [] );
}
@@ -7620,7 +7862,7 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
var cssFn = jQuery.fn[ name ];
jQuery.fn[ name ] = function( speed, easing, callback ) {
return speed == null || typeof speed === "boolean" ?
@@ -7841,7 +8083,7 @@ boolHook = {
}
};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
var getter = attrHandle[ name ] || jQuery.find.attr;
attrHandle[ name ] = function( elem, name, isXML ) {
@@ -8465,7 +8707,9 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+ handle = (
+ dataPriv.get( cur, "events" ) || Object.create( null )
+ )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8576,7 +8820,10 @@ if ( !support.focusin ) {
jQuery.event.special[ fix ] = {
setup: function() {
- var doc = this.ownerDocument || this,
+
+ // Handle: regular nodes (via `this.ownerDocument`), window
+ // (via `this.document`) & document (via `this`).
+ var doc = this.ownerDocument || this.document || this,
attaches = dataPriv.access( doc, fix );
if ( !attaches ) {
@@ -8585,7 +8832,7 @@ if ( !support.focusin ) {
dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
},
teardown: function() {
- var doc = this.ownerDocument || this,
+ var doc = this.ownerDocument || this.document || this,
attaches = dataPriv.access( doc, fix ) - 1;
if ( !attaches ) {
@@ -8601,7 +8848,7 @@ if ( !support.focusin ) {
}
var location = window.location;
-var nonce = Date.now();
+var nonce = { guid: Date.now() };
var rquery = ( /\?/ );
@@ -8733,7 +8980,7 @@ jQuery.fn.extend( {
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
} )
- .map( function( i, elem ) {
+ .map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9346,7 +9593,8 @@ jQuery.extend( {
// Add or update anti-cache param if needed
if ( s.cache === false ) {
cacheURL = cacheURL.replace( rantiCache, "$1" );
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+ uncached;
}
// Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9479,6 +9727,11 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
+ // Use a noop converter for missing script
+ if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ s.converters[ "text script" ] = function() {};
+ }
+
// Convert no matter what (that way responseXXX fields are always set)
response = ajaxConvert( s, response, jqXHR, isSuccess );
@@ -9569,7 +9822,7 @@ jQuery.extend( {
}
} );
-jQuery.each( [ "get", "post" ], function( i, method ) {
+jQuery.each( [ "get", "post" ], function( _i, method ) {
jQuery[ method ] = function( url, data, callback, type ) {
// Shift arguments if data argument was omitted
@@ -9590,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
};
} );
+jQuery.ajaxPrefilter( function( s ) {
+ var i;
+ for ( i in s.headers ) {
+ if ( i.toLowerCase() === "content-type" ) {
+ s.contentType = s.headers[ i ] || "";
+ }
+ }
+} );
+
-jQuery._evalUrl = function( url, options ) {
+jQuery._evalUrl = function( url, options, doc ) {
return jQuery.ajax( {
url: url,
@@ -9609,7 +9871,7 @@ jQuery._evalUrl = function( url, options ) {
"text script": function() {}
},
dataFilter: function( response ) {
- jQuery.globalEval( response, options );
+ jQuery.globalEval( response, options, doc );
}
} );
};
@@ -9931,7 +10193,7 @@ var oldCallbacks = [],
jQuery.ajaxSetup( {
jsonp: "callback",
jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
this[ callback ] = true;
return callback;
}
@@ -10148,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
- "ajaxStart",
- "ajaxStop",
- "ajaxComplete",
- "ajaxError",
- "ajaxSuccess",
- "ajaxSend"
-], function( i, type ) {
- jQuery.fn[ type ] = function( fn ) {
- return this.on( type, fn );
- };
-} );
-
-
-
-
jQuery.expr.pseudos.animated = function( elem ) {
return jQuery.grep( jQuery.timers, function( fn ) {
return elem === fn.elem;
@@ -10221,6 +10466,12 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
+ if ( typeof props.top === "number" ) {
+ props.top += "px";
+ }
+ if ( typeof props.left === "number" ) {
+ props.left += "px";
+ }
curElem.css( props );
}
}
@@ -10371,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
// getComputedStyle returns percent when specified for top/left/bottom/right;
// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
function( elem, computed ) {
if ( computed ) {
@@ -10434,25 +10685,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
- function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
+jQuery.each( [
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+], function( _i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
};
} );
-jQuery.fn.extend( {
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
@@ -10474,9 +10719,33 @@ jQuery.fn.extend( {
return arguments.length === 1 ?
this.off( selector, "**" ) :
this.off( types, selector || "**", fn );
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
} );
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+ function( _i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+ } );
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
// Bind a function to a context, optionally partially applying any
// arguments.
// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10808,11 @@ jQuery.isNumeric = function( obj ) {
!isNaN( obj - parseFloat( obj ) );
};
+jQuery.trim = function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+};
@@ -10587,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
// Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
+if ( typeof noGlobal === "undefined" ) {
window.jQuery = window.$ = jQuery;
}
diff --git a/doc/_static/jquery.js b/doc/_static/jquery.js
index a1c07fd..b061403 100644
--- a/doc/_static/jquery.js
+++ b/doc/_static/jquery.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/doc/_static/language_data.js b/doc/_static/language_data.js
index d2b4ee9..863704b 100644
--- a/doc/_static/language_data.js
+++ b/doc/_static/language_data.js
@@ -5,7 +5,7 @@
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -13,7 +13,8 @@
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
-/* Non-minified version JS is _stemmer.js if file is provided */
+/* Non-minified version is copied as a separate JS file, is available */
+
/**
* Porter Stemmer
*/
@@ -199,7 +200,6 @@ var Stemmer = function() {
-
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
diff --git a/doc/_static/pygments.css b/doc/_static/pygments.css
index 20c4814..691aeb8 100644
--- a/doc/_static/pygments.css
+++ b/doc/_static/pygments.css
@@ -1,5 +1,10 @@
+pre { line-height: 125%; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
-.highlight { background: #eeffcc; }
+.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 */
diff --git a/doc/_static/searchtools.js b/doc/_static/searchtools.js
index ab56499..e09f926 100644
--- a/doc/_static/searchtools.js
+++ b/doc/_static/searchtools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for the full-text search.
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -59,10 +59,10 @@ var Search = {
_pulse_status : -1,
htmlToText : function(htmlString) {
- var htmlElement = document.createElement('span');
- htmlElement.innerHTML = htmlString;
- $(htmlElement).find('.headerlink').remove();
- docContent = $(htmlElement).find('[role=main]')[0];
+ var virtualDocument = document.implementation.createHTMLDocument('virtual');
+ var htmlElement = $(htmlString, virtualDocument);
+ htmlElement.find('.headerlink').remove();
+ docContent = htmlElement.find('[role=main]')[0];
if(docContent === undefined) {
console.warn("Content block not found. Sphinx search tries to obtain it " +
"via '[role=main]'. Could you check your theme or template.");
@@ -166,8 +166,7 @@ var Search = {
objectterms.push(tmp[i].toLowerCase());
}
- if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
- tmp[i] === "") {
+ if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
@@ -249,7 +248,7 @@ var Search = {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
- var listItem = $('<li style="display:none"></li>');
+ var listItem = $('<li></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
@@ -274,9 +273,9 @@ var Search = {
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
- listItem.slideDown(5, function() {
+ setTimeout(function() {
displayNextItem();
- });
+ }, 5);
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.ajax({url: requestUrl,
dataType: "text",
@@ -286,16 +285,16 @@ var Search = {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
- listItem.slideDown(5, function() {
+ setTimeout(function() {
displayNextItem();
- });
+ }, 5);
}});
} else {
// no source available, just display title
Search.output.append(listItem);
- listItem.slideDown(5, function() {
+ setTimeout(function() {
displayNextItem();
- });
+ }, 5);
}
}
// search finished, update title and status message
@@ -381,6 +380,13 @@ var Search = {
},
/**
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
+ */
+ escapeRegExp : function(string) {
+ return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+ },
+
+ /**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, titleterms) {
@@ -403,13 +409,14 @@ var Search = {
];
// add support for partial matches
if (word.length > 2) {
+ var word_regex = this.escapeRegExp(word);
for (var w in terms) {
- if (w.match(word) && !terms[word]) {
+ if (w.match(word_regex) && !terms[word]) {
_o.push({files: terms[w], score: Scorer.partialTerm})
}
}
for (var w in titleterms) {
- if (w.match(word) && !titleterms[word]) {
+ if (w.match(word_regex) && !titleterms[word]) {
_o.push({files: titleterms[w], score: Scorer.partialTitle})
}
}
@@ -502,7 +509,7 @@ var Search = {
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
- var rv = $('<div class="context"></div>').text(excerpt);
+ var rv = $('<p class="context"></p>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
diff --git a/doc/_static/sidebar.js b/doc/_static/sidebar.js
index 657f8be..599639f 100644
--- a/doc/_static/sidebar.js
+++ b/doc/_static/sidebar.js
@@ -16,7 +16,7 @@
* Once the browser is closed the cookie is deleted and the position
* reset to the default (expanded).
*
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
diff --git a/doc/_static/underscore-1.13.1.js b/doc/_static/underscore-1.13.1.js
new file mode 100644
index 0000000..ffd77af
--- /dev/null
+++ b/doc/_static/underscore-1.13.1.js
@@ -0,0 +1,2042 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define('underscore', factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {
+ var current = global._;
+ var exports = global._ = factory();
+ exports.noConflict = function () { global._ = current; return exports; };
+ }()));
+}(this, (function () {
+ // Underscore.js 1.13.1
+ // https://underscorejs.org
+ // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+ // Underscore may be freely distributed under the MIT license.
+
+ // Current version.
+ var VERSION = '1.13.1';
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self == 'object' && self.self === self && self ||
+ typeof global == 'object' && global.global === global && global ||
+ Function('return this')() ||
+ {};
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+ var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // Modern feature detection.
+ var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+ supportsDataView = typeof DataView !== 'undefined';
+
+ // All **ECMAScript 5+** native function implementations that we hope to use
+ // are declared here.
+ var nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeCreate = Object.create,
+ nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+ // Create references to these builtin functions because we override them.
+ var _isNaN = isNaN,
+ _isFinite = isFinite;
+
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+ // The largest integer that can be represented exactly.
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+ // Some functions take a variable number of arguments, or a few expected
+ // arguments at the beginning and then a variable number of values to operate
+ // on. This helper accumulates all remaining arguments past the function’s
+ // argument length (or an explicit `startIndex`), into an array that becomes
+ // the last argument. Similar to ES6’s "rest parameter".
+ function restArguments(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0),
+ rest = Array(length),
+ index = 0;
+ for (; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ var args = Array(startIndex + 1);
+ for (index = 0; index < startIndex; index++) {
+ args[index] = arguments[index];
+ }
+ args[startIndex] = rest;
+ return func.apply(this, args);
+ };
+ }
+
+ // Is a given variable an object?
+ function isObject(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ }
+
+ // Is a given value equal to null?
+ function isNull(obj) {
+ return obj === null;
+ }
+
+ // Is a given variable undefined?
+ function isUndefined(obj) {
+ return obj === void 0;
+ }
+
+ // Is a given value a boolean?
+ function isBoolean(obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+ }
+
+ // Is a given value a DOM element?
+ function isElement(obj) {
+ return !!(obj && obj.nodeType === 1);
+ }
+
+ // Internal function for creating a `toString`-based type tester.
+ function tagTester(name) {
+ var tag = '[object ' + name + ']';
+ return function(obj) {
+ return toString.call(obj) === tag;
+ };
+ }
+
+ var isString = tagTester('String');
+
+ var isNumber = tagTester('Number');
+
+ var isDate = tagTester('Date');
+
+ var isRegExp = tagTester('RegExp');
+
+ var isError = tagTester('Error');
+
+ var isSymbol = tagTester('Symbol');
+
+ var isArrayBuffer = tagTester('ArrayBuffer');
+
+ var isFunction = tagTester('Function');
+
+ // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+ // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+ var nodelist = root.document && root.document.childNodes;
+ if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+ isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+ }
+
+ var isFunction$1 = isFunction;
+
+ var hasObjectTag = tagTester('Object');
+
+ // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+ // In IE 11, the most common among them, this problem also applies to
+ // `Map`, `WeakMap` and `Set`.
+ var hasStringTagBug = (
+ supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+ ),
+ isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+ var isDataView = tagTester('DataView');
+
+ // In IE 10 - Edge 13, we need a different heuristic
+ // to determine whether an object is a `DataView`.
+ function ie10IsDataView(obj) {
+ return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+ }
+
+ var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native `Array.isArray`.
+ var isArray = nativeIsArray || tagTester('Array');
+
+ // Internal function to check whether `key` is an own property name of `obj`.
+ function has$1(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+ }
+
+ var isArguments = tagTester('Arguments');
+
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
+ // there isn't any inspectable "Arguments" type.
+ (function() {
+ if (!isArguments(arguments)) {
+ isArguments = function(obj) {
+ return has$1(obj, 'callee');
+ };
+ }
+ }());
+
+ var isArguments$1 = isArguments;
+
+ // Is a given object a finite number?
+ function isFinite$1(obj) {
+ return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+ }
+
+ // Is the given value `NaN`?
+ function isNaN$1(obj) {
+ return isNumber(obj) && _isNaN(obj);
+ }
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function constant(value) {
+ return function() {
+ return value;
+ };
+ }
+
+ // Common internal logic for `isArrayLike` and `isBufferLike`.
+ function createSizePropertyCheck(getSizeProperty) {
+ return function(collection) {
+ var sizeProperty = getSizeProperty(collection);
+ return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+ }
+ }
+
+ // Internal helper to generate a function to obtain property `key` from `obj`.
+ function shallowProperty(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+ }
+
+ // Internal helper to obtain the `byteLength` property of an object.
+ var getByteLength = shallowProperty('byteLength');
+
+ // Internal helper to determine whether we should spend extensive checks against
+ // `ArrayBuffer` et al.
+ var isBufferLike = createSizePropertyCheck(getByteLength);
+
+ // Is a given value a typed array?
+ var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+ function isTypedArray(obj) {
+ // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+ // Otherwise, fall back on the above regular expression.
+ return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+ isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+ }
+
+ var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+ // Internal helper to obtain the `length` property of an object.
+ var getLength = shallowProperty('length');
+
+ // Internal helper to create a simple lookup structure.
+ // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+ // circular imports. `emulatedSet` is a one-off solution that only works for
+ // arrays of strings.
+ function emulatedSet(keys) {
+ var hash = {};
+ for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+ return {
+ contains: function(key) { return hash[key]; },
+ push: function(key) {
+ hash[key] = true;
+ return keys.push(key);
+ }
+ };
+ }
+
+ // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+ // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+ // needed.
+ function collectNonEnumProps(obj, keys) {
+ keys = emulatedSet(keys);
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+ keys.push(prop);
+ }
+ }
+ }
+
+ // Retrieve the names of an object's own properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`.
+ function keys(obj) {
+ if (!isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (has$1(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ function isEmpty(obj) {
+ if (obj == null) return true;
+ // Skip the more expensive `toString`-based type checks if `obj` has no
+ // `.length`.
+ var length = getLength(obj);
+ if (typeof length == 'number' && (
+ isArray(obj) || isString(obj) || isArguments$1(obj)
+ )) return length === 0;
+ return getLength(keys(obj)) === 0;
+ }
+
+ // Returns whether an object has a given set of `key:value` pairs.
+ function isMatch(object, attrs) {
+ var _keys = keys(attrs), length = _keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = _keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+ }
+
+ // If Underscore is called as a function, it returns a wrapped object that can
+ // be used OO-style. This wrapper holds altered versions of all functions added
+ // through `_.mixin`. Wrapped objects may be chained.
+ function _$1(obj) {
+ if (obj instanceof _$1) return obj;
+ if (!(this instanceof _$1)) return new _$1(obj);
+ this._wrapped = obj;
+ }
+
+ _$1.VERSION = VERSION;
+
+ // Extracts the result from a wrapped and chained object.
+ _$1.prototype.value = function() {
+ return this._wrapped;
+ };
+
+ // Provide unwrapping proxies for some methods used in engine operations
+ // such as arithmetic and JSON stringification.
+ _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
+
+ _$1.prototype.toString = function() {
+ return String(this._wrapped);
+ };
+
+ // Internal function to wrap or shallow-copy an ArrayBuffer,
+ // typed array or DataView to a new view, reusing the buffer.
+ function toBufferView(bufferSource) {
+ return new Uint8Array(
+ bufferSource.buffer || bufferSource,
+ bufferSource.byteOffset || 0,
+ getByteLength(bufferSource)
+ );
+ }
+
+ // We use this string twice, so give it a name for minification.
+ var tagDataView = '[object DataView]';
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function eq(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // `null` or `undefined` only equal to itself (strict comparison).
+ if (a == null || b == null) return false;
+ // `NaN`s are equivalent, but non-reflexive.
+ if (a !== a) return b !== b;
+ // Exhaust primitive checks
+ var type = typeof a;
+ if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+ return deepEq(a, b, aStack, bStack);
+ }
+
+ // Internal recursive comparison function for `_.isEqual`.
+ function deepEq(a, b, aStack, bStack) {
+ // Unwrap any wrapped objects.
+ if (a instanceof _$1) a = a._wrapped;
+ if (b instanceof _$1) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className !== toString.call(b)) return false;
+ // Work around a bug in IE 10 - Edge 13.
+ if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+ if (!isDataView$1(b)) return false;
+ className = tagDataView;
+ }
+ switch (className) {
+ // These types are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN.
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ case '[object Symbol]':
+ return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+ case '[object ArrayBuffer]':
+ case tagDataView:
+ // Coerce to typed array so we can fall through.
+ return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays && isTypedArray$1(a)) {
+ var byteLength = getByteLength(a);
+ if (byteLength !== getByteLength(b)) return false;
+ if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+ areArrays = true;
+ }
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+ isFunction$1(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var _keys = keys(a), key;
+ length = _keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = _keys[length];
+ if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+ }
+
+ // Perform a deep comparison to check if two objects are equal.
+ function isEqual(a, b) {
+ return eq(a, b);
+ }
+
+ // Retrieve all the enumerable property names of an object.
+ function allKeys(obj) {
+ if (!isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ }
+
+ // Since the regular `Object.prototype.toString` type tests don't work for
+ // some types in IE 11, we use a fingerprinting heuristic instead, based
+ // on the methods. It's not great, but it's the best we got.
+ // The fingerprint method lists are defined below.
+ function ie11fingerprint(methods) {
+ var length = getLength(methods);
+ return function(obj) {
+ if (obj == null) return false;
+ // `Map`, `WeakMap` and `Set` have no enumerable keys.
+ var keys = allKeys(obj);
+ if (getLength(keys)) return false;
+ for (var i = 0; i < length; i++) {
+ if (!isFunction$1(obj[methods[i]])) return false;
+ }
+ // If we are testing against `WeakMap`, we need to ensure that
+ // `obj` doesn't have a `forEach` method in order to distinguish
+ // it from a regular `Map`.
+ return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+ };
+ }
+
+ // In the interest of compact minification, we write
+ // each string in the fingerprints only once.
+ var forEachName = 'forEach',
+ hasName = 'has',
+ commonInit = ['clear', 'delete'],
+ mapTail = ['get', hasName, 'set'];
+
+ // `Map`, `WeakMap` and `Set` each have slightly different
+ // combinations of the above sublists.
+ var mapMethods = commonInit.concat(forEachName, mapTail),
+ weakMapMethods = commonInit.concat(mapTail),
+ setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+ var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+ var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+ var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+ var isWeakSet = tagTester('WeakSet');
+
+ // Retrieve the values of an object's properties.
+ function values(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[_keys[i]];
+ }
+ return values;
+ }
+
+ // Convert an object into a list of `[key, value]` pairs.
+ // The opposite of `_.object` with one argument.
+ function pairs(obj) {
+ var _keys = keys(obj);
+ var length = _keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [_keys[i], obj[_keys[i]]];
+ }
+ return pairs;
+ }
+
+ // Invert the keys and values of an object. The values must be serializable.
+ function invert(obj) {
+ var result = {};
+ var _keys = keys(obj);
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ result[obj[_keys[i]]] = _keys[i];
+ }
+ return result;
+ }
+
+ // Return a sorted list of the function names available on the object.
+ function functions(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (isFunction$1(obj[key])) names.push(key);
+ }
+ return names.sort();
+ }
+
+ // An internal function for creating assigner functions.
+ function createAssigner(keysFunc, defaults) {
+ return function(obj) {
+ var length = arguments.length;
+ if (defaults) obj = Object(obj);
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!defaults || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+ }
+
+ // Extend a given object with all the properties in passed-in object(s).
+ var extend = createAssigner(allKeys);
+
+ // Assigns a given object with all the own properties in the passed-in
+ // object(s).
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ var extendOwn = createAssigner(keys);
+
+ // Fill in a given object with default properties.
+ var defaults = createAssigner(allKeys, true);
+
+ // Create a naked function reference for surrogate-prototype-swapping.
+ function ctor() {
+ return function(){};
+ }
+
+ // An internal function for creating a new object that inherits from another.
+ function baseCreate(prototype) {
+ if (!isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ var Ctor = ctor();
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+ }
+
+ // Creates an object that inherits from the given prototype object.
+ // If additional properties are provided then they will be added to the
+ // created object.
+ function create(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) extendOwn(result, props);
+ return result;
+ }
+
+ // Create a (shallow-cloned) duplicate of an object.
+ function clone(obj) {
+ if (!isObject(obj)) return obj;
+ return isArray(obj) ? obj.slice() : extend({}, obj);
+ }
+
+ // Invokes `interceptor` with the `obj` and then returns `obj`.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ function tap(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ }
+
+ // Normalize a (deep) property `path` to array.
+ // Like `_.iteratee`, this function can be customized.
+ function toPath$1(path) {
+ return isArray(path) ? path : [path];
+ }
+ _$1.toPath = toPath$1;
+
+ // Internal wrapper for `_.toPath` to enable minification.
+ // Similar to `cb` for `_.iteratee`.
+ function toPath(path) {
+ return _$1.toPath(path);
+ }
+
+ // Internal function to obtain a nested property in `obj` along `path`.
+ function deepGet(obj, path) {
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ if (obj == null) return void 0;
+ obj = obj[path[i]];
+ }
+ return length ? obj : void 0;
+ }
+
+ // Get the value of the (deep) property on `path` from `object`.
+ // If any property in `path` does not exist or if the value is
+ // `undefined`, return `defaultValue` instead.
+ // The `path` is normalized through `_.toPath`.
+ function get(object, path, defaultValue) {
+ var value = deepGet(object, toPath(path));
+ return isUndefined(value) ? defaultValue : value;
+ }
+
+ // Shortcut function for checking if an object has a given property directly on
+ // itself (in other words, not on a prototype). Unlike the internal `has`
+ // function, this public version can also traverse nested properties.
+ function has(obj, path) {
+ path = toPath(path);
+ var length = path.length;
+ for (var i = 0; i < length; i++) {
+ var key = path[i];
+ if (!has$1(obj, key)) return false;
+ obj = obj[key];
+ }
+ return !!length;
+ }
+
+ // Keep the identity function around for default iteratees.
+ function identity(value) {
+ return value;
+ }
+
+ // Returns a predicate for checking whether an object has a given set of
+ // `key:value` pairs.
+ function matcher(attrs) {
+ attrs = extendOwn({}, attrs);
+ return function(obj) {
+ return isMatch(obj, attrs);
+ };
+ }
+
+ // Creates a function that, when passed an object, will traverse that object’s
+ // properties down the given `path`, specified as an array of keys or indices.
+ function property(path) {
+ path = toPath(path);
+ return function(obj) {
+ return deepGet(obj, path);
+ };
+ }
+
+ // Internal function that returns an efficient (for current engines) version
+ // of the passed-in callback, to be repeatedly applied in other Underscore
+ // functions.
+ function optimizeCb(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ // The 2-argument case is omitted because we’re not using it.
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+ }
+
+ // An internal function to generate callbacks that can be applied to each
+ // element in a collection, returning the desired result — either `_.identity`,
+ // an arbitrary callback, a property matcher, or a property accessor.
+ function baseIteratee(value, context, argCount) {
+ if (value == null) return identity;
+ if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+ if (isObject(value) && !isArray(value)) return matcher(value);
+ return property(value);
+ }
+
+ // External wrapper for our callback generator. Users may customize
+ // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+ // This abstraction hides the internal-only `argCount` argument.
+ function iteratee(value, context) {
+ return baseIteratee(value, context, Infinity);
+ }
+ _$1.iteratee = iteratee;
+
+ // The function we call internally to generate a callback. It invokes
+ // `_.iteratee` if overridden, otherwise `baseIteratee`.
+ function cb(value, context, argCount) {
+ if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
+ return baseIteratee(value, context, argCount);
+ }
+
+ // Returns the results of applying the `iteratee` to each element of `obj`.
+ // In contrast to `_.map` it returns an object.
+ function mapObject(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = keys(obj),
+ length = _keys.length,
+ results = {};
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ // Predicate-generating function. Often useful outside of Underscore.
+ function noop(){}
+
+ // Generates a function for a given object that returns a given property.
+ function propertyOf(obj) {
+ if (obj == null) return noop;
+ return function(path) {
+ return get(obj, path);
+ };
+ }
+
+ // Run a function **n** times.
+ function times(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+ }
+
+ // Return a random integer between `min` and `max` (inclusive).
+ function random(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ }
+
+ // A (possibly faster) way to get the current timestamp as an integer.
+ var now = Date.now || function() {
+ return new Date().getTime();
+ };
+
+ // Internal helper to generate functions for escaping and unescaping strings
+ // to/from HTML interpolation.
+ function createEscaper(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ }
+
+ // Internal list of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '`': '&#x60;'
+ };
+
+ // Function for escaping strings to HTML interpolation.
+ var _escape = createEscaper(escapeMap);
+
+ // Internal list of HTML entities for unescaping.
+ var unescapeMap = invert(escapeMap);
+
+ // Function for unescaping strings from HTML interpolation.
+ var _unescape = createEscaper(unescapeMap);
+
+ // By default, Underscore uses ERB-style template delimiters. Change the
+ // following template settings to use alternative delimiters.
+ var templateSettings = _$1.templateSettings = {
+ evaluate: /<%([\s\S]+?)%>/g,
+ interpolate: /<%=([\s\S]+?)%>/g,
+ escape: /<%-([\s\S]+?)%>/g
+ };
+
+ // When customizing `_.templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+ function escapeChar(match) {
+ return '\\' + escapes[match];
+ }
+
+ // In order to prevent third-party code injection through
+ // `_.templateSettings.variable`, we test it against the following regular
+ // expression. It is intentionally a bit more liberal than just matching valid
+ // identifiers, but still prevents possible loopholes through defaults or
+ // destructuring assignment.
+ var bareIdentifier = /^\s*(\w|\$)+\s*$/;
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ // NB: `oldSettings` only exists for backwards compatibility.
+ function template(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = defaults({}, settings, _$1.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offset.
+ return match;
+ });
+ source += "';\n";
+
+ var argument = settings.variable;
+ if (argument) {
+ // Insure against third-party code injection. (CVE-2021-23358)
+ if (!bareIdentifier.test(argument)) throw new Error(
+ 'variable is not a bare identifier: ' + argument
+ );
+ } else {
+ // If a variable is not specified, place data values in local scope.
+ source = 'with(obj||{}){\n' + source + '}\n';
+ argument = 'obj';
+ }
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ var render;
+ try {
+ render = new Function(argument, '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, _$1);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+ }
+
+ // Traverses the children of `obj` along `path`. If a child is a function, it
+ // is invoked with its parent as context. Returns the value of the final
+ // child, or `fallback` if any child is undefined.
+ function result(obj, path, fallback) {
+ path = toPath(path);
+ var length = path.length;
+ if (!length) {
+ return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+ }
+ for (var i = 0; i < length; i++) {
+ var prop = obj == null ? void 0 : obj[path[i]];
+ if (prop === void 0) {
+ prop = fallback;
+ i = length; // Ensure we don't continue iterating.
+ }
+ obj = isFunction$1(prop) ? prop.call(obj) : prop;
+ }
+ return obj;
+ }
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ function uniqueId(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+ }
+
+ // Start chaining a wrapped Underscore object.
+ function chain(obj) {
+ var instance = _$1(obj);
+ instance._chain = true;
+ return instance;
+ }
+
+ // Internal function to execute `sourceFunc` bound to `context` with optional
+ // `args`. Determines whether to execute a function as a constructor or as a
+ // normal function.
+ function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (isObject(result)) return result;
+ return self;
+ }
+
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+ // as a placeholder by default, allowing any combination of arguments to be
+ // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+ var partial = restArguments(function(func, boundArgs) {
+ var placeholder = partial.placeholder;
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return executeBound(func, bound, this, this, args);
+ };
+ return bound;
+ });
+
+ partial.placeholder = _$1;
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally).
+ var bind = restArguments(function(func, context, args) {
+ if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+ var bound = restArguments(function(callArgs) {
+ return executeBound(func, bound, context, this, args.concat(callArgs));
+ });
+ return bound;
+ });
+
+ // Internal helper for collection methods to determine whether a collection
+ // should be iterated as an array or as an object.
+ // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+ var isArrayLike = createSizePropertyCheck(getLength);
+
+ // Internal implementation of a recursive `flatten` function.
+ function flatten$1(input, depth, strict, output) {
+ output = output || [];
+ if (!depth && depth !== 0) {
+ depth = Infinity;
+ } else if (depth <= 0) {
+ return output.concat(input);
+ }
+ var idx = output.length;
+ for (var i = 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+ // Flatten current level of array or arguments object.
+ if (depth > 1) {
+ flatten$1(value, depth - 1, strict, output);
+ idx = output.length;
+ } else {
+ var j = 0, len = value.length;
+ while (j < len) output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+ }
+
+ // Bind a number of an object's methods to that object. Remaining arguments
+ // are the method names to be bound. Useful for ensuring that all callbacks
+ // defined on an object belong to it.
+ var bindAll = restArguments(function(obj, keys) {
+ keys = flatten$1(keys, false, false);
+ var index = keys.length;
+ if (index < 1) throw new Error('bindAll must be passed function names');
+ while (index--) {
+ var key = keys[index];
+ obj[key] = bind(obj[key], obj);
+ }
+ return obj;
+ });
+
+ // Memoize an expensive function by storing its results.
+ function memoize(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+ }
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ var delay = restArguments(function(func, wait, args) {
+ return setTimeout(function() {
+ return func.apply(null, args);
+ }, wait);
+ });
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ var defer = partial(delay, _$1, 1);
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ function throttle(func, wait, options) {
+ var timeout, context, args, result;
+ var previous = 0;
+ if (!options) options = {};
+
+ var later = function() {
+ previous = options.leading === false ? 0 : now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+
+ var throttled = function() {
+ var _now = now();
+ if (!previous && options.leading === false) previous = _now;
+ var remaining = wait - (_now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = _now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+
+ throttled.cancel = function() {
+ clearTimeout(timeout);
+ previous = 0;
+ timeout = context = args = null;
+ };
+
+ return throttled;
+ }
+
+ // When a sequence of calls of the returned function ends, the argument
+ // function is triggered. The end of a sequence is defined by the `wait`
+ // parameter. If `immediate` is passed, the argument function will be
+ // triggered at the beginning of the sequence instead of at the end.
+ function debounce(func, wait, immediate) {
+ var timeout, previous, args, result, context;
+
+ var later = function() {
+ var passed = now() - previous;
+ if (wait > passed) {
+ timeout = setTimeout(later, wait - passed);
+ } else {
+ timeout = null;
+ if (!immediate) result = func.apply(context, args);
+ // This check is needed because `func` can recursively invoke `debounced`.
+ if (!timeout) args = context = null;
+ }
+ };
+
+ var debounced = restArguments(function(_args) {
+ context = this;
+ args = _args;
+ previous = now();
+ if (!timeout) {
+ timeout = setTimeout(later, wait);
+ if (immediate) result = func.apply(context, args);
+ }
+ return result;
+ });
+
+ debounced.cancel = function() {
+ clearTimeout(timeout);
+ timeout = args = context = null;
+ };
+
+ return debounced;
+ }
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ function wrap(func, wrapper) {
+ return partial(wrapper, func);
+ }
+
+ // Returns a negated version of the passed-in predicate.
+ function negate(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ }
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ function compose() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+ }
+
+ // Returns a function that will only be executed on and after the Nth call.
+ function after(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+
+ // Returns a function that will only be executed up to (but not including) the
+ // Nth call.
+ function before(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+ }
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ var once = partial(before, 2);
+
+ // Returns the first key on an object that passes a truth test.
+ function findKey(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = keys(obj), key;
+ for (var i = 0, length = _keys.length; i < length; i++) {
+ key = _keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+ }
+
+ // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+ function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+ }
+
+ // Returns the first index on an array-like that passes a truth test.
+ var findIndex = createPredicateIndexFinder(1);
+
+ // Returns the last index on an array-like that passes a truth test.
+ var findLastIndex = createPredicateIndexFinder(-1);
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ function sortedIndex(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+ }
+
+ // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), isNaN$1);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+ }
+
+ // Return the position of the first occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+ // Return the position of the last occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+ // Return the first value which passes a truth test.
+ function find(obj, predicate, context) {
+ var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+ var key = keyFinder(obj, predicate, context);
+ if (key !== void 0 && key !== -1) return obj[key];
+ }
+
+ // Convenience version of a common use case of `_.find`: getting the first
+ // object containing specific `key:value` pairs.
+ function findWhere(obj, attrs) {
+ return find(obj, matcher(attrs));
+ }
+
+ // The cornerstone for collection functions, an `each`
+ // implementation, aka `forEach`.
+ // Handles raw objects in addition to array-likes. Treats all
+ // sparse array-likes as if they were dense.
+ function each(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var _keys = keys(obj);
+ for (i = 0, length = _keys.length; i < length; i++) {
+ iteratee(obj[_keys[i]], _keys[i], obj);
+ }
+ }
+ return obj;
+ }
+
+ // Return the results of applying the iteratee to each element.
+ function map(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ }
+
+ // Internal helper to create a reducing function, iterating left or right.
+ function createReduce(dir) {
+ // Wrap code that reassigns argument variables in a separate function than
+ // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+ var reducer = function(obj, iteratee, memo, initial) {
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ if (!initial) {
+ memo = obj[_keys ? _keys[index] : index];
+ index += dir;
+ }
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = _keys ? _keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ };
+
+ return function(obj, iteratee, memo, context) {
+ var initial = arguments.length >= 3;
+ return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+ };
+ }
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`.
+ var reduce = createReduce(1);
+
+ // The right-associative version of reduce, also known as `foldr`.
+ var reduceRight = createReduce(-1);
+
+ // Return all the elements that pass a truth test.
+ function filter(obj, predicate, context) {
+ var results = [];
+ predicate = cb(predicate, context);
+ each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+ }
+
+ // Return all the elements for which a truth test fails.
+ function reject(obj, predicate, context) {
+ return filter(obj, negate(cb(predicate)), context);
+ }
+
+ // Determine whether all of the elements pass a truth test.
+ function every(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+ }
+
+ // Determine if at least one element in the object passes a truth test.
+ function some(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var _keys = !isArrayLike(obj) && keys(obj),
+ length = (_keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = _keys ? _keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+ }
+
+ // Determine if the array or object contains a given item (using `===`).
+ function contains(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return indexOf(obj, item, fromIndex) >= 0;
+ }
+
+ // Invoke a method (with arguments) on every item in a collection.
+ var invoke = restArguments(function(obj, path, args) {
+ var contextPath, func;
+ if (isFunction$1(path)) {
+ func = path;
+ } else {
+ path = toPath(path);
+ contextPath = path.slice(0, -1);
+ path = path[path.length - 1];
+ }
+ return map(obj, function(context) {
+ var method = func;
+ if (!method) {
+ if (contextPath && contextPath.length) {
+ context = deepGet(context, contextPath);
+ }
+ if (context == null) return void 0;
+ method = context[path];
+ }
+ return method == null ? method : method.apply(context, args);
+ });
+ });
+
+ // Convenience version of a common use case of `_.map`: fetching a property.
+ function pluck(obj, key) {
+ return map(obj, property(key));
+ }
+
+ // Convenience version of a common use case of `_.filter`: selecting only
+ // objects containing specific `key:value` pairs.
+ function where(obj, attrs) {
+ return filter(obj, matcher(attrs));
+ }
+
+ // Return the maximum element (or element-based computation).
+ function max(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ // Return the minimum element (or element-based computation).
+ function min(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+ obj = isArrayLike(obj) ? obj : values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value != null && value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ each(obj, function(v, index, list) {
+ computed = iteratee(v, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = v;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ }
+
+ // Sample **n** random values from a collection using the modern version of the
+ // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ // If **n** is not specified, returns a single random element.
+ // The internal `guard` argument allows it to work with `_.map`.
+ function sample(obj, n, guard) {
+ if (n == null || guard) {
+ if (!isArrayLike(obj)) obj = values(obj);
+ return obj[random(obj.length - 1)];
+ }
+ var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+ var length = getLength(sample);
+ n = Math.max(Math.min(n, length), 0);
+ var last = length - 1;
+ for (var index = 0; index < n; index++) {
+ var rand = random(index, last);
+ var temp = sample[index];
+ sample[index] = sample[rand];
+ sample[rand] = temp;
+ }
+ return sample.slice(0, n);
+ }
+
+ // Shuffle a collection.
+ function shuffle(obj) {
+ return sample(obj, Infinity);
+ }
+
+ // Sort the object's values by a criterion produced by an iteratee.
+ function sortBy(obj, iteratee, context) {
+ var index = 0;
+ iteratee = cb(iteratee, context);
+ return pluck(map(obj, function(value, key, list) {
+ return {
+ value: value,
+ index: index++,
+ criteria: iteratee(value, key, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ }
+
+ // An internal function used for aggregate "group by" operations.
+ function group(behavior, partition) {
+ return function(obj, iteratee, context) {
+ var result = partition ? [[], []] : {};
+ iteratee = cb(iteratee, context);
+ each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+ }
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ var groupBy = group(function(result, value, key) {
+ if (has$1(result, key)) result[key].push(value); else result[key] = [value];
+ });
+
+ // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+ // when you know that your index values will be unique.
+ var indexBy = group(function(result, value, key) {
+ result[key] = value;
+ });
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ var countBy = group(function(result, value, key) {
+ if (has$1(result, key)) result[key]++; else result[key] = 1;
+ });
+
+ // Split a collection into two arrays: one whose elements all pass the given
+ // truth test, and one whose elements all do not pass the truth test.
+ var partition = group(function(result, value, pass) {
+ result[pass ? 0 : 1].push(value);
+ }, true);
+
+ // Safely create a real, live array from anything iterable.
+ var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+ function toArray(obj) {
+ if (!obj) return [];
+ if (isArray(obj)) return slice.call(obj);
+ if (isString(obj)) {
+ // Keep surrogate pair characters together.
+ return obj.match(reStrSymbol);
+ }
+ if (isArrayLike(obj)) return map(obj, identity);
+ return values(obj);
+ }
+
+ // Return the number of elements in a collection.
+ function size(obj) {
+ if (obj == null) return 0;
+ return isArrayLike(obj) ? obj.length : keys(obj).length;
+ }
+
+ // Internal `_.pick` helper function to determine whether `key` is an enumerable
+ // property name of `obj`.
+ function keyInObj(value, key, obj) {
+ return key in obj;
+ }
+
+ // Return a copy of the object only containing the allowed properties.
+ var pick = restArguments(function(obj, keys) {
+ var result = {}, iteratee = keys[0];
+ if (obj == null) return result;
+ if (isFunction$1(iteratee)) {
+ if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+ keys = allKeys(obj);
+ } else {
+ iteratee = keyInObj;
+ keys = flatten$1(keys, false, false);
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+ });
+
+ // Return a copy of the object without the disallowed properties.
+ var omit = restArguments(function(obj, keys) {
+ var iteratee = keys[0], context;
+ if (isFunction$1(iteratee)) {
+ iteratee = negate(iteratee);
+ if (keys.length > 1) context = keys[1];
+ } else {
+ keys = map(flatten$1(keys, false, false), String);
+ iteratee = function(value, key) {
+ return !contains(keys, key);
+ };
+ }
+ return pick(obj, iteratee, context);
+ });
+
+ // Returns everything but the last entry of the array. Especially useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N.
+ function initial(array, n, guard) {
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+ }
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. The **guard** check allows it to work with `_.map`.
+ function first(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[0];
+ return initial(array, array.length - n);
+ }
+
+ // Returns everything but the first entry of the `array`. Especially useful on
+ // the `arguments` object. Passing an **n** will return the rest N values in the
+ // `array`.
+ function rest(array, n, guard) {
+ return slice.call(array, n == null || guard ? 1 : n);
+ }
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array.
+ function last(array, n, guard) {
+ if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+ if (n == null || guard) return array[array.length - 1];
+ return rest(array, Math.max(0, array.length - n));
+ }
+
+ // Trim out all falsy values from an array.
+ function compact(array) {
+ return filter(array, Boolean);
+ }
+
+ // Flatten out an array, either recursively (by default), or up to `depth`.
+ // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+ function flatten(array, depth) {
+ return flatten$1(array, depth, false);
+ }
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ var difference = restArguments(function(array, rest) {
+ rest = flatten$1(rest, true, true);
+ return filter(array, function(value){
+ return !contains(rest, value);
+ });
+ });
+
+ // Return a version of the array that does not contain the specified value(s).
+ var without = restArguments(function(array, otherArrays) {
+ return difference(array, otherArrays);
+ });
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // The faster algorithm will not work with an iteratee if the iteratee
+ // is not a one-to-one function, so providing an iteratee will disable
+ // the faster algorithm.
+ function uniq(array, isSorted, iteratee, context) {
+ if (!isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted && !iteratee) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ var union = restArguments(function(arrays) {
+ return uniq(flatten$1(arrays, true, true));
+ });
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays.
+ function intersection(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (contains(result, item)) continue;
+ var j;
+ for (j = 1; j < argsLength; j++) {
+ if (!contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+ }
+
+ // Complement of zip. Unzip accepts an array of arrays and groups
+ // each array's elements on shared indices.
+ function unzip(array) {
+ var length = array && max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = pluck(array, index);
+ }
+ return result;
+ }
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ var zip = restArguments(unzip);
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+ function object(list, values) {
+ var result = {};
+ for (var i = 0, length = getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ }
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](https://docs.python.org/library/functions.html#range).
+ function range(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ if (!step) {
+ step = stop < start ? -1 : 1;
+ }
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+ }
+
+ // Chunk a single array into multiple arrays, each containing `count` or fewer
+ // items.
+ function chunk(array, count) {
+ if (count == null || count < 1) return [];
+ var result = [];
+ var i = 0, length = array.length;
+ while (i < length) {
+ result.push(slice.call(array, i, i += count));
+ }
+ return result;
+ }
+
+ // Helper function to continue chaining intermediate results.
+ function chainResult(instance, obj) {
+ return instance._chain ? _$1(obj).chain() : obj;
+ }
+
+ // Add your own custom functions to the Underscore object.
+ function mixin(obj) {
+ each(functions(obj), function(name) {
+ var func = _$1[name] = obj[name];
+ _$1.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return chainResult(this, func.apply(_$1, args));
+ };
+ });
+ return _$1;
+ }
+
+ // Add all mutator `Array` functions to the wrapper.
+ each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _$1.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) {
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+ delete obj[0];
+ }
+ }
+ return chainResult(this, obj);
+ };
+ });
+
+ // Add all accessor `Array` functions to the wrapper.
+ each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _$1.prototype[name] = function() {
+ var obj = this._wrapped;
+ if (obj != null) obj = method.apply(obj, arguments);
+ return chainResult(this, obj);
+ };
+ });
+
+ // Named Exports
+
+ var allExports = {
+ __proto__: null,
+ VERSION: VERSION,
+ restArguments: restArguments,
+ isObject: isObject,
+ isNull: isNull,
+ isUndefined: isUndefined,
+ isBoolean: isBoolean,
+ isElement: isElement,
+ isString: isString,
+ isNumber: isNumber,
+ isDate: isDate,
+ isRegExp: isRegExp,
+ isError: isError,
+ isSymbol: isSymbol,
+ isArrayBuffer: isArrayBuffer,
+ isDataView: isDataView$1,
+ isArray: isArray,
+ isFunction: isFunction$1,
+ isArguments: isArguments$1,
+ isFinite: isFinite$1,
+ isNaN: isNaN$1,
+ isTypedArray: isTypedArray$1,
+ isEmpty: isEmpty,
+ isMatch: isMatch,
+ isEqual: isEqual,
+ isMap: isMap,
+ isWeakMap: isWeakMap,
+ isSet: isSet,
+ isWeakSet: isWeakSet,
+ keys: keys,
+ allKeys: allKeys,
+ values: values,
+ pairs: pairs,
+ invert: invert,
+ functions: functions,
+ methods: functions,
+ extend: extend,
+ extendOwn: extendOwn,
+ assign: extendOwn,
+ defaults: defaults,
+ create: create,
+ clone: clone,
+ tap: tap,
+ get: get,
+ has: has,
+ mapObject: mapObject,
+ identity: identity,
+ constant: constant,
+ noop: noop,
+ toPath: toPath$1,
+ property: property,
+ propertyOf: propertyOf,
+ matcher: matcher,
+ matches: matcher,
+ times: times,
+ random: random,
+ now: now,
+ escape: _escape,
+ unescape: _unescape,
+ templateSettings: templateSettings,
+ template: template,
+ result: result,
+ uniqueId: uniqueId,
+ chain: chain,
+ iteratee: iteratee,
+ partial: partial,
+ bind: bind,
+ bindAll: bindAll,
+ memoize: memoize,
+ delay: delay,
+ defer: defer,
+ throttle: throttle,
+ debounce: debounce,
+ wrap: wrap,
+ negate: negate,
+ compose: compose,
+ after: after,
+ before: before,
+ once: once,
+ findKey: findKey,
+ findIndex: findIndex,
+ findLastIndex: findLastIndex,
+ sortedIndex: sortedIndex,
+ indexOf: indexOf,
+ lastIndexOf: lastIndexOf,
+ find: find,
+ detect: find,
+ findWhere: findWhere,
+ each: each,
+ forEach: each,
+ map: map,
+ collect: map,
+ reduce: reduce,
+ foldl: reduce,
+ inject: reduce,
+ reduceRight: reduceRight,
+ foldr: reduceRight,
+ filter: filter,
+ select: filter,
+ reject: reject,
+ every: every,
+ all: every,
+ some: some,
+ any: some,
+ contains: contains,
+ includes: contains,
+ include: contains,
+ invoke: invoke,
+ pluck: pluck,
+ where: where,
+ max: max,
+ min: min,
+ shuffle: shuffle,
+ sample: sample,
+ sortBy: sortBy,
+ groupBy: groupBy,
+ indexBy: indexBy,
+ countBy: countBy,
+ partition: partition,
+ toArray: toArray,
+ size: size,
+ pick: pick,
+ omit: omit,
+ first: first,
+ head: first,
+ take: first,
+ initial: initial,
+ last: last,
+ rest: rest,
+ tail: rest,
+ drop: rest,
+ compact: compact,
+ flatten: flatten,
+ without: without,
+ uniq: uniq,
+ unique: uniq,
+ union: union,
+ intersection: intersection,
+ difference: difference,
+ unzip: unzip,
+ transpose: unzip,
+ zip: zip,
+ object: object,
+ range: range,
+ chunk: chunk,
+ mixin: mixin,
+ 'default': _$1
+ };
+
+ // Default Export
+
+ // Add all of the Underscore functions to the wrapper object.
+ var _ = mixin(allExports);
+ // Legacy Node.js API.
+ _._ = _;
+
+ return _;
+
+})));
+//# sourceMappingURL=underscore-umd.js.map
diff --git a/doc/_static/underscore-1.3.1.js b/doc/_static/underscore-1.3.1.js
deleted file mode 100644
index 208d4cd..0000000
--- a/doc/_static/underscore-1.3.1.js
+++ /dev/null
@@ -1,999 +0,0 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-
-(function() {
-
- // Baseline setup
- // --------------
-
- // Establish the root object, `window` in the browser, or `global` on the server.
- var root = this;
-
- // Save the previous value of the `_` variable.
- var previousUnderscore = root._;
-
- // Establish the object that gets returned to break out of a loop iteration.
- var breaker = {};
-
- // Save bytes in the minified (but not gzipped) version:
- var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
- // Create quick reference variables for speed access to core prototypes.
- var slice = ArrayProto.slice,
- unshift = ArrayProto.unshift,
- toString = ObjProto.toString,
- hasOwnProperty = ObjProto.hasOwnProperty;
-
- // All **ECMAScript 5** native function implementations that we hope to use
- // are declared here.
- var
- nativeForEach = ArrayProto.forEach,
- nativeMap = ArrayProto.map,
- nativeReduce = ArrayProto.reduce,
- nativeReduceRight = ArrayProto.reduceRight,
- nativeFilter = ArrayProto.filter,
- nativeEvery = ArrayProto.every,
- nativeSome = ArrayProto.some,
- nativeIndexOf = ArrayProto.indexOf,
- nativeLastIndexOf = ArrayProto.lastIndexOf,
- nativeIsArray = Array.isArray,
- nativeKeys = Object.keys,
- nativeBind = FuncProto.bind;
-
- // Create a safe reference to the Underscore object for use below.
- var _ = function(obj) { return new wrapper(obj); };
-
- // Export the Underscore object for **Node.js**, with
- // backwards-compatibility for the old `require()` API. If we're in
- // the browser, add `_` as a global object via a string identifier,
- // for Closure Compiler "advanced" mode.
- if (typeof exports !== 'undefined') {
- if (typeof module !== 'undefined' && module.exports) {
- exports = module.exports = _;
- }
- exports._ = _;
- } else {
- root['_'] = _;
- }
-
- // Current version.
- _.VERSION = '1.3.1';
-
- // Collection Functions
- // --------------------
-
- // The cornerstone, an `each` implementation, aka `forEach`.
- // Handles objects with the built-in `forEach`, arrays, and raw objects.
- // Delegates to **ECMAScript 5**'s native `forEach` if available.
- var each = _.each = _.forEach = function(obj, iterator, context) {
- if (obj == null) return;
- if (nativeForEach && obj.forEach === nativeForEach) {
- obj.forEach(iterator, context);
- } else if (obj.length === +obj.length) {
- for (var i = 0, l = obj.length; i < l; i++) {
- if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
- }
- } else {
- for (var key in obj) {
- if (_.has(obj, key)) {
- if (iterator.call(context, obj[key], key, obj) === breaker) return;
- }
- }
- }
- };
-
- // Return the results of applying the iterator to each element.
- // Delegates to **ECMAScript 5**'s native `map` if available.
- _.map = _.collect = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
- each(obj, function(value, index, list) {
- results[results.length] = iterator.call(context, value, index, list);
- });
- if (obj.length === +obj.length) results.length = obj.length;
- return results;
- };
-
- // **Reduce** builds up a single result from a list of values, aka `inject`,
- // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
- _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduce && obj.reduce === nativeReduce) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
- }
- each(obj, function(value, index, list) {
- if (!initial) {
- memo = value;
- initial = true;
- } else {
- memo = iterator.call(context, memo, value, index, list);
- }
- });
- if (!initial) throw new TypeError('Reduce of empty array with no initial value');
- return memo;
- };
-
- // The right-associative version of reduce, also known as `foldr`.
- // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
- _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
- var initial = arguments.length > 2;
- if (obj == null) obj = [];
- if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
- if (context) iterator = _.bind(iterator, context);
- return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
- }
- var reversed = _.toArray(obj).reverse();
- if (context && !initial) iterator = _.bind(iterator, context);
- return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
- };
-
- // Return the first value which passes a truth test. Aliased as `detect`.
- _.find = _.detect = function(obj, iterator, context) {
- var result;
- any(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) {
- result = value;
- return true;
- }
- });
- return result;
- };
-
- // Return all the elements that pass a truth test.
- // Delegates to **ECMAScript 5**'s native `filter` if available.
- // Aliased as `select`.
- _.filter = _.select = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
- each(obj, function(value, index, list) {
- if (iterator.call(context, value, index, list)) results[results.length] = value;
- });
- return results;
- };
-
- // Return all the elements for which a truth test fails.
- _.reject = function(obj, iterator, context) {
- var results = [];
- if (obj == null) return results;
- each(obj, function(value, index, list) {
- if (!iterator.call(context, value, index, list)) results[results.length] = value;
- });
- return results;
- };
-
- // Determine whether all of the elements match a truth test.
- // Delegates to **ECMAScript 5**'s native `every` if available.
- // Aliased as `all`.
- _.every = _.all = function(obj, iterator, context) {
- var result = true;
- if (obj == null) return result;
- if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
- each(obj, function(value, index, list) {
- if (!(result = result && iterator.call(context, value, index, list))) return breaker;
- });
- return result;
- };
-
- // Determine if at least one element in the object matches a truth test.
- // Delegates to **ECMAScript 5**'s native `some` if available.
- // Aliased as `any`.
- var any = _.some = _.any = function(obj, iterator, context) {
- iterator || (iterator = _.identity);
- var result = false;
- if (obj == null) return result;
- if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
- each(obj, function(value, index, list) {
- if (result || (result = iterator.call(context, value, index, list))) return breaker;
- });
- return !!result;
- };
-
- // Determine if a given value is included in the array or object using `===`.
- // Aliased as `contains`.
- _.include = _.contains = function(obj, target) {
- var found = false;
- if (obj == null) return found;
- if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
- found = any(obj, function(value) {
- return value === target;
- });
- return found;
- };
-
- // Invoke a method (with arguments) on every item in a collection.
- _.invoke = function(obj, method) {
- var args = slice.call(arguments, 2);
- return _.map(obj, function(value) {
- return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
- });
- };
-
- // Convenience version of a common use case of `map`: fetching a property.
- _.pluck = function(obj, key) {
- return _.map(obj, function(value){ return value[key]; });
- };
-
- // Return the maximum element or (element-based computation).
- _.max = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
- if (!iterator && _.isEmpty(obj)) return -Infinity;
- var result = {computed : -Infinity};
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed >= result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
-
- // Return the minimum element (or element-based computation).
- _.min = function(obj, iterator, context) {
- if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
- if (!iterator && _.isEmpty(obj)) return Infinity;
- var result = {computed : Infinity};
- each(obj, function(value, index, list) {
- var computed = iterator ? iterator.call(context, value, index, list) : value;
- computed < result.computed && (result = {value : value, computed : computed});
- });
- return result.value;
- };
-
- // Shuffle an array.
- _.shuffle = function(obj) {
- var shuffled = [], rand;
- each(obj, function(value, index, list) {
- if (index == 0) {
- shuffled[0] = value;
- } else {
- rand = Math.floor(Math.random() * (index + 1));
- shuffled[index] = shuffled[rand];
- shuffled[rand] = value;
- }
- });
- return shuffled;
- };
-
- // Sort the object's values by a criterion produced by an iterator.
- _.sortBy = function(obj, iterator, context) {
- return _.pluck(_.map(obj, function(value, index, list) {
- return {
- value : value,
- criteria : iterator.call(context, value, index, list)
- };
- }).sort(function(left, right) {
- var a = left.criteria, b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }), 'value');
- };
-
- // Groups the object's values by a criterion. Pass either a string attribute
- // to group by, or a function that returns the criterion.
- _.groupBy = function(obj, val) {
- var result = {};
- var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
- each(obj, function(value, index) {
- var key = iterator(value, index);
- (result[key] || (result[key] = [])).push(value);
- });
- return result;
- };
-
- // Use a comparator function to figure out at what index an object should
- // be inserted so as to maintain order. Uses binary search.
- _.sortedIndex = function(array, obj, iterator) {
- iterator || (iterator = _.identity);
- var low = 0, high = array.length;
- while (low < high) {
- var mid = (low + high) >> 1;
- iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
- }
- return low;
- };
-
- // Safely convert anything iterable into a real, live array.
- _.toArray = function(iterable) {
- if (!iterable) return [];
- if (iterable.toArray) return iterable.toArray();
- if (_.isArray(iterable)) return slice.call(iterable);
- if (_.isArguments(iterable)) return slice.call(iterable);
- return _.values(iterable);
- };
-
- // Return the number of elements in an object.
- _.size = function(obj) {
- return _.toArray(obj).length;
- };
-
- // Array Functions
- // ---------------
-
- // Get the first element of an array. Passing **n** will return the first N
- // values in the array. Aliased as `head`. The **guard** check allows it to work
- // with `_.map`.
- _.first = _.head = function(array, n, guard) {
- return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
- };
-
- // Returns everything but the last entry of the array. Especcialy useful on
- // the arguments object. Passing **n** will return all the values in
- // the array, excluding the last N. The **guard** check allows it to work with
- // `_.map`.
- _.initial = function(array, n, guard) {
- return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
- };
-
- // Get the last element of an array. Passing **n** will return the last N
- // values in the array. The **guard** check allows it to work with `_.map`.
- _.last = function(array, n, guard) {
- if ((n != null) && !guard) {
- return slice.call(array, Math.max(array.length - n, 0));
- } else {
- return array[array.length - 1];
- }
- };
-
- // Returns everything but the first entry of the array. Aliased as `tail`.
- // Especially useful on the arguments object. Passing an **index** will return
- // the rest of the values in the array from that index onward. The **guard**
- // check allows it to work with `_.map`.
- _.rest = _.tail = function(array, index, guard) {
- return slice.call(array, (index == null) || guard ? 1 : index);
- };
-
- // Trim out all falsy values from an array.
- _.compact = function(array) {
- return _.filter(array, function(value){ return !!value; });
- };
-
- // Return a completely flattened version of an array.
- _.flatten = function(array, shallow) {
- return _.reduce(array, function(memo, value) {
- if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
- memo[memo.length] = value;
- return memo;
- }, []);
- };
-
- // Return a version of the array that does not contain the specified value(s).
- _.without = function(array) {
- return _.difference(array, slice.call(arguments, 1));
- };
-
- // Produce a duplicate-free version of the array. If the array has already
- // been sorted, you have the option of using a faster algorithm.
- // Aliased as `unique`.
- _.uniq = _.unique = function(array, isSorted, iterator) {
- var initial = iterator ? _.map(array, iterator) : array;
- var result = [];
- _.reduce(initial, function(memo, el, i) {
- if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
- memo[memo.length] = el;
- result[result.length] = array[i];
- }
- return memo;
- }, []);
- return result;
- };
-
- // Produce an array that contains the union: each distinct element from all of
- // the passed-in arrays.
- _.union = function() {
- return _.uniq(_.flatten(arguments, true));
- };
-
- // Produce an array that contains every item shared between all the
- // passed-in arrays. (Aliased as "intersect" for back-compat.)
- _.intersection = _.intersect = function(array) {
- var rest = slice.call(arguments, 1);
- return _.filter(_.uniq(array), function(item) {
- return _.every(rest, function(other) {
- return _.indexOf(other, item) >= 0;
- });
- });
- };
-
- // Take the difference between one array and a number of other arrays.
- // Only the elements present in just the first array will remain.
- _.difference = function(array) {
- var rest = _.flatten(slice.call(arguments, 1));
- return _.filter(array, function(value){ return !_.include(rest, value); });
- };
-
- // Zip together multiple lists into a single array -- elements that share
- // an index go together.
- _.zip = function() {
- var args = slice.call(arguments);
- var length = _.max(_.pluck(args, 'length'));
- var results = new Array(length);
- for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
- return results;
- };
-
- // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
- // we need this function. Return the position of the first occurrence of an
- // item in an array, or -1 if the item is not included in the array.
- // Delegates to **ECMAScript 5**'s native `indexOf` if available.
- // If the array is large and already in sort order, pass `true`
- // for **isSorted** to use binary search.
- _.indexOf = function(array, item, isSorted) {
- if (array == null) return -1;
- var i, l;
- if (isSorted) {
- i = _.sortedIndex(array, item);
- return array[i] === item ? i : -1;
- }
- if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
- for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
- return -1;
- };
-
- // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
- _.lastIndexOf = function(array, item) {
- if (array == null) return -1;
- if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
- var i = array.length;
- while (i--) if (i in array && array[i] === item) return i;
- return -1;
- };
-
- // Generate an integer Array containing an arithmetic progression. A port of
- // the native Python `range()` function. See
- // [the Python documentation](http://docs.python.org/library/functions.html#range).
- _.range = function(start, stop, step) {
- if (arguments.length <= 1) {
- stop = start || 0;
- start = 0;
- }
- step = arguments[2] || 1;
-
- var len = Math.max(Math.ceil((stop - start) / step), 0);
- var idx = 0;
- var range = new Array(len);
-
- while(idx < len) {
- range[idx++] = start;
- start += step;
- }
-
- return range;
- };
-
- // Function (ahem) Functions
- // ------------------
-
- // Reusable constructor function for prototype setting.
- var ctor = function(){};
-
- // Create a function bound to a given object (assigning `this`, and arguments,
- // optionally). Binding with arguments is also known as `curry`.
- // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
- // We check for `func.bind` first, to fail fast when `func` is undefined.
- _.bind = function bind(func, context) {
- var bound, args;
- if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
- if (!_.isFunction(func)) throw new TypeError;
- args = slice.call(arguments, 2);
- return bound = function() {
- if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
- ctor.prototype = func.prototype;
- var self = new ctor;
- var result = func.apply(self, args.concat(slice.call(arguments)));
- if (Object(result) === result) return result;
- return self;
- };
- };
-
- // Bind all of an object's methods to that object. Useful for ensuring that
- // all callbacks defined on an object belong to it.
- _.bindAll = function(obj) {
- var funcs = slice.call(arguments, 1);
- if (funcs.length == 0) funcs = _.functions(obj);
- each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
- return obj;
- };
-
- // Memoize an expensive function by storing its results.
- _.memoize = function(func, hasher) {
- var memo = {};
- hasher || (hasher = _.identity);
- return function() {
- var key = hasher.apply(this, arguments);
- return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
- };
- };
-
- // Delays a function for the given number of milliseconds, and then calls
- // it with the arguments supplied.
- _.delay = function(func, wait) {
- var args = slice.call(arguments, 2);
- return setTimeout(function(){ return func.apply(func, args); }, wait);
- };
-
- // Defers a function, scheduling it to run after the current call stack has
- // cleared.
- _.defer = function(func) {
- return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
- };
-
- // Returns a function, that, when invoked, will only be triggered at most once
- // during a given window of time.
- _.throttle = function(func, wait) {
- var context, args, timeout, throttling, more;
- var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
- return function() {
- context = this; args = arguments;
- var later = function() {
- timeout = null;
- if (more) func.apply(context, args);
- whenDone();
- };
- if (!timeout) timeout = setTimeout(later, wait);
- if (throttling) {
- more = true;
- } else {
- func.apply(context, args);
- }
- whenDone();
- throttling = true;
- };
- };
-
- // Returns a function, that, as long as it continues to be invoked, will not
- // be triggered. The function will be called after it stops being called for
- // N milliseconds.
- _.debounce = function(func, wait) {
- var timeout;
- return function() {
- var context = this, args = arguments;
- var later = function() {
- timeout = null;
- func.apply(context, args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
- };
-
- // Returns a function that will be executed at most one time, no matter how
- // often you call it. Useful for lazy initialization.
- _.once = function(func) {
- var ran = false, memo;
- return function() {
- if (ran) return memo;
- ran = true;
- return memo = func.apply(this, arguments);
- };
- };
-
- // Returns the first function passed as an argument to the second,
- // allowing you to adjust arguments, run code before and after, and
- // conditionally execute the original function.
- _.wrap = function(func, wrapper) {
- return function() {
- var args = [func].concat(slice.call(arguments, 0));
- return wrapper.apply(this, args);
- };
- };
-
- // Returns a function that is the composition of a list of functions, each
- // consuming the return value of the function that follows.
- _.compose = function() {
- var funcs = arguments;
- return function() {
- var args = arguments;
- for (var i = funcs.length - 1; i >= 0; i--) {
- args = [funcs[i].apply(this, args)];
- }
- return args[0];
- };
- };
-
- // Returns a function that will only be executed after being called N times.
- _.after = function(times, func) {
- if (times <= 0) return func();
- return function() {
- if (--times < 1) { return func.apply(this, arguments); }
- };
- };
-
- // Object Functions
- // ----------------
-
- // Retrieve the names of an object's properties.
- // Delegates to **ECMAScript 5**'s native `Object.keys`
- _.keys = nativeKeys || function(obj) {
- if (obj !== Object(obj)) throw new TypeError('Invalid object');
- var keys = [];
- for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
- return keys;
- };
-
- // Retrieve the values of an object's properties.
- _.values = function(obj) {
- return _.map(obj, _.identity);
- };
-
- // Return a sorted list of the function names available on the object.
- // Aliased as `methods`
- _.functions = _.methods = function(obj) {
- var names = [];
- for (var key in obj) {
- if (_.isFunction(obj[key])) names.push(key);
- }
- return names.sort();
- };
-
- // Extend a given object with all the properties in passed-in object(s).
- _.extend = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- for (var prop in source) {
- obj[prop] = source[prop];
- }
- });
- return obj;
- };
-
- // Fill in a given object with default properties.
- _.defaults = function(obj) {
- each(slice.call(arguments, 1), function(source) {
- for (var prop in source) {
- if (obj[prop] == null) obj[prop] = source[prop];
- }
- });
- return obj;
- };
-
- // Create a (shallow-cloned) duplicate of an object.
- _.clone = function(obj) {
- if (!_.isObject(obj)) return obj;
- return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
- };
-
- // Invokes interceptor with the obj, and then returns obj.
- // The primary purpose of this method is to "tap into" a method chain, in
- // order to perform operations on intermediate results within the chain.
- _.tap = function(obj, interceptor) {
- interceptor(obj);
- return obj;
- };
-
- // Internal recursive comparison function.
- function eq(a, b, stack) {
- // Identical objects are equal. `0 === -0`, but they aren't identical.
- // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
- if (a === b) return a !== 0 || 1 / a == 1 / b;
- // A strict comparison is necessary because `null == undefined`.
- if (a == null || b == null) return a === b;
- // Unwrap any wrapped objects.
- if (a._chain) a = a._wrapped;
- if (b._chain) b = b._wrapped;
- // Invoke a custom `isEqual` method if one is provided.
- if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
- if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
- // Compare `[[Class]]` names.
- var className = toString.call(a);
- if (className != toString.call(b)) return false;
- switch (className) {
- // Strings, numbers, dates, and booleans are compared by value.
- case '[object String]':
- // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
- // equivalent to `new String("5")`.
- return a == String(b);
- case '[object Number]':
- // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
- // other numeric values.
- return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
- case '[object Date]':
- case '[object Boolean]':
- // Coerce dates and booleans to numeric primitive values. Dates are compared by their
- // millisecond representations. Note that invalid dates with millisecond representations
- // of `NaN` are not equivalent.
- return +a == +b;
- // RegExps are compared by their source patterns and flags.
- case '[object RegExp]':
- return a.source == b.source &&
- a.global == b.global &&
- a.multiline == b.multiline &&
- a.ignoreCase == b.ignoreCase;
- }
- if (typeof a != 'object' || typeof b != 'object') return false;
- // Assume equality for cyclic structures. The algorithm for detecting cyclic
- // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
- var length = stack.length;
- while (length--) {
- // Linear search. Performance is inversely proportional to the number of
- // unique nested structures.
- if (stack[length] == a) return true;
- }
- // Add the first object to the stack of traversed objects.
- stack.push(a);
- var size = 0, result = true;
- // Recursively compare objects and arrays.
- if (className == '[object Array]') {
- // Compare array lengths to determine if a deep comparison is necessary.
- size = a.length;
- result = size == b.length;
- if (result) {
- // Deep compare the contents, ignoring non-numeric properties.
- while (size--) {
- // Ensure commutative equality for sparse arrays.
- if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
- }
- }
- } else {
- // Objects with different constructors are not equivalent.
- if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
- // Deep compare objects.
- for (var key in a) {
- if (_.has(a, key)) {
- // Count the expected number of properties.
- size++;
- // Deep compare each member.
- if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
- }
- }
- // Ensure that both objects contain the same number of properties.
- if (result) {
- for (key in b) {
- if (_.has(b, key) && !(size--)) break;
- }
- result = !size;
- }
- }
- // Remove the first object from the stack of traversed objects.
- stack.pop();
- return result;
- }
-
- // Perform a deep comparison to check if two objects are equal.
- _.isEqual = function(a, b) {
- return eq(a, b, []);
- };
-
- // Is a given array, string, or object empty?
- // An "empty" object has no enumerable own-properties.
- _.isEmpty = function(obj) {
- if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
- for (var key in obj) if (_.has(obj, key)) return false;
- return true;
- };
-
- // Is a given value a DOM element?
- _.isElement = function(obj) {
- return !!(obj && obj.nodeType == 1);
- };
-
- // Is a given value an array?
- // Delegates to ECMA5's native Array.isArray
- _.isArray = nativeIsArray || function(obj) {
- return toString.call(obj) == '[object Array]';
- };
-
- // Is a given variable an object?
- _.isObject = function(obj) {
- return obj === Object(obj);
- };
-
- // Is a given variable an arguments object?
- _.isArguments = function(obj) {
- return toString.call(obj) == '[object Arguments]';
- };
- if (!_.isArguments(arguments)) {
- _.isArguments = function(obj) {
- return !!(obj && _.has(obj, 'callee'));
- };
- }
-
- // Is a given value a function?
- _.isFunction = function(obj) {
- return toString.call(obj) == '[object Function]';
- };
-
- // Is a given value a string?
- _.isString = function(obj) {
- return toString.call(obj) == '[object String]';
- };
-
- // Is a given value a number?
- _.isNumber = function(obj) {
- return toString.call(obj) == '[object Number]';
- };
-
- // Is the given value `NaN`?
- _.isNaN = function(obj) {
- // `NaN` is the only value for which `===` is not reflexive.
- return obj !== obj;
- };
-
- // Is a given value a boolean?
- _.isBoolean = function(obj) {
- return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
- };
-
- // Is a given value a date?
- _.isDate = function(obj) {
- return toString.call(obj) == '[object Date]';
- };
-
- // Is the given value a regular expression?
- _.isRegExp = function(obj) {
- return toString.call(obj) == '[object RegExp]';
- };
-
- // Is a given value equal to null?
- _.isNull = function(obj) {
- return obj === null;
- };
-
- // Is a given variable undefined?
- _.isUndefined = function(obj) {
- return obj === void 0;
- };
-
- // Has own property?
- _.has = function(obj, key) {
- return hasOwnProperty.call(obj, key);
- };
-
- // Utility Functions
- // -----------------
-
- // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
- // previous owner. Returns a reference to the Underscore object.
- _.noConflict = function() {
- root._ = previousUnderscore;
- return this;
- };
-
- // Keep the identity function around for default iterators.
- _.identity = function(value) {
- return value;
- };
-
- // Run a function **n** times.
- _.times = function (n, iterator, context) {
- for (var i = 0; i < n; i++) iterator.call(context, i);
- };
-
- // Escape a string for HTML interpolation.
- _.escape = function(string) {
- return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
- };
-
- // Add your own custom functions to the Underscore object, ensuring that
- // they're correctly added to the OOP wrapper as well.
- _.mixin = function(obj) {
- each(_.functions(obj), function(name){
- addToWrapper(name, _[name] = obj[name]);
- });
- };
-
- // Generate a unique integer id (unique within the entire client session).
- // Useful for temporary DOM ids.
- var idCounter = 0;
- _.uniqueId = function(prefix) {
- var id = idCounter++;
- return prefix ? prefix + id : id;
- };
-
- // By default, Underscore uses ERB-style template delimiters, change the
- // following template settings to use alternative delimiters.
- _.templateSettings = {
- evaluate : /<%([\s\S]+?)%>/g,
- interpolate : /<%=([\s\S]+?)%>/g,
- escape : /<%-([\s\S]+?)%>/g
- };
-
- // When customizing `templateSettings`, if you don't want to define an
- // interpolation, evaluation or escaping regex, we need one that is
- // guaranteed not to match.
- var noMatch = /.^/;
-
- // Within an interpolation, evaluation, or escaping, remove HTML escaping
- // that had been previously added.
- var unescape = function(code) {
- return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
- };
-
- // JavaScript micro-templating, similar to John Resig's implementation.
- // Underscore templating handles arbitrary delimiters, preserves whitespace,
- // and correctly escapes quotes within interpolated code.
- _.template = function(str, data) {
- var c = _.templateSettings;
- var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
- 'with(obj||{}){__p.push(\'' +
- str.replace(/\\/g, '\\\\')
- .replace(/'/g, "\\'")
- .replace(c.escape || noMatch, function(match, code) {
- return "',_.escape(" + unescape(code) + "),'";
- })
- .replace(c.interpolate || noMatch, function(match, code) {
- return "'," + unescape(code) + ",'";
- })
- .replace(c.evaluate || noMatch, function(match, code) {
- return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
- })
- .replace(/\r/g, '\\r')
- .replace(/\n/g, '\\n')
- .replace(/\t/g, '\\t')
- + "');}return __p.join('');";
- var func = new Function('obj', '_', tmpl);
- if (data) return func(data, _);
- return function(data) {
- return func.call(this, data, _);
- };
- };
-
- // Add a "chain" function, which will delegate to the wrapper.
- _.chain = function(obj) {
- return _(obj).chain();
- };
-
- // The OOP Wrapper
- // ---------------
-
- // If Underscore is called as a function, it returns a wrapped object that
- // can be used OO-style. This wrapper holds altered versions of all the
- // underscore functions. Wrapped objects may be chained.
- var wrapper = function(obj) { this._wrapped = obj; };
-
- // Expose `wrapper.prototype` as `_.prototype`
- _.prototype = wrapper.prototype;
-
- // Helper function to continue chaining intermediate results.
- var result = function(obj, chain) {
- return chain ? _(obj).chain() : obj;
- };
-
- // A method to easily add functions to the OOP wrapper.
- var addToWrapper = function(name, func) {
- wrapper.prototype[name] = function() {
- var args = slice.call(arguments);
- unshift.call(args, this._wrapped);
- return result(func.apply(_, args), this._chain);
- };
- };
-
- // Add all of the Underscore functions to the wrapper object.
- _.mixin(_);
-
- // Add all mutator Array functions to the wrapper.
- each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
- var method = ArrayProto[name];
- wrapper.prototype[name] = function() {
- var wrapped = this._wrapped;
- method.apply(wrapped, arguments);
- var length = wrapped.length;
- if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
- return result(wrapped, this._chain);
- };
- });
-
- // Add all accessor Array functions to the wrapper.
- each(['concat', 'join', 'slice'], function(name) {
- var method = ArrayProto[name];
- wrapper.prototype[name] = function() {
- return result(method.apply(this._wrapped, arguments), this._chain);
- };
- });
-
- // Start chaining a wrapped Underscore object.
- wrapper.prototype.chain = function() {
- this._chain = true;
- return this;
- };
-
- // Extracts the result from a wrapped and chained object.
- wrapper.prototype.value = function() {
- return this._wrapped;
- };
-
-}).call(this);
diff --git a/doc/_static/underscore.js b/doc/_static/underscore.js
index 5b55f32..cf177d4 100644
--- a/doc/_static/underscore.js
+++ b/doc/_static/underscore.js
@@ -1,31 +1,6 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
-return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
-b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
-return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
-d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
-var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
-c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n="undefined"!=typeof globalThis?globalThis:n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
+// Underscore.js 1.13.1
+// https://underscorejs.org
+// (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+var n="1.13.1",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,d=isFinite,g=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var o=Array(r+1);for(u=0;u<r;u++)o[u]=arguments[u];return o[r]=e,n.apply(this,o)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function w(n){return void 0===n}function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function x(n){var r="[object "+n+"]";return function(n){return a.call(n)===r}}var S=x("String"),O=x("Number"),M=x("Date"),E=x("RegExp"),B=x("Error"),N=x("Symbol"),I=x("ArrayBuffer"),T=x("Function"),k=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof k&&(T=function(n){return"function"==typeof n||!1});var D=T,R=x("Object"),F=l&&R(new DataView(new ArrayBuffer(8))),V="undefined"!=typeof Map&&R(new Map),P=x("DataView");var q=F?function(n){return null!=n&&D(n.getInt8)&&I(n.buffer)}:P,U=s||x("Array");function W(n,r){return null!=n&&f.call(n,r)}var z=x("Arguments");!function(){z(arguments)||(z=function(n){return W(n,"callee")})}();var L=z;function $(n){return O(n)&&y(n)}function C(n){return function(){return n}}function K(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function J(n){return function(r){return null==r?void 0:r[n]}}var G=J("byteLength"),H=K(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:C(!1),Y=J("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=b.length,u=n.constructor,o=D(u)&&u.prototype||e,i="constructor";for(W(n,i)&&!r.contains(i)&&r.push(i);t--;)(i=b[t])in n&&n[i]!==o[i]&&!r.contains(i)&&r.push(i)}function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in n)W(n,t)&&r.push(t);return g&&Z(n,r),r}function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Object(n),o=0;o<e;o++){var i=t[o];if(r[i]!==u[i]||!(i in u))return!1}return!0}function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wrapped=n):new tn(n)}function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}tn.VERSION=n,tn.prototype.value=function(){return this._wrapped},tn.prototype.valueOf=tn.prototype.toJSON=tn.prototype.value,tn.prototype.toString=function(){return String(this._wrapped)};var un="[object DataView]";function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var o=typeof n;return("function"===o||"object"===o||"object"==typeof r)&&function n(r,t,e,o){r instanceof tn&&(r=r._wrapped);t instanceof tn&&(t=t._wrapped);var i=a.call(r);if(i!==a.call(t))return!1;if(F&&"[object Object]"==i&&q(r)){if(!q(t))return!1;i=un}switch(i){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":case un:return n(en(r),en(t),e,o)}var f="[object Array]"===i;if(!f&&X(r)){if(G(r)!==G(t))return!1;if(r.buffer===t.buffer&&r.byteOffset===t.byteOffset)return!0;f=!0}if(!f){if("object"!=typeof r||"object"!=typeof t)return!1;var c=r.constructor,l=t.constructor;if(c!==l&&!(D(c)&&c instanceof c&&D(l)&&l instanceof l)&&"constructor"in r&&"constructor"in t)return!1}o=o||[];var s=(e=e||[]).length;for(;s--;)if(e[s]===r)return o[s]===t;if(e.push(r),o.push(t),f){if((s=r.length)!==t.length)return!1;for(;s--;)if(!on(r[s],t[s],e,o))return!1}else{var p,v=nn(r);if(s=v.length,nn(t).length!==s)return!1;for(;s--;)if(p=v[s],!W(t,p)||!on(r[p],t[p],e,o))return!1}return e.pop(),o.pop(),!0}(n,r,t,e)}function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return g&&Z(n,r),r}function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=an(t);if(Y(e))return!1;for(var u=0;u<r;u++)if(!D(t[n[u]]))return!1;return n!==hn||!D(t[cn])}}var cn="forEach",ln="has",sn=["clear","delete"],pn=["get",ln,"set"],vn=sn.concat(cn,pn),hn=sn.concat(pn),yn=["add"].concat(sn,cn,ln),dn=V?fn(vn):x("Map"),gn=V?fn(hn):x("WeakMap"),bn=V?fn(yn):x("Set"),mn=x("WeakSet");function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var o=arguments[u],i=n(o),a=i.length,f=0;f<a;f++){var c=i[f];r&&void 0!==t[c]||(t[c]=o[c])}return t}}var xn=An(an),Sn=An(nn),On=An(an,!0);function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function En(n){return _(n)?U(n)?n.slice():xn({},n):n}function Bn(n){return U(n)?n:[n]}function Nn(n){return tn.toPath(n)}function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function Tn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}function kn(n){return n}function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}function Rn(n){return n=Nn(n),function(r){return In(r,n)}}function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return function(){return n.apply(r,arguments)}}function Vn(n,r,t){return null==n?kn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn(n)}function Pn(n,r){return Vn(n,r,1/0)}function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}function Un(){}function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}tn.toPath=Bn,tn.iteratee=Pn;var zn=Date.now||function(){return(new Date).getTime()};function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var $n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},Cn=Ln($n),Kn=Ln(_n($n)),Jn=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=/^\s*(\w|\$)+\s*$/;var Zn=0;function nr(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var rr=j((function(n,r){var t=rr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a<o;a++)i[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)i.push(arguments[u++]);return nr(n,e,this,this,i)};return e}));rr.placeholder=tn;var tr=j((function(n,r,t){if(!D(n))throw new TypeError("Bind must be called on a function");var e=j((function(u){return nr(n,e,r,this,t.concat(u))}));return e})),er=K(Y);function ur(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,o=0,i=Y(n);o<i;o++){var a=n[o];if(er(a)&&(U(a)||L(a)))if(r>1)ur(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var or=j((function(n,r){var t=(r=ur(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=tr(n[e],n)}return n}));var ir=j((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),ar=rr(ir,tn,1);function fr(n){return function(){return!n.apply(this,arguments)}}function cr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var lr=rr(cr,2);function sr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if(r(n[e=u[o]],e,n))return e}function pr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u-1;o>=0&&o<u;o+=n)if(t(r[o],o,r))return o;return-1}}var vr=pr(1),hr=pr(-1);function yr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=Math.floor((o+i)/2);t(n[a])<u?o=a+1:i=a}return o}function dr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==typeof o)n>0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),$))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o<f;o+=n)if(e[o]===u)return o;return-1}}var gr=dr(1,vr,yr),br=dr(-1,hr);function mr(n,r,t){var e=(er(n)?vr:sr)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function jr(n,r,t){var e,u;if(r=Fn(r,t),er(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var o=nn(n);for(e=0,u=o.length;e<u;e++)r(n[o[e]],o[e],n)}return n}function _r(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=Array(u),i=0;i<u;i++){var a=e?e[i]:i;o[i]=r(n[a],a,n)}return o}function wr(n){var r=function(r,t,e,u){var o=!er(r)&&nn(r),i=(o||r).length,a=n>0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a<i;a+=n){var f=o?o[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var o=arguments.length>=3;return r(n,Fn(t,u,4),e,o)}}var Ar=wr(1),xr=wr(-1);function Sr(n,r,t){var e=[];return r=qn(r,t),jr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Or(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(!r(n[i],i,n))return!1}return!0}function Mr(n,r,t){r=qn(r,t);for(var e=!er(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(r(n[i],i,n))return!0}return!1}function Er(n,r,t,e){return er(n)||(n=jn(n)),("number"!=typeof t||e)&&(t=0),gr(n,r,t)>=0}var Br=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),_r(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Nr(n,r){return _r(n,Rn(r))}function Ir(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e>o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Tr(n,r,t){if(null==r||t)return er(n)||(n=jn(n)),n[Wn(n.length-1)];var e=er(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i<r;i++){var a=Wn(i,o),f=e[i];e[i]=e[a],e[a]=f}return e.slice(0,r)}function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e,u),jr(t,(function(r,u){var i=e(r,u,t);n(o,r,i)})),o}}var Dr=kr((function(n,r,t){W(n,t)?n[t].push(r):n[t]=[r]})),Rr=kr((function(n,r,t){n[t]=r})),Fr=kr((function(n,r,t){W(n,t)?n[t]++:n[t]=1})),Vr=kr((function(n,r,t){n[t?0:1].push(r)}),!0),Pr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qr(n,r,t){return r in t}var Ur=j((function(n,r){var t={},e=r[0];if(null==n)return t;D(e)?(r.length>1&&(e=Fn(e,r[1])),r=an(n)):(e=qr,r=ur(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u<o;u++){var i=r[u],a=n[i];e(a,i,n)&&(t[i]=a)}return t})),Wr=j((function(n,r){var t,e=r[0];return D(e)?(e=fr(e),r.length>1&&(t=r[1])):(r=_r(ur(r,!1,!1),String),e=function(n,t){return!Er(r,t)}),Ur(n,e,t)}));function zr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function Lr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:zr(n,n.length-r)}function $r(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=ur(r,!0,!0),Sr(n,(function(n){return!Er(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);i<a;i++){var f=n[i],c=t?t(f,i,n):f;r&&!t?(i&&o===c||u.push(f),o=c):t?Er(o,c)||(o.push(c),u.push(f)):Er(u,f)||u.push(f)}return u}var Gr=j((function(n){return Jr(ur(n,!0,!0))}));function Hr(n){for(var r=n&&Ir(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e]=Nr(n,e);return t}var Qr=j(Hr);function Xr(n,r){return n._chain?tn(r).chain():r}function Yr(n){return jr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototype[r]=function(){var n=[this._wrapped];return o.apply(n,arguments),Xr(this,t.apply(tn,n))}})),tn}jr(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];tn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Xr(this,t)}})),jr(["concat","join","slice"],(function(n){var r=t[n];tn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Xr(this,n)}}));var Zr=Yr({__proto__:null,VERSION:n,restArguments:j,isObject:_,isNull:function(n){return null===n},isUndefined:w,isBoolean:A,isElement:function(n){return!(!n||1!==n.nodeType)},isString:S,isNumber:O,isDate:M,isRegExp:E,isError:B,isSymbol:N,isArrayBuffer:I,isDataView:q,isArray:U,isFunction:D,isArguments:L,isFinite:function(n){return!N(n)&&d(n)&&!isNaN(parseFloat(n))},isNaN:$,isTypedArray:X,isEmpty:function(n){if(null==n)return!0;var r=Y(n);return"number"==typeof r&&(U(n)||S(n)||L(n))?0===r:0===Y(nn(n))},isMatch:rn,isEqual:function(n,r){return on(n,r)},isMap:dn,isWeakMap:gn,isSet:bn,isWeakSet:mn,keys:nn,allKeys:an,values:jn,pairs:function(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:_n,functions:wn,methods:wn,extend:xn,extendOwn:Sn,assign:Sn,defaults:On,create:function(n,r){var t=Mn(n);return r&&Sn(t,r),t},clone:En,tap:function(n,r){return r(n),n},get:Tn,has:function(n,r){for(var t=(r=Nn(r)).length,e=0;e<t;e++){var u=r[e];if(!W(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=qn(r,t);for(var e=nn(n),u=e.length,o={},i=0;i<u;i++){var a=e[i];o[a]=r(n[a],a,n)}return o},identity:kn,constant:C,noop:Un,toPath:Bn,property:Rn,propertyOf:function(n){return null==n?Un:function(r){return Tn(n,r)}},matcher:Dn,matches:Dn,times:function(n,r,t){var e=Array(Math.max(0,n));r=Fn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:Wn,now:zn,escape:Cn,unescape:Kn,templateSettings:Jn,template:function(n,r,t){!r&&t&&(r=t),r=On({},r,tn.templateSettings);var e=RegExp([(r.escape||Gn).source,(r.interpolate||Gn).source,(r.evaluate||Gn).source].join("|")+"|$","g"),u=0,o="__p+='";n.replace(e,(function(r,t,e,i,a){return o+=n.slice(u,a).replace(Qn,Xn),u=a+r.length,t?o+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?o+="'+\n((__t=("+e+"))==null?'':__t)+\n'":i&&(o+="';\n"+i+"\n__p+='"),r})),o+="';\n";var i,a=r.variable;if(a){if(!Yn.test(a))throw new Error("variable is not a bare identifier: "+a)}else o="with(obj||{}){\n"+o+"}\n",a="obj";o="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{i=new Function(a,"_",o)}catch(n){throw n.source=o,n}var f=function(n){return i.call(this,n,tn)};return f.source="function("+a+"){\n"+o+"}",f},result:function(n,r,t){var e=(r=Nn(r)).length;if(!e)return D(t)?t.call(n):t;for(var u=0;u<e;u++){var o=null==n?void 0:n[r[u]];void 0===o&&(o=t,u=e),n=D(o)?o.call(n):o}return n},uniqueId:function(n){var r=++Zn+"";return n?n+r:r},chain:function(n){var r=tn(n);return r._chain=!0,r},iteratee:Pn,partial:rr,bind:tr,bindAll:or,memoize:function(n,r){var t=function(e){var u=t.cache,o=""+(r?r.apply(this,arguments):e);return W(u,o)||(u[o]=n.apply(this,arguments)),u[o]};return t.cache={},t},delay:ir,defer:ar,throttle:function(n,r,t){var e,u,o,i,a=0;t||(t={});var f=function(){a=!1===t.leading?0:zn(),e=null,i=n.apply(u,o),e||(u=o=null)},c=function(){var c=zn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,o=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o,i,a,f=function(){var c=zn()-u;r>c?e=setTimeout(f,r-c):(e=null,t||(i=n.apply(a,o)),e||(o=a=null))},c=j((function(c){return a=this,o=c,u=zn(),e||(e=setTimeout(f,r),t&&(i=n.apply(a,o))),i}));return c.cancel=function(){clearTimeout(e),e=o=a=null},c},wrap:function(n,r){return rr(r,n)},negate:fr,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:cr,once:lr,findKey:sr,findIndex:vr,findLastIndex:hr,sortedIndex:yr,indexOf:gr,lastIndexOf:br,find:mr,detect:mr,findWhere:function(n,r){return mr(n,Dn(r))},each:jr,forEach:jr,map:_r,collect:_r,reduce:Ar,foldl:Ar,inject:Ar,reduceRight:xr,foldr:xr,filter:Sr,select:Sr,reject:function(n,r,t){return Sr(n,fr(qn(r)),t)},every:Or,all:Or,some:Mr,any:Mr,contains:Er,includes:Er,include:Er,invoke:Br,pluck:Nr,where:function(n,r){return Sr(n,Dn(r))},max:Ir,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=er(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e<o&&(o=e);else r=qn(r,t),jr(n,(function(n,t,e){((u=r(n,t,e))<i||u===1/0&&o===1/0)&&(o=n,i=u)}));return o},shuffle:function(n){return Tr(n,1/0)},sample:Tr,sortBy:function(n,r,t){var e=0;return r=qn(r,t),Nr(_r(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:Dr,indexBy:Rr,countBy:Fr,partition:Vr,toArray:function(n){return n?U(n)?i.call(n):S(n)?n.match(Pr):er(n)?_r(n,kn):jn(n):[]},size:function(n){return null==n?0:er(n)?n.length:nn(n).length},pick:Ur,omit:Wr,first:Lr,head:Lr,take:Lr,initial:zr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:$r(n,Math.max(0,n.length-r))},rest:$r,tail:$r,drop:$r,compact:function(n){return Sr(n,Boolean)},flatten:function(n,r){return ur(n,r,!1)},without:Kr,uniq:Jr,unique:Jr,union:Gr,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Y(n);e<u;e++){var o=n[e];if(!Er(r,o)){var i;for(i=1;i<t&&Er(arguments[i],o);i++);i===t&&r.push(o)}}return r},difference:Cr,unzip:Hr,transpose:Hr,zip:Qr,object:function(n,r){for(var t={},e=0,u=Y(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),o=0;o<e;o++,n+=t)u[o]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(i.call(n,e,e+=r));return t},mixin:Yr,default:tn});return Zr._=Zr,Zr})); \ No newline at end of file
diff --git a/doc/authors.html b/doc/authors.html
index 2addcd7..ef87246 100644
--- a/doc/authors.html
+++ b/doc/authors.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Authors &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Authors &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="modules/zmq.html" title="eventlet.green.zmq – ØMQ support"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Authors</a></li>
</ul>
</div>
@@ -43,24 +45,24 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="authors">
+ <section id="authors">
<h1>Authors<a class="headerlink" href="#authors" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="maintainer-i-e-who-to-hassle-if-you-find-bugs">
+<section id="maintainer-i-e-who-to-hassle-if-you-find-bugs">
<h2>Maintainer (i.e., Who To Hassle If You Find Bugs)<a class="headerlink" href="#maintainer-i-e-who-to-hassle-if-you-find-bugs" title="Permalink to this headline">¶</a></h2>
<p>Jakub Stasiak
Nat Goodspeed</p>
<p>The current maintainer(s) are volunteers with unrelated jobs.
We can only pay sporadic attention to responding to your issue and pull request submissions.
Your patience is greatly appreciated!</p>
-</div>
-<div class="section" id="original-authors">
+</section>
+<section id="original-authors">
<h2>Original Authors<a class="headerlink" href="#original-authors" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p>Bob Ippolito</p></li>
<li><p>Donovan Preston</p></li>
</ul>
-</div>
-<div class="section" id="contributors">
+</section>
+<section id="contributors">
<h2>Contributors<a class="headerlink" href="#contributors" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p>AG Projects</p></li>
@@ -96,8 +98,8 @@ Your patience is greatly appreciated!</p>
<li><p>Samuel Merritt</p></li>
<li><p>Eric Urban</p></li>
</ul>
-</div>
-<div class="section" id="linden-lab-contributors">
+</section>
+<section id="linden-lab-contributors">
<h2>Linden Lab Contributors<a class="headerlink" href="#linden-lab-contributors" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p>John Beisley</p></li>
@@ -109,8 +111,8 @@ Your patience is greatly appreciated!</p>
<li><p>Kent Quirk</p></li>
<li><p>Ryan Williams</p></li>
</ul>
-</div>
-<div class="section" id="thanks-to">
+</section>
+<section id="thanks-to">
<h2>Thanks To<a class="headerlink" href="#thanks-to" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p>AdamKG, giving the hint that invalid argument errors were introduced post-0.9.0</p></li>
@@ -226,10 +228,11 @@ Your patience is greatly appreciated!</p>
<li><p>Jake Tesler</p></li>
<li><p>Aayush Kasurde</p></li>
</ul>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -264,7 +267,7 @@ Your patience is greatly appreciated!</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -289,13 +292,14 @@ Your patience is greatly appreciated!</p>
<li class="right" >
<a href="modules/zmq.html" title="eventlet.green.zmq – ØMQ support"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Authors</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/basic_usage.html b/doc/basic_usage.html
index 92b4ec5..477daf6 100644
--- a/doc/basic_usage.html
+++ b/doc/basic_usage.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Basic Usage &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Basic Usage &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="index.html" title="Eventlet Documentation"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Basic Usage</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="basic-usage">
+ <section id="basic-usage">
<h1>Basic Usage<a class="headerlink" href="#basic-usage" title="Permalink to this headline">¶</a></h1>
<p>If it’s your first time to Eventlet, you may find the illuminated examples in the <a class="reference internal" href="design_patterns.html#design-patterns"><span class="std std-ref">Design Patterns</span></a> document to be a good starting point.</p>
<p>Eventlet is built around the concept of green threads (i.e. coroutines, we use the terms interchangeably) that are launched to do network-related work. Green threads differ from normal threads in two main ways:</p>
@@ -51,87 +53,87 @@
<li><p>Green threads are so cheap they are nearly free. You do not have to conserve green threads like you would normal threads. In general, there will be at least one green thread per network connection.</p></li>
<li><p>Green threads cooperatively yield to each other instead of preemptively being scheduled. The major advantage from this behavior is that shared data structures don’t need locks, because only if a yield is explicitly called can another green thread have access to the data structure. It is also possible to inspect primitives such as queues to see if they have any pending data.</p></li>
</ul>
-</div>
-<div class="section" id="primary-api">
+</section>
+<section id="primary-api">
<h1>Primary API<a class="headerlink" href="#primary-api" title="Permalink to this headline">¶</a></h1>
<p>The design goal for Eventlet’s API is simplicity and readability. You should be able to read its code and understand what it’s doing. Fewer lines of code are preferred over excessively clever implementations. <a class="reference external" href="http://www.python.org/dev/peps/pep-0020/">Like Python itself</a>, there should be one, and only one obvious way to do it in Eventlet!</p>
<p>Though Eventlet has many modules, much of the most-used stuff is accessible simply by doing <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">eventlet</span></code>. Here’s a quick summary of the functionality available in the <code class="docutils literal notranslate"><span class="pre">eventlet</span></code> module, with links to more verbose documentation on each.</p>
-<div class="section" id="greenthread-spawn">
+<section id="greenthread-spawn">
<h2>Greenthread Spawn<a class="headerlink" href="#greenthread-spawn" title="Permalink to this headline">¶</a></h2>
<dl class="py function">
-<dt id="eventlet.spawn">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">spawn</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.spawn">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">spawn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn" title="Permalink to this definition">¶</a></dt>
<dd><p>This launches a greenthread to call <em>func</em>. Spawning off multiple greenthreads gets work done in parallel. The return value from <code class="docutils literal notranslate"><span class="pre">spawn</span></code> is a <a class="reference internal" href="modules/greenthread.html#eventlet.greenthread.GreenThread" title="eventlet.greenthread.GreenThread"><code class="xref py py-class docutils literal notranslate"><span class="pre">greenthread.GreenThread</span></code></a> object, which can be used to retrieve the return value of <em>func</em>. See <a class="reference internal" href="modules/greenthread.html#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn</span></code></a> for more details.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.spawn_n">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">spawn_n</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn_n" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.spawn_n">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">spawn_n</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn_n" title="Permalink to this definition">¶</a></dt>
<dd><p>The same as <a class="reference internal" href="#eventlet.spawn" title="eventlet.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>, but it’s not possible to know how the function terminated (i.e. no return value or exceptions). This makes execution faster. See <a class="reference internal" href="modules/greenthread.html#eventlet.greenthread.spawn_n" title="eventlet.greenthread.spawn_n"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn_n</span></code></a> for more details.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.spawn_after">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">spawn_after</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span></em>, <em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn_after" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.spawn_after">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">spawn_after</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.spawn_after" title="Permalink to this definition">¶</a></dt>
<dd><p>Spawns <em>func</em> after <em>seconds</em> have elapsed; a delayed version of <a class="reference internal" href="#eventlet.spawn" title="eventlet.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>. To abort the spawn and prevent <em>func</em> from being called, call <code class="xref py py-meth docutils literal notranslate"><span class="pre">GreenThread.cancel()</span></code> on the return value of <a class="reference internal" href="#eventlet.spawn_after" title="eventlet.spawn_after"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn_after()</span></code></a>. See <a class="reference internal" href="modules/greenthread.html#eventlet.greenthread.spawn_after" title="eventlet.greenthread.spawn_after"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn_after</span></code></a> for more details.</p>
</dd></dl>
-</div>
-<div class="section" id="greenthread-control">
+</section>
+<section id="greenthread-control">
<h2>Greenthread Control<a class="headerlink" href="#greenthread-control" title="Permalink to this headline">¶</a></h2>
<dl class="py function">
-<dt id="eventlet.sleep">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">sleep</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span><span class="o">=</span><span class="default_value">0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.sleep" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.sleep">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">sleep</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.sleep" title="Permalink to this definition">¶</a></dt>
<dd><p>Suspends the current greenthread and allows others a chance to process. See <a class="reference internal" href="modules/greenthread.html#eventlet.greenthread.sleep" title="eventlet.greenthread.sleep"><code class="xref py py-func docutils literal notranslate"><span class="pre">sleep</span></code></a> for more details.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.GreenPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">GreenPool</code><a class="headerlink" href="#eventlet.GreenPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.GreenPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">GreenPool</span></span><a class="headerlink" href="#eventlet.GreenPool" title="Permalink to this definition">¶</a></dt>
<dd><p>Pools control concurrency. It’s very common in applications to want to consume only a finite amount of memory, or to restrict the amount of connections that one part of the code holds open so as to leave more for the rest, or to behave consistently in the face of unpredictable input data. GreenPools provide this control. See <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool" title="eventlet.greenpool.GreenPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPool</span></code></a> for more on how to use these.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.GreenPile">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">GreenPile</code><a class="headerlink" href="#eventlet.GreenPile" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.GreenPile">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">GreenPile</span></span><a class="headerlink" href="#eventlet.GreenPile" title="Permalink to this definition">¶</a></dt>
<dd><p>GreenPile objects represent chunks of work. In essence a GreenPile is an iterator that can be stuffed with work, and the results read out later. See <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPile" title="eventlet.greenpool.GreenPile"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPile</span></code></a> for more details.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.Queue">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">Queue</code><a class="headerlink" href="#eventlet.Queue" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.Queue">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">Queue</span></span><a class="headerlink" href="#eventlet.Queue" title="Permalink to this definition">¶</a></dt>
<dd><p>Queues are a fundamental construct for communicating data between execution units. Eventlet’s Queue class is used to communicate between greenthreads, and provides a bunch of useful features for doing that. See <a class="reference internal" href="modules/queue.html#eventlet.queue.Queue" title="eventlet.queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> for more details.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.Timeout">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">Timeout</code><a class="headerlink" href="#eventlet.Timeout" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.Timeout">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">Timeout</span></span><a class="headerlink" href="#eventlet.Timeout" title="Permalink to this definition">¶</a></dt>
<dd><p>This class is a way to add timeouts to anything. It raises <em>exception</em> in the current greenthread after <em>timeout</em> seconds. When <em>exception</em> is omitted or <code class="docutils literal notranslate"><span class="pre">None</span></code>, the Timeout instance itself is raised.</p>
<p>Timeout objects are context managers, and so can be used in with statements.
See <a class="reference internal" href="modules/timeout.html#eventlet.timeout.Timeout" title="eventlet.timeout.Timeout"><code class="xref py py-class docutils literal notranslate"><span class="pre">Timeout</span></code></a> for more details.</p>
</dd></dl>
-</div>
-<div class="section" id="patching-functions">
+</section>
+<section id="patching-functions">
<h2>Patching Functions<a class="headerlink" href="#patching-functions" title="Permalink to this headline">¶</a></h2>
<dl class="py function">
-<dt id="eventlet.import_patched">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">import_patched</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">modulename</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">additional_modules</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw_additional_modules</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.import_patched" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.import_patched">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">import_patched</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">modulename</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">additional_modules</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw_additional_modules</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.import_patched" title="Permalink to this definition">¶</a></dt>
<dd><p>Imports a module in a way that ensures that the module uses “green” versions of the standard library modules, so that everything works nonblockingly. The only required argument is the name of the module to be imported. For more information see <a class="reference internal" href="patching.html#import-green"><span class="std std-ref">Import Green</span></a>.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.monkey_patch">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">monkey_patch</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">all</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">os</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">select</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">socket</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">thread</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">time</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.monkey_patch" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.monkey_patch">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">monkey_patch</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">all</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">os</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">select</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">socket</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thread</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.monkey_patch" title="Permalink to this definition">¶</a></dt>
<dd><p>Globally patches certain system modules to be greenthread-friendly. The keyword arguments afford some control over which modules are patched. If <em>all</em> is True, then all modules are patched regardless of the other arguments. If it’s False, then the rest of the keyword arguments control patching of specific subsections of the standard library. Most patch the single module of the same name (os, time, select). The exceptions are socket, which also patches the ssl module if present; and thread, which patches thread, threading, and Queue. It’s safe to call monkey_patch multiple times. For more information see <a class="reference internal" href="patching.html#monkey-patch"><span class="std std-ref">Monkeypatching the Standard Library</span></a>.</p>
</dd></dl>
-</div>
-<div class="section" id="network-convenience-functions">
+</section>
+<section id="network-convenience-functions">
<h2>Network Convenience Functions<a class="headerlink" href="#network-convenience-functions" title="Permalink to this headline">¶</a></h2>
<dl class="py function">
-<dt id="eventlet.connect">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">connect</code><span class="sig-paren">(</span><em class="sig-param">addr</em>, <em class="sig-param">family=&lt;AddressFamily.AF_INET: 2&gt;</em>, <em class="sig-param">bind=None</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.connect" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.connect">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">connect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">addr</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">family</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">AddressFamily.AF_INET</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bind</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.connect" title="Permalink to this definition">¶</a></dt>
<dd><p>Convenience function for opening client sockets.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
@@ -148,8 +150,8 @@ See <a class="reference internal" href="modules/timeout.html#eventlet.timeout.Ti
</dd></dl>
<dl class="py function">
-<dt id="eventlet.listen">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">listen</code><span class="sig-paren">(</span><em class="sig-param">addr</em>, <em class="sig-param">family=&lt;AddressFamily.AF_INET: 2&gt;</em>, <em class="sig-param">backlog=50</em>, <em class="sig-param">reuse_addr=True</em>, <em class="sig-param">reuse_port=None</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.listen" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.listen">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">listen</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">addr</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">family</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">AddressFamily.AF_INET</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">backlog</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">50</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">reuse_addr</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">reuse_port</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.listen" title="Permalink to this definition">¶</a></dt>
<dd><p>Convenience function for opening server sockets. This
socket can be used in <a class="reference internal" href="#eventlet.serve" title="eventlet.serve"><code class="xref py py-func docutils literal notranslate"><span class="pre">serve()</span></code></a> or a custom <code class="docutils literal notranslate"><span class="pre">accept()</span></code> loop.</p>
<p>Sets SO_REUSEADDR on the socket to save on annoyance.</p>
@@ -169,8 +171,8 @@ value is system-dependent.</p></li>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.wrap_ssl">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">wrap_ssl</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sock</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">a</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wrap_ssl" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.wrap_ssl">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">wrap_ssl</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sock</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">a</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wrap_ssl" title="Permalink to this definition">¶</a></dt>
<dd><p>Convenience function for converting a regular socket into an
SSL socket. Has the same interface as <a class="reference external" href="https://docs.python.org/3/library/ssl.html#ssl.wrap_socket" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">ssl.wrap_socket()</span></code></a>,
but can also use PyOpenSSL. Though, note that it ignores the
@@ -185,8 +187,8 @@ session.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.serve">
-<code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">serve</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sock</span></em>, <em class="sig-param"><span class="n">handle</span></em>, <em class="sig-param"><span class="n">concurrency</span><span class="o">=</span><span class="default_value">1000</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.serve" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.serve">
+<span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">serve</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sock</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">handle</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">concurrency</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.serve" title="Permalink to this definition">¶</a></dt>
<dd><p>Runs a server on the supplied socket. Calls the function <em>handle</em> in a
separate greenthread for every incoming client connection. <em>handle</em> takes
two arguments: the client socket object, and the client address:</p>
@@ -214,16 +216,17 @@ connections until the existing ones complete.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.StopServe">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.</code><code class="sig-name descname">StopServe</code><a class="headerlink" href="#eventlet.StopServe" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.StopServe">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.</span></span><span class="sig-name descname"><span class="pre">StopServe</span></span><a class="headerlink" href="#eventlet.StopServe" title="Permalink to this definition">¶</a></dt>
<dd><p>Exception class used for quitting <a class="reference internal" href="#eventlet.serve" title="eventlet.serve"><code class="xref py py-func docutils literal notranslate"><span class="pre">serve()</span></code></a> gracefully.</p>
</dd></dl>
<p>These are the basic primitives of Eventlet; there are a lot more out there in the other Eventlet modules; check out the <a class="reference internal" href="modules.html"><span class="doc">Module Reference</span></a>.</p>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -258,7 +261,7 @@ connections until the existing ones complete.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -283,13 +286,14 @@ connections until the existing ones complete.</p>
<li class="right" >
<a href="index.html" title="Eventlet Documentation"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Basic Usage</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/changelog.html b/doc/changelog.html
index d7d6699..293c8fc 100644
--- a/doc/changelog.html
+++ b/doc/changelog.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>0.31.0 &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>0.32.0 &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -26,7 +27,8 @@
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">0.32.0</a></li>
</ul>
</div>
@@ -35,84 +37,98 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="id1">
-<h1>0.31.0<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h1>
+ <section id="id1">
+<h1>0.32.0<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><p>greendns: compatibility with dnspython v2 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/722">https://github.com/eventlet/eventlet/pull/722</a></p></li>
+<li><p>green.ssl: wrap_socket now accepts argument <cite>ciphers</cite> <a class="reference external" href="https://github.com/eventlet/eventlet/pull/718">https://github.com/eventlet/eventlet/pull/718</a></p></li>
+<li><p>websocket: control frames are now always uncompressed per RFC 7692; Thanks to Onno Kortmann</p></li>
+</ul>
+</section>
+<section id="id2">
+<h1>0.31.1<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><p>ssl: py3.6 using client certificates raised ValueError: check_hostname needs server_hostname argument <a class="reference external" href="https://github.com/eventlet/eventlet/pull/705">https://github.com/eventlet/eventlet/pull/705</a></p></li>
+</ul>
+</section>
+<section id="id3">
+<h1>0.31.0<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB <a class="reference external" href="https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2">https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2</a></p></li>
</ul>
-</div>
-<div class="section" id="id2">
-<h1>0.30.3<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id4">
+<h1>0.30.3<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: websocket ALREADY_HANDLED flag on corolocal</p></li>
<li><p>green.ssl: Set suppress_ragged_eofs default based on SSLSocket defaults</p></li>
<li><p>greenio: socket.connect_ex returned None instead of 0 on success</p></li>
<li><p>Use _imp instead of deprecated imp</p></li>
</ul>
-</div>
-<div class="section" id="id3">
-<h1>0.30.2<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id5">
+<h1>0.30.2<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: patch ssl to fix RecursionError on SSLContext.options.__set__ <a class="reference external" href="https://github.com/eventlet/eventlet/issues/677">https://github.com/eventlet/eventlet/issues/677</a></p></li>
</ul>
-</div>
-<div class="section" id="id4">
-<h1>0.30.1<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id6">
+<h1>0.30.1<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>patcher: built-in open() did not accept kwargs <a class="reference external" href="https://github.com/eventlet/eventlet/issues/683">https://github.com/eventlet/eventlet/issues/683</a></p></li>
</ul>
-</div>
-<div class="section" id="id5">
-<h1>0.30.0<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id7">
+<h1>0.30.0<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>pyopenssl tsafe module was deprecated and removed in v20.0.0</p></li>
<li><p>deprecate pyevent hub</p></li>
<li><p>Deprecate CPython 2.7 and 3.4 support</p></li>
<li><p>py39: Add _at_fork_reinit method to Semaphores</p></li>
</ul>
-</div>
-<div class="section" id="id6">
-<h1>0.29.1<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id8">
+<h1>0.29.1<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1>
<p>patcher: [py27] recursion error in pytest/python2.7 installing register_at_fork <a class="reference external" href="https://github.com/eventlet/eventlet/issues/660">https://github.com/eventlet/eventlet/issues/660</a>
patcher: monkey_patch(builtins=True) failed on py3 because <cite>file</cite> class is gone <a class="reference external" href="https://github.com/eventlet/eventlet/issues/541">https://github.com/eventlet/eventlet/issues/541</a>
don’t crash on PyPy 7.0.0 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/547">https://github.com/eventlet/eventlet/pull/547</a>
Only install monotonic on python2 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/583">https://github.com/eventlet/eventlet/pull/583</a></p>
-</div>
-<div class="section" id="id7">
-<h1>0.29.0<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id9">
+<h1>0.29.0<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: context wrapped listener fails accept() <a class="reference external" href="https://github.com/eventlet/eventlet/issues/651">https://github.com/eventlet/eventlet/issues/651</a></p></li>
</ul>
-</div>
-<div class="section" id="id8">
-<h1>0.28.1<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id10">
+<h1>0.28.1<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Sorry, Eventlet was broken on Windows for versions 0.27-0.28
patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>Clean up TypeError in __del__</p></li>
</ul>
-</div>
-<div class="section" id="id9">
-<h1>0.28.0<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id11">
+<h1>0.28.0<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Always remove the right listener from the hub <a class="reference external" href="https://github.com/eventlet/eventlet/pull/645">https://github.com/eventlet/eventlet/pull/645</a></p></li>
</ul>
-</div>
-<div class="section" id="id10">
-<h1>0.27.0<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id12">
+<h1>0.27.0<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>patcher: Clean up threading book-keeping at fork when monkey-patched</p></li>
<li><p>backdoor: handle disconnects better</p></li>
</ul>
-</div>
-<div class="section" id="id11">
-<h1>0.26.1<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id13">
+<h1>0.26.1<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>pin dnspython &lt;2.0.0 <a class="reference external" href="https://github.com/eventlet/eventlet/issues/619">https://github.com/eventlet/eventlet/issues/619</a></p></li>
</ul>
-</div>
-<div class="section" id="id12">
-<h1>0.26.0<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id14">
+<h1>0.26.0<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fix compatibility with SSLContext usage &gt;= Python 3.7</p></li>
<li><p>wsgi: Fix header capitalization on py3</p></li>
@@ -121,22 +137,22 @@ patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>Fix misc SyntaxWarning’s under Python 3.8</p></li>
<li><p>Remove unnecessary assignment in _recv_loop (#601)</p></li>
</ul>
-</div>
-<div class="section" id="id13">
-<h1>0.25.2<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id15">
+<h1>0.25.2<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.ssl: redundant set_nonblocking() caused SSLWantReadError</p></li>
</ul>
-</div>
-<div class="section" id="id14">
-<h1>0.25.1<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id16">
+<h1>0.25.1<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi (tests): Stop using deprecated cgi.parse_qs() to support Python 3.8; Thanks to Miro Hrončok</p></li>
<li><p>os: Add workaround to <cite>open</cite> for pathlib on py 3.7; Thanks to David Szotten</p></li>
</ul>
-</div>
-<div class="section" id="id15">
-<h1>0.25.0<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id17">
+<h1>0.25.0<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Only send 100 Continue response if no response has been sent yet; Thanks to Tim Burke</p></li>
<li><p>wsgi: Return 400 on negative Content-Length request headers; Thanks to Tim Burke</p></li>
@@ -155,15 +171,15 @@ patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>New benchmarks runner; Thanks to Sergey Shepelev</p></li>
<li><p>ssl: fix connect to use monotonic clock for timeout; Thanks to Sergey Shepelev</p></li>
</ul>
-</div>
-<div class="section" id="id16">
-<h1>0.24.1<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id18">
+<h1>0.24.1<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: don’t contact nameservers if one entry is returned from hosts file; Thanks to Daniel Alvarez</p></li>
</ul>
-</div>
-<div class="section" id="id17">
-<h1>0.24.0<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id19">
+<h1>0.24.0<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: Fix infinite loop when UDP source address mismatch; Thanks to Lon Hohberger</p></li>
<li><p>greendns: Fix bad ipv6 comparison; Thanks to Lon Hohberger</p></li>
@@ -176,25 +192,25 @@ patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>external dependencies for six, monotonic, dnspython; Thanks to nat-goodspeed</p></li>
<li><p>wsgi: Don’t strip all Unicode whitespace from headers on py3; Thanks to Tim Burke</p></li>
</ul>
-</div>
-<div class="section" id="id18">
-<h1>0.23.0<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id20">
+<h1>0.23.0<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.threading: current_thread() did not see new monkey-patched threads; Thanks to Jake Tesler</p></li>
<li><p>tpool: exception in tpool-ed call leaked memory via backtrace</p></li>
<li><p>wsgi: latin-1 encoding dance for environ[PATH_INFO]</p></li>
</ul>
-</div>
-<div class="section" id="id19">
-<h1>0.22.1<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id21">
+<h1>0.22.1<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fixed issue installing excess enum34 on Python3.4+ (rebuild with updated setuptools)</p></li>
<li><p>event: Event.wait() timeout=None argument to be compatible with upstream CPython</p></li>
<li><p>greendns: Treat /etc/hosts entries case-insensitive; Thanks to Ralf Haferkamp</p></li>
</ul>
-</div>
-<div class="section" id="id20">
-<h1>0.22.0<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id22">
+<h1>0.22.0<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>convenience: (SO_REUSEPORT) socket.error is not OSError on Python 2; Thanks to <a class="reference external" href="mailto:JacoFourie&#37;&#52;&#48;github">JacoFourie<span>&#64;</span>github</a></p></li>
<li><p>convenience: SO_REUSEPORT is not available on WSL platform (Linux on Windows)</p></li>
@@ -217,9 +233,9 @@ patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>wsgi: deprecated options are one step closer to removal</p></li>
<li><p>wsgi: handle remote connection resets; Thanks to Stefan Nica</p></li>
</ul>
-</div>
-<div class="section" id="id21">
-<h1>0.21.0<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id23">
+<h1>0.21.0<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>New timeout error API: .is_timeout=True on exception object
It’s now easy to test if network error is transient and retry is appropriate.
@@ -240,18 +256,18 @@ Please spread the word and invite other libraries to support this interface.</p>
<li><p>support: upgrade bundled six to 1.10 (dbfbfc818e3d)</p></li>
<li><p>python3.6: http.client.request support chunked_encoding</p></li>
</ul>
-</div>
-<div class="section" id="id22">
-<h1>0.20.1<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id24">
+<h1>0.20.1<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>dns: try unqualified queries as top level</p></li>
<li><p>test_import_patched_defaults bended to play with pyopenssl&gt;=16.1.0</p></li>
<li><p>Explicit environ flag for importing eventlet.__version__ without ignoring import errors</p></li>
<li><p>Type check Semaphore, GreenPool arguments; Thanks to Matthew D. Pagel</p></li>
</ul>
-</div>
-<div class="section" id="id23">
-<h1>0.20.0<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id25">
+<h1>0.20.0<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: removed select.poll() function</p></li>
<li><p>DNS resolving is always green with dnspython bundled in</p></li>
@@ -272,9 +288,9 @@ Please spread the word and invite other libraries to support this interface.</p>
<li><p>ssl: Fix recv_into blocking when reading chunks of data</p></li>
<li><p>websocket: support Gunicorn environ[‘gunicorn.socket’]</p></li>
</ul>
-</div>
-<div class="section" id="id24">
-<h1>0.19.0<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id26">
+<h1>0.19.0<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: IMPORTANT DoS FIX do_handshake_connect=False in server accept(); Thanks to Garth Mollett</p></li>
<li><p>patcher: patch existing threading locks; Thanks to Alexis Lee</p></li>
@@ -284,37 +300,37 @@ Please spread the word and invite other libraries to support this interface.</p>
<li><p>wsgi: document compatibility with python <cite>logging</cite></p></li>
<li><p>Minor grammatical improvements and typo fixes to the docs; Thanks to Steven Erenst</p></li>
</ul>
-</div>
-<div class="section" id="id25">
-<h1>0.18.4<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id27">
+<h1>0.18.4<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: change TCP_NODELAY to TCP_QUICKACK, ignore socket error when not available</p></li>
</ul>
-</div>
-<div class="section" id="id26">
-<h1>0.18.3<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id28">
+<h1>0.18.3<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Use buffered writes - fixes partial socket.send without custom
writelines(); Github issue #295</p></li>
<li><p>wsgi: TCP_NODELAY enabled by default</p></li>
</ul>
-</div>
-<div class="section" id="id27">
-<h1>0.18.2<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id29">
+<h1>0.18.2<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Fix data loss on partial writes (socket.send); Thanks to Jakub Stasiak</p></li>
</ul>
-</div>
-<div class="section" id="id28">
-<h1>0.18.1<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id30">
+<h1>0.18.1<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1</p></li>
<li><p>patcher: Fix AttributeError in subprocess communicate()</p></li>
<li><p>greenio: Fix “TypeError: an integer is required” in sendto()</p></li>
</ul>
-</div>
-<div class="section" id="id29">
-<h1>0.18.0<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id31">
+<h1>0.18.0<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1</p></li>
<li><p>greenio: Fixed a bug that could cause send() to start an endless loop on
@@ -374,22 +390,22 @@ blocking whole process on Python 3):</p>
consistent with Python standard library and removes a source of very subtle
errors</p></li>
</ul>
-</div>
-<div class="section" id="id30">
-<h1>0.17.4<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id32">
+<h1>0.17.4<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: incorrect initalization of default context; Thanks to stuart-mclaren</p></li>
</ul>
-</div>
-<div class="section" id="id31">
-<h1>0.17.3<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id33">
+<h1>0.17.3<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.thread: Python3.3+ fixes; Thanks to Victor Stinner</p></li>
<li><p>Semaphore.acquire() accepts timeout=-1; Thanks to Victor Stinner</p></li>
</ul>
-</div>
-<div class="section" id="id32">
-<h1>0.17.2<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id34">
+<h1>0.17.2<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Provide python logging compatibility; Thanks to Sean Dague</p></li>
<li><p>greendns: fix premature connection closing in DNS proxy; Thanks to Tim Simmons</p></li>
@@ -397,15 +413,15 @@ errors</p></li>
<li><p>green.ssl: HTTPS client Python 2.7.9+ compatibility</p></li>
<li><p>setup: tests.{isolated,manual} polluted top-level packages</p></li>
</ul>
-</div>
-<div class="section" id="id33">
-<h1>0.17.1<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id35">
+<h1>0.17.1<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: fix dns.name import and Python3 compatibility</p></li>
</ul>
-</div>
-<div class="section" id="id34">
-<h1>0.17<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id36">
+<h1>0.17<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Full Python3 compatibility; Thanks to Jakub Stasiak</p></li>
<li><p>greendns: IPv6 support, improved handling of /etc/hosts; Thanks to Floris Bruynooghe</p></li>
@@ -415,15 +431,15 @@ errors</p></li>
<li><p>Make sure SSL retries are done using the exact same data buffer; Thanks to Lior Neudorfer</p></li>
<li><p>greenio: shutdown already closed sockets without error; Thanks to David Szotten</p></li>
</ul>
-</div>
-<div class="section" id="id35">
-<h1>0.16.1<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id37">
+<h1>0.16.1<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Wheel build 0.16.0 incorrectly shipped removed module eventlet.util.</p></li>
</ul>
-</div>
-<div class="section" id="id36">
-<h1>0.16.0<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id38">
+<h1>0.16.0<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fix SSL socket wrapping and Python 2.7.9 compatibility; Thanks to Jakub Stasiak</p></li>
<li><p>Fix monkey_patch() on Python 3; Thanks to Victor Stinner</p></li>
@@ -438,23 +454,23 @@ errors</p></li>
<li><p>tpool: Windows compatibility, fix ResourceWarning. Thanks to Victor Stinner</p></li>
<li><p>tests: Fix timers not cleaned up on MySQL test skips; Thanks to Corey Wright</p></li>
</ul>
-</div>
-<div class="section" id="id37">
-<h1>0.15.2<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id39">
+<h1>0.15.2<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: fixed memory leak, introduced in 0.15.1; Thanks to Michael Kerrin, Tushar Gohad</p></li>
<li><p>wsgi: Support optional headers w/ “100 Continue” responses; Thanks to Tushar Gohad</p></li>
</ul>
-</div>
-<div class="section" id="id38">
-<h1>0.15.1<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id40">
+<h1>0.15.1<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: Fix second simultaneous read (parallel paramiko issue); Thanks to Jan Grant, Michael Kerrin</p></li>
<li><p>db_pool: customizable connection cleanup function; Thanks to Avery Fay</p></li>
</ul>
-</div>
-<div class="section" id="id39">
-<h1>0.15<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id41">
+<h1>0.15<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Python3 compatibility – <strong>not ready yet</strong>; Thanks to Astrum Kuo, Davanum Srinivas, Jakub Stasiak, Victor Sergeyev</p></li>
<li><p>coros: remove Actor which was deprecated in 2010-01</p></li>
@@ -468,9 +484,9 @@ errors</p></li>
<li><p>websockets: Add websockets13 support; handle lack of Upgrade header; Thanks to Edward George</p></li>
<li><p>wsgi: capitalize_response_headers option</p></li>
</ul>
-</div>
-<div class="section" id="id40">
-<h1>0.14<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id42">
+<h1>0.14<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: handle connection socket timeouts; Thanks to Paul Oppenheim</p></li>
<li><p>wsgi: close timed out client connections</p></li>
@@ -481,9 +497,9 @@ errors</p></li>
<li><p>wsgi: allow minimum_chunk_size to be overriden on a per request basis; Thanks to David Goetz</p></li>
<li><p>wsgi: configurable socket_timeout</p></li>
</ul>
-</div>
-<div class="section" id="id41">
-<h1>0.13<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id43">
+<h1>0.13<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>hubs: kqueue support! Thanks to YAMAMOTO Takashi, Edward George</p></li>
<li><p>greenio: Fix AttributeError on MacOSX; Bitbucket #136; Thanks to Derk Tegeler</p></li>
@@ -499,9 +515,9 @@ errors</p></li>
<li><p>wsgi: minimum_chunk_size of last Server altered all previous (global variable); Thanks to Jakub Stasiak</p></li>
<li><p>doc: hubs: Point to the correct function in exception message; Thanks to Floris Bruynooghe</p></li>
</ul>
-</div>
-<div class="section" id="id42">
-<h1>0.12<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id44">
+<h1>0.12<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>zmq: Fix 100% busy CPU in idle after .bind(PUB) (thanks to Geoff Salmon)</p></li>
<li><p>greenio: Fix socket.settimeout() did not switch back to blocking mode (thanks to Peter Skirko)</p></li>
@@ -510,17 +526,17 @@ errors</p></li>
<li><p>wsgi: environ[REMOTE_PORT], also available in log_format, log accept event (thanks to Peter Portante)</p></li>
<li><p>tests: Support libzmq 3.0 SNDHWM option (thanks to Geoff Salmon)</p></li>
</ul>
-</div>
-<div class="section" id="id43">
-<h1>0.11<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id45">
+<h1>0.11<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: Fix 100% busy CPU in socket.sendall() (thanks to Raymon Lu)</p></li>
<li><p>zmq: Return linger argument to Socket.close() (thanks to Eric Windisch)</p></li>
<li><p>tests: SSL tests were always skipped due to bug in skip_if_no_ssl decorator</p></li>
</ul>
-</div>
-<div class="section" id="id44">
-<h1>0.10<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id46">
+<h1>0.10<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: Fix relative seek() (thanks to AlanP)</p></li>
<li><p>db_pool: Fix pool.put() TypeError with min_size &gt; 1 (thanks to Jessica Qi)</p></li>
@@ -537,9 +553,9 @@ errors</p></li>
<li><p>tests: Skip SSL tests when not available (thanks to Floris Bruynooghe)</p></li>
<li><p>greenio: Remove deprecated GreenPipe.xreadlines() method, was broken anyway</p></li>
</ul>
-</div>
-<div class="section" id="id45">
-<h1>0.9.17<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id47">
+<h1>0.9.17<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ support calling send and recv from multiple greenthreads (thanks to Geoff Salmon)</p></li>
<li><p>SSL: unwrap() sends data, and so it needs trampolining (#104 thanks to Brandon Rhodes)</p></li>
@@ -554,15 +570,15 @@ errors</p></li>
<li><p>wsgi: Limit HTTP header size (thanks to Gregory Holt)</p></li>
<li><p>wsgi: Configurable maximum URL length (thanks to Tomas Sedovic)</p></li>
</ul>
-</div>
-<div class="section" id="id46">
-<h1>0.9.16<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id48">
+<h1>0.9.16<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>SO_REUSEADDR now correctly set.</p></li>
</ul>
-</div>
-<div class="section" id="id47">
-<h1>0.9.15<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id49">
+<h1>0.9.15<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ support without an explicit hub now implemented! Thanks to Zed Shaw for the patch.</p></li>
<li><p>zmq module supports the NOBLOCK flag, thanks to rfk. (#76)</p></li>
@@ -573,9 +589,9 @@ errors</p></li>
<li><p>eventlet.listen’s behavior on Windows improved, thanks to Nick Vatamaniuc (#83)</p></li>
<li><p>Timeouts raised within tpool.execute are propagated back to the caller (thanks again to redbo for being the squeaky wheel)</p></li>
</ul>
-</div>
-<div class="section" id="id48">
-<h1>0.9.14<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id50">
+<h1>0.9.14<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Many fixes to the ZeroMQ hub, which now requires version 2.0.10 or later. Thanks to Ben Ford.</p></li>
<li><p>ZeroMQ hub no longer depends on pollhub, and thus works on Windows (thanks, Alexey Borzenkov)</p></li>
@@ -588,9 +604,9 @@ errors</p></li>
<li><p>Hub doesn’t hold on to invalid fds (#74, thanks to Edward George)</p></li>
<li><p>Documentation for eventlet.green.zmq, courtesy of Ben Ford</p></li>
</ul>
-</div>
-<div class="section" id="id49">
-<h1>0.9.13<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id51">
+<h1>0.9.13<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ hub, and eventlet.green.zmq make supersockets green. Thanks to Ben Ford!</p></li>
<li><p>eventlet.green.MySQLdb added. It’s an interface to MySQLdb that uses tpool to make it appear nonblocking</p></li>
@@ -608,9 +624,9 @@ errors</p></li>
<li><p>Removed EVENTLET_TPOOL_DNS, nobody liked that. But if you were using it, install dnspython instead. Thanks to pigmej and gholt.</p></li>
<li><p>Removed _main_wrapper from greenthread, thanks to Ambroff adding keyword arguments to switch() in 0.3!</p></li>
</ul>
-</div>
-<div class="section" id="id50">
-<h1>0.9.12<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id52">
+<h1>0.9.12<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Eventlet no longer uses the Twisted hub if Twisted is imported – you must call eventlet.hubs.use_hub(‘twistedr’) if you want to use it. This prevents strange race conditions for those who want to use both Twisted and Eventlet separately.</p></li>
<li><p>Removed circular import in twistedr.py</p></li>
@@ -622,9 +638,9 @@ errors</p></li>
<li><p>Better documentation on eventlet.event.Event.send_exception</p></li>
<li><p>Adding websocket.html to tarball so that you can run the examples without checking out the source</p></li>
</ul>
-</div>
-<div class="section" id="id51">
-<h1>0.9.10<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id53">
+<h1>0.9.10<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Greendns: if dnspython is installed, Eventlet will automatically use it to provide non-blocking DNS queries. Set the environment variable ‘EVENTLET_NO_GREENDNS’ if you don’t want greendns but have dnspython installed.</p></li>
<li><p>Full test suite passes on Python 2.7.</p></li>
@@ -636,17 +652,17 @@ errors</p></li>
<li><p>tpool.Proxy can wrap callables</p></li>
<li><p>Tweaked Timeout class to do something sensible when True is passed to the constructor</p></li>
</ul>
-</div>
-<div class="section" id="id52">
-<h1>0.9.9<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id54">
+<h1>0.9.9<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>A fix for monkeypatching on systems with psycopg version 2.0.14.</p></li>
<li><p>Improved support for chunked transfers in wsgi, plus a bunch of tests from schmir (ported from gevent by redbo)</p></li>
<li><p>A fix for the twisted hub from Favo Yang</p></li>
</ul>
-</div>
-<div class="section" id="id53">
-<h1>0.9.8<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id55">
+<h1>0.9.8<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Support for psycopg2’s asynchronous mode, from Daniele Varrazzo</p></li>
<li><p>websocket module is now part of core Eventlet with 100% unit test coverage thanks to Ben Ford. See its documentation at <a class="reference external" href="http://eventlet.net/doc/modules/websocket.html">http://eventlet.net/doc/modules/websocket.html</a></p></li>
@@ -657,9 +673,9 @@ errors</p></li>
<li><p>amajorek’s reimplementation of GreenPipe</p></li>
<li><p>Many bug fixes, major and minor.</p></li>
</ul>
-</div>
-<div class="section" id="id54">
-<h1>0.9.7<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id56">
+<h1>0.9.7<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenPipe is now a context manager (thanks, quad)</p></li>
<li><p>tpool.Proxy supports iterators properly</p></li>
@@ -668,9 +684,9 @@ errors</p></li>
<li><p>a few more example apps</p></li>
<li><p>multitudinous improvements in Py3k compatibility from amajorek</p></li>
</ul>
-</div>
-<div class="section" id="id55">
-<h1>0.9.6<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id57">
+<h1>0.9.6<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>new EVENTLET_HUB environment variable allows you to select a hub without code</p></li>
<li><p>improved GreenSocket and GreenPipe compatibility with stdlib</p></li>
@@ -688,9 +704,9 @@ errors</p></li>
<li><p>better PEP-8 compliance and import cleanup</p></li>
<li><p>new eventlet.serve convenience function for easy TCP servers</p></li>
</ul>
-</div>
-<div class="section" id="id56">
-<h1>0.9.5<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id58">
+<h1>0.9.5<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>support psycopg in db_pool</p></li>
<li><p>smart patcher that does the right patching when importing without needing to understand plumbing of patched module</p></li>
@@ -712,9 +728,9 @@ errors</p></li>
<li><p>much better documentation overall</p></li>
<li><p>new convenience functions: eventlet.connect and eventlet.listen. Thanks, Sergey!</p></li>
</ul>
-</div>
-<div class="section" id="id57">
-<h1>0.9.4<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id59">
+<h1>0.9.4<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Deprecated coros.Queue and coros.Channel (use queue.Queue instead)</p></li>
<li><p>Added putting and getting methods to queue.Queue.</p></li>
@@ -722,9 +738,9 @@ errors</p></li>
<li><p>Changed __init__.py so that the version number is readable even if greenlet’s not installed.</p></li>
<li><p>Bugfixes in wsgi, greenpool</p></li>
</ul>
-</div>
-<div class="section" id="id58">
-<h1>0.9.3<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id60">
+<h1>0.9.3<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Moved primary api module to __init__ from api. It shouldn’t be necessary to import eventlet.api anymore; import eventlet should do the same job.</p></li>
<li><p>Proc module deprecated in favor of greenthread</p></li>
@@ -749,17 +765,17 @@ errors</p></li>
<li><p>Removed previously-deprecated features tcp_server, GreenSSL, erpc, and trap_errors.</p></li>
<li><p>Removed saranwrap as an option for making db connections nonblocking in db_pool.</p></li>
</ul>
-</div>
-<div class="section" id="id59">
-<h1>0.9.2<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id61">
+<h1>0.9.2<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Bugfix for wsgi.py where it was improperly expecting the environ variable to be a constant when passed to the application.</p></li>
<li><p>Tpool.py now passes its tests on Windows.</p></li>
<li><p>Fixed minor performance issue in wsgi.</p></li>
</ul>
-</div>
-<div class="section" id="id60">
-<h1>0.9.1<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id62">
+<h1>0.9.1<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>PyOpenSSL is no longer required for Python 2.6: use the eventlet.green.ssl module. 2.5 and 2.4 still require PyOpenSSL.</p></li>
<li><p>Cleaned up the eventlet.green packages and their associated tests, this should result in fewer version-dependent bugs with these modules.</p></li>
@@ -777,9 +793,9 @@ errors</p></li>
<li><p>Deprecated erpc method in tpool.py</p></li>
<li><p>Bug fixes in: wsgi.py, twistedr.py, poll.py, greenio.py, util.py, select.py, processes.py, selects.py</p></li>
</ul>
-</div>
-<div class="section" id="id61">
-<h1>0.9.0<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id63">
+<h1>0.9.0<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Full-duplex sockets (simultaneous readers and writers in the same process).</p></li>
<li><dl class="simple">
@@ -792,40 +808,40 @@ errors</p></li>
<li><p>Remove copied code from python standard libs (in tests).</p></li>
<li><p>Added eventlet.patcher which can be used to import “greened” modules.</p></li>
</ul>
-</div>
-<div class="section" id="id62">
-<h1>0.8.16<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id64">
+<h1>0.8.16<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenSSLObject properly masks ZeroReturnErrors with an empty read; with unit test.</p></li>
<li><p>Fixed 2.6 SSL compatibility issue.</p></li>
</ul>
-</div>
-<div class="section" id="id63">
-<h1>0.8.15<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id65">
+<h1>0.8.15<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenSSL object no longer converts ZeroReturnErrors into empty reads, because that is more compatible with the underlying SSLConnection object.</p></li>
<li><p>Fixed issue caused by SIGCHLD handler in processes.py</p></li>
<li><p>Stopped supporting string exceptions in saranwrap and fixed a few test failures.</p></li>
</ul>
-</div>
-<div class="section" id="id64">
-<h1>0.8.14<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id66">
+<h1>0.8.14<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fixed some more Windows compatibility problems, resolving EVT-37 :</p></li>
</ul>
<p><a class="reference external" href="http://jira.secondlife.com/browse/EVT-37">http://jira.secondlife.com/browse/EVT-37</a>
* waiting() method on Pool class, which was lost when the Pool implementation
replaced CoroutinePool.</p>
-</div>
-<div class="section" id="id65">
-<h1>0.8.13<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id67">
+<h1>0.8.13<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>2.6 SSL compatibility patch by Marcus Cavanaugh.</p></li>
<li><p>Added greenlet and pyopenssl as dependencies in setup.py.</p></li>
</ul>
-</div>
-<div class="section" id="id66">
-<h1>0.8.12<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id68">
+<h1>0.8.12<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>The ability to resize() pools of coroutines, which was lost when the</p></li>
</ul>
@@ -837,9 +853,9 @@ GreenSSL sockets must now call shutdown() before close(), exactly
like SSL.Connection objects.
* A small patch that makes Eventlet work on Windows. This is the first
release of Eventlet that works on Windows.</p>
-</div>
-<div class="section" id="id67">
-<h1>0.8.11<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id69">
+<h1>0.8.11<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h1>
<p>Eventlet can now run on top of twisted reactor. Twisted-based hub is enabled automatically if
twisted.internet.reactor is imported. It is also possible to “embed” eventlet into a twisted
application via eventlet.twistedutil.join_reactor. See the examples for details.</p>
@@ -886,35 +902,36 @@ The script generates an html page with the results.</p>
<p>Thanks to Brian Brunswick for investigation of popen4 badness (eventlet.process)
Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.</p>
<p>The twisted integration as well as many other improvements were funded by AG Projects (<a class="reference external" href="http://ag-projects.com">http://ag-projects.com</a>), thanks!</p>
-</div>
-<div class="section" id="x">
+</section>
+<section id="x">
<h1>0.8.x<a class="headerlink" href="#x" title="Permalink to this headline">¶</a></h1>
<p>Fix a CPU leak that would cause the poll hub to consume 100% CPU in certain conditions, for example the echoserver example. (Donovan Preston)</p>
<p>Fix the libev hub to match libev’s callback signature. (Patch by grugq)</p>
<p>Add a backlog argument to api.tcp_listener (Patch by grugq)</p>
-</div>
-<div class="section" id="id68">
-<h1>0.7.x<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id70">
+<h1>0.7.x<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h1>
<p>Fix a major memory leak when using the libevent or libev hubs. Timers were not being removed from the hub after they fired. (Thanks Agusto Becciu and the grugq). Also, make it possible to call wrap_socket_with_coroutine_socket without using the threadpool to make dns operations non-blocking (Thanks the grugq).</p>
<p>It’s now possible to use eventlet’s SSL client to talk to eventlet’s SSL server. (Thanks to Ryan Williams)</p>
<p>Fixed a major CPU leak when using select hub. When adding a descriptor to the hub, entries were made in all three dictionaries, readers, writers, and exc, even if the callback is None. Thus every fd would be passed into all three lists when calling select regardless of whether there was a callback for that event or not. When reading the next request out of a keepalive socket, the socket would come back as ready for writing, the hub would notice the callback is None and ignore it, and then loop as fast as possible consuming CPU.</p>
-</div>
-<div class="section" id="id69">
-<h1>0.6.x<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id71">
+<h1>0.6.x<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h1>
<p>Fixes some long-standing bugs where sometimes failures in accept() or connect() would cause the coroutine that was waiting to be double-resumed, most often resulting in SwitchingToDeadGreenlet exceptions as well as weird tuple-unpacking exceptions in the CoroutinePool main loop.</p>
<p>0.6.1: Added eventlet.tpool.killall. Blocks until all of the threadpool threads have been told to exit and join()ed. Meant to be used to clean up the threadpool on exit or if calling execv. Used by Spawning.</p>
-</div>
-<div class="section" id="id70">
-<h1>0.5.x<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id72">
+<h1>0.5.x<a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h1>
<p>“The Pycon 2008 Refactor”: The first release which incorporates libevent support. Also comes with significant refactoring and code cleanup, especially to the eventlet.wsgi http server. Docstring coverage is much higher and there is new extensive documentation: <a class="reference external" href="http://wiki.secondlife.com/wiki/Eventlet/Documentation">http://wiki.secondlife.com/wiki/Eventlet/Documentation</a></p>
<p>The point releases of 0.5.x fixed some bugs in the wsgi server, most notably handling of Transfer-Encoding: chunked; previously, it would happily send chunked encoding to clients which asked for HTTP/1.0, which isn’t legal.</p>
-</div>
-<div class="section" id="id71">
-<h1>0.2<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h1>
+</section>
+<section id="id73">
+<h1>0.2<a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h1>
<p>Initial re-release of forked linden branch.</p>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -922,78 +939,80 @@ Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.</p>
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table of Contents</a></h3>
<ul>
-<li><a class="reference internal" href="#">0.31.0</a></li>
-<li><a class="reference internal" href="#id2">0.30.3</a></li>
-<li><a class="reference internal" href="#id3">0.30.2</a></li>
-<li><a class="reference internal" href="#id4">0.30.1</a></li>
-<li><a class="reference internal" href="#id5">0.30.0</a></li>
-<li><a class="reference internal" href="#id6">0.29.1</a></li>
-<li><a class="reference internal" href="#id7">0.29.0</a></li>
-<li><a class="reference internal" href="#id8">0.28.1</a></li>
-<li><a class="reference internal" href="#id9">0.28.0</a></li>
-<li><a class="reference internal" href="#id10">0.27.0</a></li>
-<li><a class="reference internal" href="#id11">0.26.1</a></li>
-<li><a class="reference internal" href="#id12">0.26.0</a></li>
-<li><a class="reference internal" href="#id13">0.25.2</a></li>
-<li><a class="reference internal" href="#id14">0.25.1</a></li>
-<li><a class="reference internal" href="#id15">0.25.0</a></li>
-<li><a class="reference internal" href="#id16">0.24.1</a></li>
-<li><a class="reference internal" href="#id17">0.24.0</a></li>
-<li><a class="reference internal" href="#id18">0.23.0</a></li>
-<li><a class="reference internal" href="#id19">0.22.1</a></li>
-<li><a class="reference internal" href="#id20">0.22.0</a></li>
-<li><a class="reference internal" href="#id21">0.21.0</a></li>
-<li><a class="reference internal" href="#id22">0.20.1</a></li>
-<li><a class="reference internal" href="#id23">0.20.0</a></li>
-<li><a class="reference internal" href="#id24">0.19.0</a></li>
-<li><a class="reference internal" href="#id25">0.18.4</a></li>
-<li><a class="reference internal" href="#id26">0.18.3</a></li>
-<li><a class="reference internal" href="#id27">0.18.2</a></li>
-<li><a class="reference internal" href="#id28">0.18.1</a></li>
-<li><a class="reference internal" href="#id29">0.18.0</a></li>
-<li><a class="reference internal" href="#id30">0.17.4</a></li>
-<li><a class="reference internal" href="#id31">0.17.3</a></li>
-<li><a class="reference internal" href="#id32">0.17.2</a></li>
-<li><a class="reference internal" href="#id33">0.17.1</a></li>
-<li><a class="reference internal" href="#id34">0.17</a></li>
-<li><a class="reference internal" href="#id35">0.16.1</a></li>
-<li><a class="reference internal" href="#id36">0.16.0</a></li>
-<li><a class="reference internal" href="#id37">0.15.2</a></li>
-<li><a class="reference internal" href="#id38">0.15.1</a></li>
-<li><a class="reference internal" href="#id39">0.15</a></li>
-<li><a class="reference internal" href="#id40">0.14</a></li>
-<li><a class="reference internal" href="#id41">0.13</a></li>
-<li><a class="reference internal" href="#id42">0.12</a></li>
-<li><a class="reference internal" href="#id43">0.11</a></li>
-<li><a class="reference internal" href="#id44">0.10</a></li>
-<li><a class="reference internal" href="#id45">0.9.17</a></li>
-<li><a class="reference internal" href="#id46">0.9.16</a></li>
-<li><a class="reference internal" href="#id47">0.9.15</a></li>
-<li><a class="reference internal" href="#id48">0.9.14</a></li>
-<li><a class="reference internal" href="#id49">0.9.13</a></li>
-<li><a class="reference internal" href="#id50">0.9.12</a></li>
-<li><a class="reference internal" href="#id51">0.9.10</a></li>
-<li><a class="reference internal" href="#id52">0.9.9</a></li>
-<li><a class="reference internal" href="#id53">0.9.8</a></li>
-<li><a class="reference internal" href="#id54">0.9.7</a></li>
-<li><a class="reference internal" href="#id55">0.9.6</a></li>
-<li><a class="reference internal" href="#id56">0.9.5</a></li>
-<li><a class="reference internal" href="#id57">0.9.4</a></li>
-<li><a class="reference internal" href="#id58">0.9.3</a></li>
-<li><a class="reference internal" href="#id59">0.9.2</a></li>
-<li><a class="reference internal" href="#id60">0.9.1</a></li>
-<li><a class="reference internal" href="#id61">0.9.0</a></li>
-<li><a class="reference internal" href="#id62">0.8.16</a></li>
-<li><a class="reference internal" href="#id63">0.8.15</a></li>
-<li><a class="reference internal" href="#id64">0.8.14</a></li>
-<li><a class="reference internal" href="#id65">0.8.13</a></li>
-<li><a class="reference internal" href="#id66">0.8.12</a></li>
-<li><a class="reference internal" href="#id67">0.8.11</a></li>
+<li><a class="reference internal" href="#">0.32.0</a></li>
+<li><a class="reference internal" href="#id2">0.31.1</a></li>
+<li><a class="reference internal" href="#id3">0.31.0</a></li>
+<li><a class="reference internal" href="#id4">0.30.3</a></li>
+<li><a class="reference internal" href="#id5">0.30.2</a></li>
+<li><a class="reference internal" href="#id6">0.30.1</a></li>
+<li><a class="reference internal" href="#id7">0.30.0</a></li>
+<li><a class="reference internal" href="#id8">0.29.1</a></li>
+<li><a class="reference internal" href="#id9">0.29.0</a></li>
+<li><a class="reference internal" href="#id10">0.28.1</a></li>
+<li><a class="reference internal" href="#id11">0.28.0</a></li>
+<li><a class="reference internal" href="#id12">0.27.0</a></li>
+<li><a class="reference internal" href="#id13">0.26.1</a></li>
+<li><a class="reference internal" href="#id14">0.26.0</a></li>
+<li><a class="reference internal" href="#id15">0.25.2</a></li>
+<li><a class="reference internal" href="#id16">0.25.1</a></li>
+<li><a class="reference internal" href="#id17">0.25.0</a></li>
+<li><a class="reference internal" href="#id18">0.24.1</a></li>
+<li><a class="reference internal" href="#id19">0.24.0</a></li>
+<li><a class="reference internal" href="#id20">0.23.0</a></li>
+<li><a class="reference internal" href="#id21">0.22.1</a></li>
+<li><a class="reference internal" href="#id22">0.22.0</a></li>
+<li><a class="reference internal" href="#id23">0.21.0</a></li>
+<li><a class="reference internal" href="#id24">0.20.1</a></li>
+<li><a class="reference internal" href="#id25">0.20.0</a></li>
+<li><a class="reference internal" href="#id26">0.19.0</a></li>
+<li><a class="reference internal" href="#id27">0.18.4</a></li>
+<li><a class="reference internal" href="#id28">0.18.3</a></li>
+<li><a class="reference internal" href="#id29">0.18.2</a></li>
+<li><a class="reference internal" href="#id30">0.18.1</a></li>
+<li><a class="reference internal" href="#id31">0.18.0</a></li>
+<li><a class="reference internal" href="#id32">0.17.4</a></li>
+<li><a class="reference internal" href="#id33">0.17.3</a></li>
+<li><a class="reference internal" href="#id34">0.17.2</a></li>
+<li><a class="reference internal" href="#id35">0.17.1</a></li>
+<li><a class="reference internal" href="#id36">0.17</a></li>
+<li><a class="reference internal" href="#id37">0.16.1</a></li>
+<li><a class="reference internal" href="#id38">0.16.0</a></li>
+<li><a class="reference internal" href="#id39">0.15.2</a></li>
+<li><a class="reference internal" href="#id40">0.15.1</a></li>
+<li><a class="reference internal" href="#id41">0.15</a></li>
+<li><a class="reference internal" href="#id42">0.14</a></li>
+<li><a class="reference internal" href="#id43">0.13</a></li>
+<li><a class="reference internal" href="#id44">0.12</a></li>
+<li><a class="reference internal" href="#id45">0.11</a></li>
+<li><a class="reference internal" href="#id46">0.10</a></li>
+<li><a class="reference internal" href="#id47">0.9.17</a></li>
+<li><a class="reference internal" href="#id48">0.9.16</a></li>
+<li><a class="reference internal" href="#id49">0.9.15</a></li>
+<li><a class="reference internal" href="#id50">0.9.14</a></li>
+<li><a class="reference internal" href="#id51">0.9.13</a></li>
+<li><a class="reference internal" href="#id52">0.9.12</a></li>
+<li><a class="reference internal" href="#id53">0.9.10</a></li>
+<li><a class="reference internal" href="#id54">0.9.9</a></li>
+<li><a class="reference internal" href="#id55">0.9.8</a></li>
+<li><a class="reference internal" href="#id56">0.9.7</a></li>
+<li><a class="reference internal" href="#id57">0.9.6</a></li>
+<li><a class="reference internal" href="#id58">0.9.5</a></li>
+<li><a class="reference internal" href="#id59">0.9.4</a></li>
+<li><a class="reference internal" href="#id60">0.9.3</a></li>
+<li><a class="reference internal" href="#id61">0.9.2</a></li>
+<li><a class="reference internal" href="#id62">0.9.1</a></li>
+<li><a class="reference internal" href="#id63">0.9.0</a></li>
+<li><a class="reference internal" href="#id64">0.8.16</a></li>
+<li><a class="reference internal" href="#id65">0.8.15</a></li>
+<li><a class="reference internal" href="#id66">0.8.14</a></li>
+<li><a class="reference internal" href="#id67">0.8.13</a></li>
+<li><a class="reference internal" href="#id68">0.8.12</a></li>
+<li><a class="reference internal" href="#id69">0.8.11</a></li>
<li><a class="reference internal" href="#x">0.8.x</a></li>
-<li><a class="reference internal" href="#id68">0.7.x</a></li>
-<li><a class="reference internal" href="#id69">0.6.x</a></li>
-<li><a class="reference internal" href="#id70">0.5.x</a></li>
-<li><a class="reference internal" href="#id71">0.2</a></li>
+<li><a class="reference internal" href="#id70">0.7.x</a></li>
+<li><a class="reference internal" href="#id71">0.6.x</a></li>
+<li><a class="reference internal" href="#id72">0.5.x</a></li>
+<li><a class="reference internal" href="#id73">0.2</a></li>
</ul>
<div role="note" aria-label="source link">
@@ -1007,7 +1026,7 @@ Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -1026,13 +1045,14 @@ Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.</p>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">0.32.0</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/design_patterns.html b/doc/design_patterns.html
index 1f72e61..19b3b74 100644
--- a/doc/design_patterns.html
+++ b/doc/design_patterns.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Design Patterns &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Design Patterns &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="basic_usage.html" title="Basic Usage"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Design Patterns</a></li>
</ul>
</div>
@@ -43,10 +45,10 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="design-patterns">
+ <section id="design-patterns">
<span id="id1"></span><h1>Design Patterns<a class="headerlink" href="#design-patterns" title="Permalink to this headline">¶</a></h1>
<p>There are a bunch of basic patterns that Eventlet usage falls into. Here are a few examples that show their basic structure.</p>
-<div class="section" id="client-pattern">
+<section id="client-pattern">
<h2>Client Pattern<a class="headerlink" href="#client-pattern" title="Permalink to this headline">¶</a></h2>
<p>The canonical client-side example is a web crawler. This use case is given a list of urls and wants to retrieve their bodies for later processing. Here is a very simple example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">eventlet</span>
@@ -69,8 +71,8 @@
<p><code class="docutils literal notranslate"><span class="pre">pool</span> <span class="pre">=</span> <span class="pre">eventlet.GreenPool()</span></code> constructs a <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool" title="eventlet.greenpool.GreenPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPool</span></code></a> of a thousand green threads. Using a pool is good practice because it provides an upper limit on the amount of work that this crawler will be doing simultaneously, which comes in handy when the input data changes dramatically.</p>
<p><code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">body</span> <span class="pre">in</span> <span class="pre">pool.imap(fetch,</span> <span class="pre">urls):</span></code> iterates over the results of calling the fetch function in parallel. <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool.imap" title="eventlet.greenpool.GreenPool.imap"><code class="xref py py-meth docutils literal notranslate"><span class="pre">imap</span></code></a> makes the function calls in parallel, and the results are returned in the order that they were executed.</p>
<p>The key aspect of the client pattern is that it involves collecting the results of each function call; the fact that each fetch is done concurrently is essentially an invisible optimization. Note also that imap is memory-bounded and won’t consume gigabytes of memory if the list of urls grows to the tens of thousands (yes, we had that problem in production once!).</p>
-</div>
-<div class="section" id="server-pattern">
+</section>
+<section id="server-pattern">
<h2>Server Pattern<a class="headerlink" href="#server-pattern" title="Permalink to this headline">¶</a></h2>
<p>Here’s a simple server-side example, a simple echo server:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">eventlet</span>
@@ -93,8 +95,8 @@
<p><code class="docutils literal notranslate"><span class="pre">pool</span> <span class="pre">=</span> <span class="pre">eventlet.GreenPool(10000)</span></code> creates a pool of green threads that could handle ten thousand clients.</p>
<p><code class="docutils literal notranslate"><span class="pre">pool.spawn_n(handle,</span> <span class="pre">new_sock)</span></code> launches a green thread to handle the new client. The accept loop doesn’t care about the return value of the <code class="docutils literal notranslate"><span class="pre">handle</span></code> function, so it uses <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool.spawn_n" title="eventlet.greenpool.GreenPool.spawn_n"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn_n</span></code></a>, instead of <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool.spawn" title="eventlet.greenpool.GreenPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn</span></code></a>.</p>
<p>The difference between the server and the client patterns boils down to the fact that the server has a <code class="docutils literal notranslate"><span class="pre">while</span></code> loop calling <code class="docutils literal notranslate"><span class="pre">accept()</span></code> repeatedly, and that it hands off the client socket completely to the handle() method, rather than collecting the results.</p>
-</div>
-<div class="section" id="dispatch-pattern">
+</section>
+<section id="dispatch-pattern">
<h2>Dispatch Pattern<a class="headerlink" href="#dispatch-pattern" title="Permalink to this headline">¶</a></h2>
<p>One common use case that Linden Lab runs into all the time is a “dispatch” design pattern. This is a server that is also a client of some other services. Proxies, aggregators, job workers, and so on are all terms that apply here. This is the use case that the <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPile" title="eventlet.greenpool.GreenPile"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPile</span></code></a> was designed for.</p>
<p>Here’s a somewhat contrived example: a server that receives POSTs from clients that contain a list of urls of RSS feeds. The server fetches all the feeds concurrently and responds with a list of their titles to the client. It’s easy to imagine it doing something more complex than this, and this could be easily modified to become a Reader-style application:</p>
@@ -119,22 +121,20 @@
<p>The full version of this example is in the <a class="reference internal" href="examples.html#feed-scraper-example"><span class="std std-ref">Feed Scraper</span></a>, which includes code to start the WSGI server on a particular port.</p>
<p>This example uses a global (gasp) <a class="reference internal" href="modules/greenpool.html#eventlet.greenpool.GreenPool" title="eventlet.greenpool.GreenPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPool</span></code></a> to control concurrency. If we didn’t have a global limit on the number of outgoing requests, then a client could cause the server to open tens of thousands of concurrent connections to external servers, thereby getting feedscraper’s IP banned, or various other accidental-or-on-purpose bad behavior. The pool isn’t a complete DoS protection, but it’s the bare minimum.</p>
<p>The interesting lines are in the app function:</p>
-<div class="highlight-python notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
-2
-3
-4</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="n">pile</span> <span class="o">=</span> <span class="n">eventlet</span><span class="o">.</span><span class="n">GreenPile</span><span class="p">(</span><span class="n">pool</span><span class="p">)</span>
-<span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">environ</span><span class="p">[</span><span class="s1">&#39;wsgi.input&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>
- <span class="n">pile</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">fetch_title</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
-<span class="n">titles</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">pile</span><span class="p">)</span>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="n">pile</span> <span class="o">=</span> <span class="n">eventlet</span><span class="o">.</span><span class="n">GreenPile</span><span class="p">(</span><span class="n">pool</span><span class="p">)</span>
+<span class="linenos">2</span><span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">environ</span><span class="p">[</span><span class="s1">&#39;wsgi.input&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>
+<span class="linenos">3</span> <span class="n">pile</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">fetch_title</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+<span class="linenos">4</span><span class="n">titles</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">pile</span><span class="p">)</span>
</pre></div>
-</td></tr></table></div>
+</div>
<p>Note that in line 1, the Pile is constructed using the global pool as its argument. That ties the Pile’s concurrency to the global’s. If there are already 1000 concurrent fetches from other clients of feedscraper, this one will block until some of those complete. Limitations are good!</p>
<p>Line 3 is just a spawn, but note that we don’t store any return value from it. This is because the return value is kept in the Pile itself. This becomes evident in the next line…</p>
<p>Line 4 is where we use the fact that the Pile is an iterator. Each element in the iterator is one of the return values from the fetch_title function, which are strings. We can use a normal Python idiom (<code class="xref py py-func docutils literal notranslate"><span class="pre">join()</span></code>) to concatenate these incrementally as they happen.</p>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -167,7 +167,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -192,13 +192,14 @@
<li class="right" >
<a href="basic_usage.html" title="Basic Usage"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Design Patterns</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/environment.html b/doc/environment.html
index ee61b16..4ceabe8 100644
--- a/doc/environment.html
+++ b/doc/environment.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Environment Variables &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Environment Variables &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="testing.html" title="Testing Eventlet"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Environment Variables</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="environment-variables">
+ <section id="environment-variables">
<span id="env-vars"></span><h1>Environment Variables<a class="headerlink" href="#environment-variables" title="Permalink to this headline">¶</a></h1>
<p>Eventlet’s behavior can be controlled by a few environment variables.
These are only for the advanced user.</p>
@@ -61,9 +63,10 @@ the list will silently fail). Equivalent to calling
environment variable because tpool constructs its pool on first
use, so any control of the pool size needs to happen before then.</p>
</div></blockquote>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -86,7 +89,7 @@ use, so any control of the pool size needs to happen before then.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -111,13 +114,14 @@ use, so any control of the pool size needs to happen before then.</p>
<li class="right" >
<a href="testing.html" title="Testing Eventlet"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Environment Variables</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/examples.html b/doc/examples.html
index 3569242..3da6953 100644
--- a/doc/examples.html
+++ b/doc/examples.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Examples &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Examples &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="patching.html" title="Greening The World"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Examples</a></li>
</ul>
</div>
@@ -43,10 +45,10 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="examples">
+ <section id="examples">
<h1>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h1>
<p>Here are a bunch of small example programs that use Eventlet. All of these examples can be found in the <code class="docutils literal notranslate"><span class="pre">examples</span></code> directory of a source copy of Eventlet.</p>
-<div class="section" id="web-crawler">
+<section id="web-crawler">
<span id="web-crawler-example"></span><h2>Web Crawler<a class="headerlink" href="#web-crawler" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/webcrawler.py</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
@@ -81,8 +83,8 @@
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;got body from&quot;</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="s2">&quot;of length&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="wsgi-server">
+</section>
+<section id="wsgi-server">
<span id="wsgi-server-example"></span><h2>WSGI Server<a class="headerlink" href="#wsgi-server" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/wsgi.py</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="sd">&quot;&quot;&quot;This is a simple example of running a wsgi application with eventlet.</span>
@@ -106,8 +108,8 @@
<span class="n">wsgi</span><span class="o">.</span><span class="n">server</span><span class="p">(</span><span class="n">eventlet</span><span class="o">.</span><span class="n">listen</span><span class="p">((</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="mi">8090</span><span class="p">)),</span> <span class="n">hello_world</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-<div class="section" id="echo-server">
+</section>
+<section id="echo-server">
<span id="echo-server-example"></span><h2>Echo Server<a class="headerlink" href="#echo-server" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/echoserver.py</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="ch">#! /usr/bin/env python</span>
@@ -150,8 +152,8 @@
<span class="k">break</span>
</pre></div>
</div>
-</div>
-<div class="section" id="socket-connect">
+</section>
+<section id="socket-connect">
<span id="socket-connect-example"></span><h2>Socket Connect<a class="headerlink" href="#socket-connect" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/connect.py</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="sd">&quot;&quot;&quot;Spawn multiple workers and collect their results.</span>
@@ -184,8 +186,8 @@
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">result</span><span class="p">)[:</span><span class="mi">50</span><span class="p">]))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="multi-user-chat-server">
+</section>
+<section id="multi-user-chat-server">
<span id="chat-server-example"></span><h2>Multi-User Chat Server<a class="headerlink" href="#multi-user-chat-server" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/chat_server.py</span></code></p>
<p>This is a little different from the echo server, in that it broadcasts the
@@ -230,8 +232,8 @@ messages to all participants, not just the sender.</p>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ChatServer exiting.&quot;</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-<div class="section" id="feed-scraper">
+</section>
+<section id="feed-scraper">
<span id="feed-scraper-example"></span><h2>Feed Scraper<a class="headerlink" href="#feed-scraper" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/feedscraper.py</span></code></p>
<p>This example requires <a class="reference external" href="http://www.feedparser.org/">Feedparser</a> to be installed or on the PYTHONPATH.</p>
@@ -274,8 +276,8 @@ messages to all participants, not just the sender.</p>
<span class="n">wsgi</span><span class="o">.</span><span class="n">server</span><span class="p">(</span><span class="n">eventlet</span><span class="o">.</span><span class="n">listen</span><span class="p">((</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span> <span class="mi">9010</span><span class="p">)),</span> <span class="n">app</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-<div class="section" id="port-forwarder">
+</section>
+<section id="port-forwarder">
<span id="forwarder-example"></span><h2>Port Forwarder<a class="headerlink" href="#port-forwarder" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/forwarder.py</span></code></p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="sd">&quot;&quot;&quot; This is an incredibly simple port forwarder from port 7000 to 22 on</span>
@@ -309,8 +311,8 @@ messages to all participants, not just the sender.</p>
<span class="n">eventlet</span><span class="o">.</span><span class="n">spawn_n</span><span class="p">(</span><span class="n">forward</span><span class="p">,</span> <span class="n">server</span><span class="p">,</span> <span class="n">client</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-<div class="section" id="recursive-web-crawler">
+</section>
+<section id="recursive-web-crawler">
<span id="recursive-crawler-example"></span><h2>Recursive Web Crawler<a class="headerlink" href="#recursive-web-crawler" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/recursive_crawler.py</span></code></p>
<p>This is an example recursive web crawler that fetches linked pages from a seed url.</p>
@@ -364,8 +366,8 @@ messages to all participants, not just the sender.</p>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">seen</span><span class="p">))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="producer-consumer-web-crawler">
+</section>
+<section id="producer-consumer-web-crawler">
<span id="producer-consumer-example"></span><h2>Producer Consumer Web Crawler<a class="headerlink" href="#producer-consumer-web-crawler" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/producer_consumer.py</span></code></p>
<p>This is an example implementation of the producer/consumer pattern as well as being identical in functionality to the recursive web crawler.</p>
@@ -426,8 +428,8 @@ messages to all participants, not just the sender.</p>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">seen</span><span class="p">))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="websocket-server-example">
+</section>
+<section id="websocket-server-example">
<span id="websocket-example"></span><h2>Websocket Server Example<a class="headerlink" href="#websocket-server-example" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/websocket.py</span></code></p>
<p>This exercises some of the features of the websocket server
@@ -477,8 +479,8 @@ implementation.</p>
<span class="n">wsgi</span><span class="o">.</span><span class="n">server</span><span class="p">(</span><span class="n">listener</span><span class="p">,</span> <span class="n">dispatch</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-<div class="section" id="websocket-multi-user-chat-example">
+</section>
+<section id="websocket-multi-user-chat-example">
<span id="websocket-chat-example"></span><h2>Websocket Multi-User Chat Example<a class="headerlink" href="#websocket-multi-user-chat-example" title="Permalink to this headline">¶</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">examples/websocket_chat.py</span></code></p>
<p>This is a mashup of the websocket example and the multi-user chat example, showing how you can do the same sorts of things with websockets that you can do with regular sockets.</p>
@@ -523,10 +525,11 @@ implementation.</p>
<span class="n">wsgi</span><span class="o">.</span><span class="n">server</span><span class="p">(</span><span class="n">listener</span><span class="p">,</span> <span class="n">dispatch</span><span class="p">)</span>
</pre></div>
</div>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -567,7 +570,7 @@ implementation.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -592,13 +595,14 @@ implementation.</p>
<li class="right" >
<a href="patching.html" title="Greening The World"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Examples</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/genindex.html b/doc/genindex.html
index b931e54..efec77f 100644
--- a/doc/genindex.html
+++ b/doc/genindex.html
@@ -1,19 +1,18 @@
-
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Index &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Index &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
@@ -27,7 +26,8 @@
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Index</a></li>
</ul>
</div>
@@ -102,7 +102,7 @@
</li>
<li><a href="modules/backdoor.html#eventlet.backdoor.backdoor_server">backdoor_server() (in module eventlet.backdoor)</a>
</li>
- <li><a href="modules/semaphore.html#eventlet.semaphore.CappedSemaphore.balance">balance() (eventlet.semaphore.CappedSemaphore property)</a>
+ <li><a href="modules/semaphore.html#eventlet.semaphore.CappedSemaphore.balance">balance (eventlet.semaphore.CappedSemaphore property)</a>
<ul>
<li><a href="modules/semaphore.html#eventlet.semaphore.Semaphore.balance">(eventlet.semaphore.Semaphore property)</a>
@@ -477,6 +477,8 @@
</li>
<li><a href="modules/queue.html#eventlet.queue.LightQueue.get_nowait">get_nowait() (eventlet.queue.LightQueue method)</a>
</li>
+ <li><a href="modules/greenthread.html#eventlet.greenthread.getcurrent">getcurrent() (in module eventlet.greenthread)</a>
+</li>
<li><a href="modules/queue.html#eventlet.queue.LightQueue.getting">getting() (eventlet.queue.LightQueue method)</a>
</li>
<li><a href="modules/greenpool.html#eventlet.greenpool.GreenPile">GreenPile (class in eventlet.greenpool)</a>
@@ -888,6 +890,7 @@
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -897,7 +900,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -916,13 +919,14 @@
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Index</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/history.html b/doc/history.html
index 7f025ff..2c7ad73 100644
--- a/doc/history.html
+++ b/doc/history.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>History &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>History &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -30,7 +31,8 @@
<li class="right" >
<a href="authors.html" title="Authors"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">History</a></li>
</ul>
</div>
@@ -39,7 +41,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="history">
+ <section id="history">
<h1>History<a class="headerlink" href="#history" title="Permalink to this headline">¶</a></h1>
<p>Eventlet began life as Donovan Preston was talking to Bob Ippolito about coroutine-based non-blocking networking frameworks in Python. Most non-blocking frameworks require you to run the “main loop” in order to perform all network operations, but Donovan wondered if a library written using a trampolining style could get away with transparently running the main loop any time i/o was required, stopping the main loop once no more i/o was scheduled. Bob spent a few days during PyCon 2006 writing a proof-of-concept. He named it eventlet, after the coroutine implementation it used, <a class="reference external" href="http://cheeseshop.python.org/pypi/greenletgreenlet">greenlet</a>. Donovan began using eventlet as a light-weight network library for his spare-time project <a class="reference external" href="http://soundfarmer.com/Pavel/trunk/Pavel">Pavel</a>, and also began writing some unittests.</p>
<ul class="simple">
@@ -47,9 +49,10 @@
</ul>
<p>When Donovan started at Linden Lab in May of 2006, he added eventlet as an svn external in the <code class="docutils literal notranslate"><span class="pre">indra/lib/python</span> <span class="pre">directory</span></code>, to be a dependency of the yet-to-be-named backbone project (at the time, it was named restserv). However, including eventlet as an svn external meant that any time the externally hosted project had hosting issues, Linden developers were not able to perform svn updates. Thus, the eventlet source was imported into the linden source tree at the same location, and became a fork.</p>
<p>Bob Ippolito has ceased working on eventlet and has stated his desire for Linden to take it’s fork forward to the open source world as “the” eventlet.</p>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -69,7 +72,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -91,13 +94,14 @@
<li class="right" >
<a href="authors.html" title="Authors"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">History</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/hubs.html b/doc/hubs.html
index 084e328..144fd47 100644
--- a/doc/hubs.html
+++ b/doc/hubs.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Understanding Eventlet Hubs &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Understanding Eventlet Hubs &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="zeromq.html" title="Zeromq"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Understanding Eventlet Hubs</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="understanding-eventlet-hubs">
+ <section id="understanding-eventlet-hubs">
<span id="understanding-hubs"></span><h1>Understanding Eventlet Hubs<a class="headerlink" href="#understanding-eventlet-hubs" title="Permalink to this headline">¶</a></h1>
<p>A hub forms the basis of Eventlet’s event loop, which dispatches I/O events and schedules greenthreads. It is the existence of the hub that promotes coroutines (which can be tricky to program with) into greenthreads (which are easy).</p>
<p>Eventlet has multiple hub implementations, and when you start using it, it tries to select the best hub implementation for your system. The hubs that it supports are (in order of preference):</p>
@@ -59,8 +61,8 @@
</dl>
<p>If the selected hub is not ideal for the application, another can be selected. You can make the selection either with the environment variable <a class="reference internal" href="environment.html#env-vars"><span class="std std-ref">EVENTLET_HUB</span></a>, or with use_hub.</p>
<dl class="py function">
-<dt id="eventlet.hubs.use_hub">
-<code class="sig-prename descclassname">eventlet.hubs.</code><code class="sig-name descname">use_hub</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">hub</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.use_hub" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.hubs.use_hub">
+<span class="sig-prename descclassname"><span class="pre">eventlet.hubs.</span></span><span class="sig-name descname"><span class="pre">use_hub</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">hub</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.use_hub" title="Permalink to this definition">¶</a></dt>
<dd><p>Use this to control which hub Eventlet selects. Call it with the name of the desired hub module. Make sure to do this before the application starts doing any I/O! Calling use_hub completely eliminates the old hub, and any file descriptors or timers that it had been managing will be forgotten. Put the call as one of the first lines in the main module.:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="sd">&quot;&quot;&quot; This is the main module &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">eventlet</span> <span class="kn">import</span> <span class="n">hubs</span>
@@ -77,17 +79,17 @@
<p>Supplying None as the argument to <a class="reference internal" href="#eventlet.hubs.use_hub" title="eventlet.hubs.use_hub"><code class="xref py py-func docutils literal notranslate"><span class="pre">eventlet.hubs.use_hub()</span></code></a> causes it to select the default hub.</p>
</dd></dl>
-<div class="section" id="how-the-hubs-work">
+<section id="how-the-hubs-work">
<h2>How the Hubs Work<a class="headerlink" href="#how-the-hubs-work" title="Permalink to this headline">¶</a></h2>
<p>The hub has a main greenlet, MAINLOOP. When one of the running coroutines needs
to do some I/O, it registers a listener with the hub (so that the hub knows when to wake it up again), and then switches to MAINLOOP (via <code class="docutils literal notranslate"><span class="pre">get_hub().switch()</span></code>). If there are other coroutines that are ready to run, MAINLOOP switches to them, and when they complete or need to do more I/O, they switch back to the MAINLOOP. In this manner, MAINLOOP ensures that every coroutine gets scheduled when it has some work to do.</p>
<p>MAINLOOP is launched only when the first I/O operation happens, and it is not the same greenlet that __main__ is running in. This lazy launching is why it’s not necessary to explicitly call a dispatch() method like other frameworks, which in turn means that code can start using Eventlet without needing to be substantially restructured.</p>
-</div>
-<div class="section" id="more-hub-related-functions">
+</section>
+<section id="more-hub-related-functions">
<h2>More Hub-Related Functions<a class="headerlink" href="#more-hub-related-functions" title="Permalink to this headline">¶</a></h2>
<dl class="py function">
-<dt id="eventlet.hubs.get_hub">
-<code class="sig-prename descclassname">eventlet.hubs.</code><code class="sig-name descname">get_hub</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.get_hub" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.hubs.get_hub">
+<span class="sig-prename descclassname"><span class="pre">eventlet.hubs.</span></span><span class="sig-name descname"><span class="pre">get_hub</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.get_hub" title="Permalink to this definition">¶</a></dt>
<dd><p>Get the current event hub singleton object.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
@@ -97,8 +99,8 @@ unexpectedly without being deprecated first.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.hubs.get_default_hub">
-<code class="sig-prename descclassname">eventlet.hubs.</code><code class="sig-name descname">get_default_hub</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.get_default_hub" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.hubs.get_default_hub">
+<span class="sig-prename descclassname"><span class="pre">eventlet.hubs.</span></span><span class="sig-name descname"><span class="pre">get_default_hub</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.get_default_hub" title="Permalink to this definition">¶</a></dt>
<dd><p>Select the default hub implementation based on what multiplexing
libraries are installed. The order that the hubs are tried is:</p>
<ul class="simple">
@@ -117,8 +119,8 @@ unexpectedly without being deprecated first.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.hubs.trampoline">
-<code class="sig-prename descclassname">eventlet.hubs.</code><code class="sig-name descname">trampoline</code><span class="sig-paren">(</span><em class="sig-param">fd</em>, <em class="sig-param">read=None</em>, <em class="sig-param">write=None</em>, <em class="sig-param">timeout=None</em>, <em class="sig-param">timeout_exc=&lt;class 'eventlet.timeout.Timeout'&gt;</em>, <em class="sig-param">mark_as_closed=None</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.trampoline" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.hubs.trampoline">
+<span class="sig-prename descclassname"><span class="pre">eventlet.hubs.</span></span><span class="sig-name descname"><span class="pre">trampoline</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">fd</span></em>, <em class="sig-param"><span class="pre">read=None</span></em>, <em class="sig-param"><span class="pre">write=None</span></em>, <em class="sig-param"><span class="pre">timeout=None</span></em>, <em class="sig-param"><span class="pre">timeout_exc=&lt;class</span> <span class="pre">'eventlet.timeout.Timeout'&gt;</span></em>, <em class="sig-param"><span class="pre">mark_as_closed=None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.hubs.trampoline" title="Permalink to this definition">¶</a></dt>
<dd><p>Suspend the current coroutine until the given socket object or file
descriptor is ready to <em>read</em>, ready to <em>write</em>, or the specified
<em>timeout</em> elapses, depending on arguments specified.</p>
@@ -135,10 +137,11 @@ unexpectedly without being deprecated first.</p>
</div>
</dd></dl>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -170,7 +173,7 @@ unexpectedly without being deprecated first.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -195,13 +198,14 @@ unexpectedly without being deprecated first.</p>
<li class="right" >
<a href="zeromq.html" title="Zeromq"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Understanding Eventlet Hubs</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/index.html b/doc/index.html
index 6245ba1..eaa3a83 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Eventlet Documentation &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Eventlet Documentation &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -30,7 +31,8 @@
<li class="right" >
<a href="basic_usage.html" title="Basic Usage"
accesskey="N">next</a> |</li>
- <li class="nav-item nav-item-0"><a href="#">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="#">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Eventlet Documentation</a></li>
</ul>
</div>
@@ -39,7 +41,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="eventlet-documentation">
+ <section id="eventlet-documentation">
<h1>Eventlet Documentation<a class="headerlink" href="#eventlet-documentation" title="Permalink to this headline">¶</a></h1>
<p>Code talks! This is a simple web crawler that fetches a bunch of urls concurrently:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">urls</span> <span class="o">=</span> <span class="p">[</span>
@@ -59,12 +61,12 @@
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;got body&quot;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="supported-python-versions">
+</section>
+<section id="supported-python-versions">
<h1>Supported Python versions<a class="headerlink" href="#supported-python-versions" title="Permalink to this headline">¶</a></h1>
<p>Currently CPython 2.7 and 3.4+ are supported, but <strong>2.7 and 3.4 support is deprecated and will be removed in the future</strong>, only CPython 3.5+ support will remain.</p>
-</div>
-<div class="section" id="contents">
+</section>
+<section id="contents">
<h1>Contents<a class="headerlink" href="#contents" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
@@ -158,21 +160,22 @@
<li class="toctree-l1"><a class="reference internal" href="history.html">History</a></li>
</ul>
</div>
-<div class="section" id="license">
+<section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline">¶</a></h2>
<p>Eventlet is made available under the terms of the open source <a class="reference external" href="http://www.opensource.org/licenses/mit-license.php">MIT license</a></p>
-</div>
-</div>
-<div class="section" id="indices-and-tables">
+</section>
+</section>
+<section id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -203,7 +206,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -225,13 +228,14 @@
<li class="right" >
<a href="basic_usage.html" title="Basic Usage"
>next</a> |</li>
- <li class="nav-item nav-item-0"><a href="#">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="#">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Eventlet Documentation</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules.html b/doc/modules.html
index 65d13d7..97e5acc 100644
--- a/doc/modules.html
+++ b/doc/modules.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Module Reference &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Module Reference &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="environment.html" title="Environment Variables"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Module Reference</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-reference">
+ <section id="module-reference">
<h1>Module Reference<a class="headerlink" href="#module-reference" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
@@ -78,9 +80,10 @@
<li class="toctree-l1"><a class="reference internal" href="modules/zmq.html"><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> – ØMQ support</a></li>
</ul>
</div>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -103,7 +106,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -128,13 +131,14 @@
<li class="right" >
<a href="environment.html" title="Environment Variables"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Module Reference</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/backdoor.html b/doc/modules/backdoor.html
index 5b9b916..55ff537 100644
--- a/doc/modules/backdoor.html
+++ b/doc/modules/backdoor.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>backdoor – Python interactive interpreter within a running process &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>backdoor – Python interactive interpreter within a running process &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="../modules.html" title="Module Reference"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">backdoor</span></code> – Python interactive interpreter within a running process</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="backdoor-python-interactive-interpreter-within-a-running-process">
+ <section id="backdoor-python-interactive-interpreter-within-a-running-process">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">backdoor</span></code> – Python interactive interpreter within a running process<a class="headerlink" href="#backdoor-python-interactive-interpreter-within-a-running-process" title="Permalink to this headline">¶</a></h1>
<p>The backdoor module is convenient for inspecting the state of a long-running process. It supplies the normal Python interactive interpreter in a way that does not block the normal operation of the application. This can be useful for debugging, performance tuning, or simply learning about how things behave in situ.</p>
<p>In the application, spawn a greenthread running backdoor_server on a listening socket:</p>
@@ -63,14 +65,14 @@ Type <span class="s2">&quot;help&quot;</span>, <span class="s2">&quot;copyright&
</div>
<p>The backdoor cooperatively yields to the rest of the application between commands, so on a running server continuously serving requests, you can observe the internal state changing between interpreter commands.</p>
<span class="target" id="module-eventlet.backdoor"></span><dl class="py class">
-<dt id="eventlet.backdoor.SocketConsole">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.backdoor.</code><code class="sig-name descname">SocketConsole</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">desc</span></em>, <em class="sig-param"><span class="n">hostport</span></em>, <em class="sig-param"><span class="n">locals</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.SocketConsole" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.backdoor.SocketConsole">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.backdoor.</span></span><span class="sig-name descname"><span class="pre">SocketConsole</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">desc</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hostport</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">locals</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.SocketConsole" title="Permalink to this definition">¶</a></dt>
<dd><dl class="py method">
-<dt id="eventlet.backdoor.SocketConsole.switch">
-<code class="sig-name descname">switch</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.SocketConsole.switch" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.backdoor.SocketConsole.switch">
+<span class="sig-name descname"><span class="pre">switch</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.SocketConsole.switch" title="Permalink to this definition">¶</a></dt>
<dd><p>Switch execution to this greenlet.</p>
<p>If this greenlet has never been run, then this greenlet
-will be switched to using the body of self.run(<a href="#id1"><span class="problematic" id="id2">*</span></a>args, <a href="#id3"><span class="problematic" id="id4">**</span></a>kwargs).</p>
+will be switched to using the body of <code class="docutils literal notranslate"><span class="pre">self.run(*args,</span> <span class="pre">**kwargs)</span></code>.</p>
<p>If the greenlet is active (has been run, but was switch()’ed
out before leaving its run function), then this greenlet will
be resumed and the return value to its switch call will be
@@ -85,8 +87,8 @@ above.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.backdoor.backdoor">
-<code class="sig-prename descclassname">eventlet.backdoor.</code><code class="sig-name descname">backdoor</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">conn_info</span></em>, <em class="sig-param"><span class="n">locals</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.backdoor" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.backdoor.backdoor">
+<span class="sig-prename descclassname"><span class="pre">eventlet.backdoor.</span></span><span class="sig-name descname"><span class="pre">backdoor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">conn_info</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">locals</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.backdoor" title="Permalink to this definition">¶</a></dt>
<dd><p>Sets up an interactive console on a socket with a single connected
client. This does not block the caller, as it spawns a new greenlet to
handle the console. This is meant to be called from within an accept loop
@@ -94,8 +96,8 @@ handle the console. This is meant to be called from within an accept loop
</dd></dl>
<dl class="py function">
-<dt id="eventlet.backdoor.backdoor_server">
-<code class="sig-prename descclassname">eventlet.backdoor.</code><code class="sig-name descname">backdoor_server</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sock</span></em>, <em class="sig-param"><span class="n">locals</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.backdoor_server" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.backdoor.backdoor_server">
+<span class="sig-prename descclassname"><span class="pre">eventlet.backdoor.</span></span><span class="sig-name descname"><span class="pre">backdoor_server</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sock</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">locals</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.backdoor.backdoor_server" title="Permalink to this definition">¶</a></dt>
<dd><p>Blocking function that runs a backdoor server on the socket <em>sock</em>,
accepting connections and running backdoor consoles for each client that
connects.</p>
@@ -104,9 +106,10 @@ of the interpreters. It can be convenient to stick important application
variables in here.</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -129,7 +132,7 @@ variables in here.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -154,14 +157,15 @@ variables in here.</p>
<li class="right" >
<a href="../modules.html" title="Module Reference"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">backdoor</span></code> – Python interactive interpreter within a running process</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/corolocal.html b/doc/modules/corolocal.html
index fa465d4..2be6da5 100644
--- a/doc/modules/corolocal.html
+++ b/doc/modules/corolocal.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>corolocal – Coroutine local storage &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>corolocal – Coroutine local storage &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="backdoor.html" title="backdoor – Python interactive interpreter within a running process"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">corolocal</span></code> – Coroutine local storage</a></li>
</ul>
</div>
@@ -44,22 +46,23 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.corolocal">
+ <section id="module-eventlet.corolocal">
<span id="corolocal-coroutine-local-storage"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">corolocal</span></code> – Coroutine local storage<a class="headerlink" href="#module-eventlet.corolocal" title="Permalink to this headline">¶</a></h1>
<dl class="py function">
-<dt id="eventlet.corolocal.get_ident">
-<code class="sig-prename descclassname">eventlet.corolocal.</code><code class="sig-name descname">get_ident</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.corolocal.get_ident" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.corolocal.get_ident">
+<span class="sig-prename descclassname"><span class="pre">eventlet.corolocal.</span></span><span class="sig-name descname"><span class="pre">get_ident</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.corolocal.get_ident" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns <code class="docutils literal notranslate"><span class="pre">id()</span></code> of current greenlet. Useful for debugging.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.corolocal.local">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.corolocal.</code><code class="sig-name descname">local</code><a class="headerlink" href="#eventlet.corolocal.local" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.corolocal.local">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.corolocal.</span></span><span class="sig-name descname"><span class="pre">local</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.corolocal.local" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -82,7 +85,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -107,14 +110,15 @@
<li class="right" >
<a href="backdoor.html" title="backdoor – Python interactive interpreter within a running process"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">corolocal</span></code> – Coroutine local storage</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/dagpool.html b/doc/modules/dagpool.html
index f336d55..49b3f6d 100644
--- a/doc/modules/dagpool.html
+++ b/doc/modules/dagpool.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>dagpool – Dependency-Driven Greenthreads &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>dagpool – Dependency-Driven Greenthreads &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="corolocal.html" title="corolocal – Coroutine local storage"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">dagpool</span></code> – Dependency-Driven Greenthreads</a></li>
</ul>
</div>
@@ -44,9 +46,9 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="dagpool-dependency-driven-greenthreads">
+ <section id="dagpool-dependency-driven-greenthreads">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">dagpool</span></code> – Dependency-Driven Greenthreads<a class="headerlink" href="#dagpool-dependency-driven-greenthreads" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="rationale">
+<section id="rationale">
<h2>Rationale<a class="headerlink" href="#rationale" title="Permalink to this headline">¶</a></h2>
<p>The dagpool module provides the <a class="reference internal" href="#eventlet.dagpool.DAGPool" title="eventlet.dagpool.DAGPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">DAGPool</span></code></a>
class, which addresses situations in which the value produced by one
@@ -94,10 +96,10 @@ The key in each pair is the key of one of the greenthread’s specified upstream
producers; the value is the value returned by that producer greenthread. Pairs
are delivered in the order results become available; the consuming greenthread
blocks until the next result can be delivered.</p>
-</div>
-<div class="section" id="tutorial">
+</section>
+<section id="tutorial">
<h2>Tutorial<a class="headerlink" href="#tutorial" title="Permalink to this headline">¶</a></h2>
-<div class="section" id="example">
+<section id="example">
<h3>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h3>
<p>Consider a couple of programs in some compiled language that depend on a set
of precompiled libraries. Suppose every such build requires as input the
@@ -230,8 +232,8 @@ it’s aware:</p>
<span class="c1"># process its result...</span>
</pre></div>
</div>
-</div>
-<div class="section" id="introspection">
+</section>
+<section id="introspection">
<h3>Introspection<a class="headerlink" href="#introspection" title="Permalink to this headline">¶</a></h3>
<p>Let’s say you have set up a <a class="reference internal" href="#eventlet.dagpool.DAGPool" title="eventlet.dagpool.DAGPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">DAGPool</span></code></a> with
the dependencies shown above. To your consternation, your <a class="reference internal" href="#eventlet.dagpool.DAGPool.waitall" title="eventlet.dagpool.DAGPool.waitall"><code class="xref py py-meth docutils literal notranslate"><span class="pre">waitall()</span></code></a> call does not return! The DAGPool instance
@@ -306,8 +308,8 @@ which other keys it’s waiting for.)</p>
</div>
<p>Even if this is the last method call on this DAGPool instance, it should
unblock all the rest of the DAGPool greenthreads.</p>
-</div>
-<div class="section" id="posting">
+</section>
+<section id="posting">
<h3>Posting<a class="headerlink" href="#posting" title="Permalink to this headline">¶</a></h3>
<p>If we happen to have zlib build results in hand already, though, we could
instead <a class="reference internal" href="#eventlet.dagpool.DAGPool.post" title="eventlet.dagpool.DAGPool.post"><code class="xref py py-meth docutils literal notranslate"><span class="pre">post()</span></code></a> that result instead of
@@ -316,8 +318,8 @@ rebuilding the library:</p>
</pre></div>
</div>
<p>This, too, should unblock the rest of the DAGPool greenthreads.</p>
-</div>
-<div class="section" id="preloading">
+</section>
+<section id="preloading">
<h3>Preloading<a class="headerlink" href="#preloading" title="Permalink to this headline">¶</a></h3>
<p>If rebuilding takes nontrivial realtime, it might be useful to record partial
results, so that in case of interruption you can restart from where you left
@@ -331,8 +333,8 @@ prior results into a new DAGPool instance; alternatively you can
<p>Any DAGPool greenthreads that depend on either a or zlib can immediately
consume those results.</p>
<p>It also works to construct DAGPool with an iterable of (key, result) pairs.</p>
-</div>
-<div class="section" id="exception-propagation">
+</section>
+<section id="exception-propagation">
<h3>Exception Propagation<a class="headerlink" href="#exception-propagation" title="Permalink to this headline">¶</a></h3>
<p>But what if we spawn a zlib build that fails? Suppose the zlib greenthread
terminates with an exception? In that case none of b, c, d or e can proceed!
@@ -372,8 +374,8 @@ failure if desired:</p>
<span class="n">orig_err</span> <span class="o">=</span> <span class="n">orig_err</span><span class="o">.</span><span class="n">exc</span>
</pre></div>
</div>
-</div>
-<div class="section" id="scanning-for-success-exceptions">
+</section>
+<section id="scanning-for-success-exceptions">
<h3>Scanning for Success / Exceptions<a class="headerlink" href="#scanning-for-success-exceptions" title="Permalink to this headline">¶</a></h3>
<p>Exception propagation means that we neither perform useless builds nor wait for
results that will never arrive.</p>
@@ -421,14 +423,14 @@ keys to report:</p>
<p>Both wait_each_success() and wait_each_exception() must wait until the
greenthreads for all specified keys (or all keys) have terminated, one way or
the other, because of course we can’t know until then how to categorize each.</p>
-</div>
-</div>
-</div>
-<div class="section" id="module-eventlet.dagpool">
+</section>
+</section>
+</section>
+<section id="module-eventlet.dagpool">
<span id="module-contents"></span><h1>Module Contents<a class="headerlink" href="#module-eventlet.dagpool" title="Permalink to this headline">¶</a></h1>
<dl class="py exception">
-<dt id="eventlet.dagpool.Collision">
-<em class="property">exception </em><code class="sig-prename descclassname">eventlet.dagpool.</code><code class="sig-name descname">Collision</code><a class="headerlink" href="#eventlet.dagpool.Collision" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.Collision">
+<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.dagpool.</span></span><span class="sig-name descname"><span class="pre">Collision</span></span><a class="headerlink" href="#eventlet.dagpool.Collision" title="Permalink to this definition">¶</a></dt>
<dd><p>DAGPool raises Collision when you try to launch two greenthreads with the
same key, or post() a result for a key corresponding to a greenthread, or
post() twice for the same key. As with KeyError, str(collision) names the
@@ -436,8 +438,8 @@ key in question.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.dagpool.DAGPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.dagpool.</code><code class="sig-name descname">DAGPool</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">preload</span><span class="o">=</span><span class="default_value">{}</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.dagpool.</span></span><span class="sig-name descname"><span class="pre">DAGPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">preload</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">{}</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool" title="Permalink to this definition">¶</a></dt>
<dd><p>A DAGPool is a pool that constrains greenthreads, not by max concurrency,
but by data dependencies.</p>
<p>This is a way to implement general DAG dependencies. A simple dependency
@@ -482,49 +484,49 @@ of that exception through the DAG of greenthreads.</p>
in a <a class="reference internal" href="greenpool.html#eventlet.greenpool.GreenPool" title="eventlet.greenpool.GreenPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenPool</span></code></a>: it may be hard to
provably avoid deadlock.</p>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">preload</span><span class="o">=</span><span class="default_value">{}</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.__init__" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.__init__">
+<span class="sig-name descname"><span class="pre">__init__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">preload</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">{}</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.__init__" title="Permalink to this definition">¶</a></dt>
<dd><p>DAGPool can be prepopulated with an initial dict or iterable of (key,
value) pairs. These (key, value) pairs are of course immediately
available for any greenthread that depends on any of those keys.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.__getitem__">
-<code class="sig-name descname">__getitem__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.__getitem__" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.__getitem__">
+<span class="sig-name descname"><span class="pre">__getitem__</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.__getitem__" title="Permalink to this definition">¶</a></dt>
<dd><p>__getitem__(key) (aka dagpool[key]) blocks until <em>key</em> has a value,
then delivers that value.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.get">
-<code class="sig-name descname">get</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">default</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.get" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.get" title="Permalink to this definition">¶</a></dt>
<dd><p>get() returns the value for <em>key</em>. If <em>key</em> does not yet have a value,
get() returns <em>default</em>.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.items">
-<code class="sig-name descname">items</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.items" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.items">
+<span class="sig-name descname"><span class="pre">items</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.items" title="Permalink to this definition">¶</a></dt>
<dd><p>Return a snapshot tuple of currently-available (key, value) pairs.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.keys">
-<code class="sig-name descname">keys</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.keys" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.keys">
+<span class="sig-name descname"><span class="pre">keys</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.keys" title="Permalink to this definition">¶</a></dt>
<dd><p>Return a snapshot tuple of keys for which we currently have values.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.kill">
-<code class="sig-name descname">kill</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.kill" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.kill">
+<span class="sig-name descname"><span class="pre">kill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.kill" title="Permalink to this definition">¶</a></dt>
<dd><p>Kill the greenthread that was spawned with the specified <em>key</em>.</p>
<p>If no such greenthread was spawned, raise KeyError.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.post">
-<code class="sig-name descname">post</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">value</span></em>, <em class="sig-param"><span class="n">replace</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.post" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.post">
+<span class="sig-name descname"><span class="pre">post</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">value</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replace</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.post" title="Permalink to this definition">¶</a></dt>
<dd><p>post(key, value) stores the passed <em>value</em> for the passed <em>key</em>. It
then causes each greenthread blocked on its results iterable, or on
<a class="reference internal" href="#eventlet.dagpool.DAGPool.wait_each" title="eventlet.dagpool.DAGPool.wait_each"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait_each(keys)</span></code></a>, to check for new values.
@@ -559,24 +561,24 @@ raise that PropagateError instance.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.running">
-<code class="sig-name descname">running</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.running" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.running">
+<span class="sig-name descname"><span class="pre">running</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.running" title="Permalink to this definition">¶</a></dt>
<dd><p>Return number of running DAGPool greenthreads. This includes
greenthreads blocked while iterating through their <em>results</em> iterable,
that is, greenthreads waiting on values from other keys.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.running_keys">
-<code class="sig-name descname">running_keys</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.running_keys" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.running_keys">
+<span class="sig-name descname"><span class="pre">running_keys</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.running_keys" title="Permalink to this definition">¶</a></dt>
<dd><p>Return keys for running DAGPool greenthreads. This includes
greenthreads blocked while iterating through their <em>results</em> iterable,
that is, greenthreads waiting on values from other keys.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.spawn">
-<code class="sig-name descname">spawn</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">depends</span></em>, <em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwds</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.spawn" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.spawn">
+<span class="sig-name descname"><span class="pre">spawn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">depends</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwds</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.spawn" title="Permalink to this definition">¶</a></dt>
<dd><p>Launch the passed <em>function(key, results, …)</em> as a greenthread,
passing it:</p>
<ul class="simple">
@@ -602,8 +604,8 @@ raises <a class="reference internal" href="#eventlet.dagpool.Collision" title="e
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.spawn_many">
-<code class="sig-name descname">spawn_many</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">depends</span></em>, <em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwds</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.spawn_many" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.spawn_many">
+<span class="sig-name descname"><span class="pre">spawn_many</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">depends</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwds</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.spawn_many" title="Permalink to this definition">¶</a></dt>
<dd><p>spawn_many() accepts a single <em>function</em> whose parameters are the same
as for <a class="reference internal" href="#eventlet.dagpool.DAGPool.spawn" title="eventlet.dagpool.DAGPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a>.</p>
<p>The difference is that spawn_many() accepts a dependency dict
@@ -617,8 +619,8 @@ successfully spawned greenthreads.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.wait">
-<code class="sig-name descname">wait</code><span class="sig-paren">(</span><em class="sig-param">keys=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.wait">
+<span class="sig-name descname"><span class="pre">wait</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">keys=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait" title="Permalink to this definition">¶</a></dt>
<dd><p><em>keys</em> is an optional iterable of keys. If you omit the argument, it
waits for all the keys from <a class="reference internal" href="#eventlet.dagpool.DAGPool" title="eventlet.dagpool.DAGPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">preload</span> <span class="pre">data</span></code></a>, from
<a class="reference internal" href="#eventlet.dagpool.DAGPool.post" title="eventlet.dagpool.DAGPool.post"><code class="xref py py-meth docutils literal notranslate"><span class="pre">post()</span></code></a> calls and from <a class="reference internal" href="#eventlet.dagpool.DAGPool.spawn" title="eventlet.dagpool.DAGPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a> calls: in other words, all
@@ -638,8 +640,8 @@ posts PropagateError, it is indeterminate which one wait() will raise.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.wait_each">
-<code class="sig-name descname">wait_each</code><span class="sig-paren">(</span><em class="sig-param">keys=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.wait_each">
+<span class="sig-name descname"><span class="pre">wait_each</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">keys=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each" title="Permalink to this definition">¶</a></dt>
<dd><p><em>keys</em> is an optional iterable of keys. If you omit the argument, it
waits for all the keys from <a class="reference internal" href="#eventlet.dagpool.DAGPool" title="eventlet.dagpool.DAGPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">preload</span> <span class="pre">data</span></code></a>, from
<a class="reference internal" href="#eventlet.dagpool.DAGPool.post" title="eventlet.dagpool.DAGPool.post"><code class="xref py py-meth docutils literal notranslate"><span class="pre">post()</span></code></a> calls and from <a class="reference internal" href="#eventlet.dagpool.DAGPool.spawn" title="eventlet.dagpool.DAGPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a> calls: in other words, all
@@ -670,8 +672,8 @@ generator raises that PropagateError instead of yielding it.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.wait_each_exception">
-<code class="sig-name descname">wait_each_exception</code><span class="sig-paren">(</span><em class="sig-param">keys=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each_exception" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.wait_each_exception">
+<span class="sig-name descname"><span class="pre">wait_each_exception</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">keys=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each_exception" title="Permalink to this definition">¶</a></dt>
<dd><p>wait_each_exception() filters results so that only exceptions are
yielded. Not every provided (or defaulted) key will necessarily be
represented, though naturally the generator will not finish until
@@ -682,8 +684,8 @@ all have completed.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.wait_each_success">
-<code class="sig-name descname">wait_each_success</code><span class="sig-paren">(</span><em class="sig-param">keys=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each_success" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.wait_each_success">
+<span class="sig-name descname"><span class="pre">wait_each_success</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">keys=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.wait_each_success" title="Permalink to this definition">¶</a></dt>
<dd><p>wait_each_success() filters results so that only success values are
yielded. In other words, unlike <a class="reference internal" href="#eventlet.dagpool.DAGPool.wait_each" title="eventlet.dagpool.DAGPool.wait_each"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait_each()</span></code></a>, wait_each_success()
will not raise <a class="reference internal" href="#eventlet.dagpool.PropagateError" title="eventlet.dagpool.PropagateError"><code class="xref py py-class docutils literal notranslate"><span class="pre">PropagateError</span></code></a>. Not every provided (or
@@ -693,8 +695,8 @@ generator will not finish until all have completed.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.waitall">
-<code class="sig-name descname">waitall</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waitall" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.waitall">
+<span class="sig-name descname"><span class="pre">waitall</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waitall" title="Permalink to this definition">¶</a></dt>
<dd><p>waitall() blocks the calling greenthread until there is a value for
every DAGPool greenthread launched by <a class="reference internal" href="#eventlet.dagpool.DAGPool.spawn" title="eventlet.dagpool.DAGPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a>. It returns a dict
containing all <a class="reference internal" href="#eventlet.dagpool.DAGPool" title="eventlet.dagpool.DAGPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">preload</span> <span class="pre">data</span></code></a>, all data from
@@ -703,8 +705,8 @@ containing all <a class="reference internal" href="#eventlet.dagpool.DAGPool" ti
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.waiting">
-<code class="sig-name descname">waiting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waiting" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.waiting">
+<span class="sig-name descname"><span class="pre">waiting</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waiting" title="Permalink to this definition">¶</a></dt>
<dd><p>Return number of waiting DAGPool greenthreads, that is, greenthreads
still waiting on values from other keys. This explicitly does <em>not</em>
include external greenthreads waiting on <a class="reference internal" href="#eventlet.dagpool.DAGPool.wait" title="eventlet.dagpool.DAGPool.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a>,
@@ -712,8 +714,8 @@ include external greenthreads waiting on <a class="reference internal" href="#ev
</dd></dl>
<dl class="py method">
-<dt id="eventlet.dagpool.DAGPool.waiting_for">
-<code class="sig-name descname">waiting_for</code><span class="sig-paren">(</span><em class="sig-param">key=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waiting_for" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.DAGPool.waiting_for">
+<span class="sig-name descname"><span class="pre">waiting_for</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">key=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.DAGPool.waiting_for" title="Permalink to this definition">¶</a></dt>
<dd><p>waiting_for(key) returns a set() of the keys for which the DAGPool
greenthread spawned with that <em>key</em> is still waiting. If you pass a
<em>key</em> for which no greenthread was spawned, waiting_for() raises
@@ -730,8 +732,8 @@ waiting on keys for which there is no greenthread and no <a class="reference int
</dd></dl>
<dl class="py exception">
-<dt id="eventlet.dagpool.PropagateError">
-<em class="property">exception </em><code class="sig-prename descclassname">eventlet.dagpool.</code><code class="sig-name descname">PropagateError</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="n">exc</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.PropagateError" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.dagpool.PropagateError">
+<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.dagpool.</span></span><span class="sig-name descname"><span class="pre">PropagateError</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">key</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exc</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.dagpool.PropagateError" title="Permalink to this definition">¶</a></dt>
<dd><p>When a DAGPool greenthread terminates with an exception instead of
returning a result, attempting to retrieve its value raises
PropagateError.</p>
@@ -744,9 +746,10 @@ PropagateError.</p>
</dl>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -787,7 +790,7 @@ PropagateError.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -812,14 +815,15 @@ PropagateError.</p>
<li class="right" >
<a href="corolocal.html" title="corolocal – Coroutine local storage"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">dagpool</span></code> – Dependency-Driven Greenthreads</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/db_pool.html b/doc/modules/db_pool.html
index e8b7992..7bcf458 100644
--- a/doc/modules/db_pool.html
+++ b/doc/modules/db_pool.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>db_pool – DBAPI 2 database connection pooling &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>db_pool – DBAPI 2 database connection pooling &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="debug.html" title="debug – Debugging tools for Eventlet"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">db_pool</span></code> – DBAPI 2 database connection pooling</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="db-pool-dbapi-2-database-connection-pooling">
+ <section id="db-pool-dbapi-2-database-connection-pooling">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">db_pool</span></code> – DBAPI 2 database connection pooling<a class="headerlink" href="#db-pool-dbapi-2-database-connection-pooling" title="Permalink to this headline">¶</a></h1>
<p>The db_pool module is useful for managing database connections. It provides three primary benefits: cooperative yielding during database operations, concurrency limiting to a database host, and connection reuse. db_pool is intended to be database-agnostic, compatible with any DB-API 2.0 database module.</p>
<p><em>It has currently been tested and used with both MySQLdb and psycopg2.</em></p>
@@ -66,7 +68,7 @@
</pre></div>
</div>
<p>After you’ve returned a connection object to the pool, it becomes useless and will raise exceptions if any of its methods are called.</p>
-<div class="section" id="constructor-arguments">
+<section id="constructor-arguments">
<h2>Constructor Arguments<a class="headerlink" href="#constructor-arguments" title="Permalink to this headline">¶</a></h2>
<p>In addition to the database credentials, there are a bunch of keyword constructor arguments to the ConnectionPool that are useful.</p>
<ul class="simple">
@@ -75,8 +77,8 @@
<li><p>max_age : The lifespan of a connection. This works much like max_idle, but the timer is measured from the connection’s creation time, and is tracked throughout the connection’s life. This means that if you take a connection out of the pool and hold on to it for some lengthy operation that exceeds max_age, upon putting the connection back in to the pool, it will be closed. Like max_idle, max_age will not close connections that are taken out of the pool, and, if set to 0, will cause every connection to be closed when put back in the pool.</p></li>
<li><p>connect_timeout : How long to wait before raising an exception on connect(). If the database module’s connect() method takes too long, it raises a ConnectTimeout exception from the get() method on the pool.</p></li>
</ul>
-</div>
-<div class="section" id="databaseconnector">
+</section>
+<section id="databaseconnector">
<h2>DatabaseConnector<a class="headerlink" href="#databaseconnector" title="Permalink to this headline">¶</a></h2>
<p>If you want to connect to multiple databases easily (and who doesn’t), the DatabaseConnector is for you. It’s a pool of pools, containing a ConnectionPool for every host you connect to.</p>
<p>The constructor arguments are:</p>
@@ -96,25 +98,25 @@
<p>The rest of the arguments to the DatabaseConnector constructor are passed on to the ConnectionPool.</p>
<p><em>Caveat: The DatabaseConnector is a bit unfinished, it only suits a subset of use cases.</em></p>
<span class="target" id="module-eventlet.db_pool"></span><dl class="py class">
-<dt id="eventlet.db_pool.BaseConnectionPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">BaseConnectionPool</code><span class="sig-paren">(</span><em class="sig-param">db_module</em>, <em class="sig-param">min_size=0</em>, <em class="sig-param">max_size=4</em>, <em class="sig-param">max_idle=10</em>, <em class="sig-param">max_age=30</em>, <em class="sig-param">connect_timeout=5</em>, <em class="sig-param">cleanup=&lt;function cleanup_rollback&gt;</em>, <em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.BaseConnectionPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">BaseConnectionPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">db_module</span></em>, <em class="sig-param"><span class="pre">min_size=0</span></em>, <em class="sig-param"><span class="pre">max_size=4</span></em>, <em class="sig-param"><span class="pre">max_idle=10</span></em>, <em class="sig-param"><span class="pre">max_age=30</span></em>, <em class="sig-param"><span class="pre">connect_timeout=5</span></em>, <em class="sig-param"><span class="pre">cleanup=&lt;function</span> <span class="pre">cleanup_rollback&gt;</span></em>, <em class="sig-param"><span class="pre">*args</span></em>, <em class="sig-param"><span class="pre">**kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool" title="Permalink to this definition">¶</a></dt>
<dd><dl class="py method">
-<dt id="eventlet.db_pool.BaseConnectionPool.clear">
-<code class="sig-name descname">clear</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.clear" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.BaseConnectionPool.clear">
+<span class="sig-name descname"><span class="pre">clear</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.clear" title="Permalink to this definition">¶</a></dt>
<dd><p>Close all connections that this pool still holds a reference to,
and removes all references to them.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.BaseConnectionPool.get">
-<code class="sig-name descname">get</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.get" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.BaseConnectionPool.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.get" title="Permalink to this definition">¶</a></dt>
<dd><p>Return an item from the pool, when one is available. This may
cause the calling greenthread to block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.BaseConnectionPool.item">
-<code class="sig-name descname">item</code><span class="sig-paren">(</span><em class="sig-param">cleanup=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.item" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.BaseConnectionPool.item">
+<span class="sig-name descname"><span class="pre">item</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">cleanup=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.item" title="Permalink to this definition">¶</a></dt>
<dd><p>Get an object out of the pool, for use with with statement.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">eventlet</span> <span class="kn">import</span> <span class="n">pools</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pool</span> <span class="o">=</span> <span class="n">pools</span><span class="o">.</span><span class="n">TokenPool</span><span class="p">(</span><span class="n">max_size</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
@@ -129,8 +131,8 @@ cause the calling greenthread to block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.BaseConnectionPool.put">
-<code class="sig-name descname">put</code><span class="sig-paren">(</span><em class="sig-param">conn</em>, <em class="sig-param">cleanup=&lt;object object&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.put" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.BaseConnectionPool.put">
+<span class="sig-name descname"><span class="pre">put</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">conn</span></em>, <em class="sig-param"><span class="pre">cleanup=&lt;object</span> <span class="pre">object&gt;</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.BaseConnectionPool.put" title="Permalink to this definition">¶</a></dt>
<dd><p>Put an item back into the pool, when done. This may
cause the putting greenthread to block.</p>
</dd></dl>
@@ -138,209 +140,209 @@ cause the putting greenthread to block.</p>
</dd></dl>
<dl class="py exception">
-<dt id="eventlet.db_pool.ConnectTimeout">
-<em class="property">exception </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">ConnectTimeout</code><a class="headerlink" href="#eventlet.db_pool.ConnectTimeout" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.ConnectTimeout">
+<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">ConnectTimeout</span></span><a class="headerlink" href="#eventlet.db_pool.ConnectTimeout" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py attribute">
-<dt id="eventlet.db_pool.ConnectionPool">
-<code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">ConnectionPool</code><a class="headerlink" href="#eventlet.db_pool.ConnectionPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.ConnectionPool">
+<span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">ConnectionPool</span></span><a class="headerlink" href="#eventlet.db_pool.ConnectionPool" title="Permalink to this definition">¶</a></dt>
<dd><p>alias of <a class="reference internal" href="#eventlet.db_pool.TpooledConnectionPool" title="eventlet.db_pool.TpooledConnectionPool"><code class="xref py py-class docutils literal notranslate"><span class="pre">eventlet.db_pool.TpooledConnectionPool</span></code></a></p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.db_pool.DatabaseConnector">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">DatabaseConnector</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">module</span></em>, <em class="sig-param"><span class="n">credentials</span></em>, <em class="sig-param"><span class="n">conn_pool</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.DatabaseConnector">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">DatabaseConnector</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">module</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">credentials</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">conn_pool</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector" title="Permalink to this definition">¶</a></dt>
<dd><p>This is an object which will maintain a collection of database
connection pools on a per-host basis.</p>
<dl class="py method">
-<dt id="eventlet.db_pool.DatabaseConnector.credentials_for">
-<code class="sig-name descname">credentials_for</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">host</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector.credentials_for" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.DatabaseConnector.credentials_for">
+<span class="sig-name descname"><span class="pre">credentials_for</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector.credentials_for" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.DatabaseConnector.get">
-<code class="sig-name descname">get</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">host</span></em>, <em class="sig-param"><span class="n">dbname</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector.get" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.DatabaseConnector.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dbname</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.DatabaseConnector.get" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns a ConnectionPool to the target host and schema.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.db_pool.GenericConnectionWrapper">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">GenericConnectionWrapper</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">baseconn</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">GenericConnectionWrapper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">baseconn</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper" title="Permalink to this definition">¶</a></dt>
<dd><dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.affected_rows">
-<code class="sig-name descname">affected_rows</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.affected_rows" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.affected_rows">
+<span class="sig-name descname"><span class="pre">affected_rows</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.affected_rows" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.autocommit">
-<code class="sig-name descname">autocommit</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.autocommit" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.autocommit">
+<span class="sig-name descname"><span class="pre">autocommit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.autocommit" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.begin">
-<code class="sig-name descname">begin</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.begin" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.begin">
+<span class="sig-name descname"><span class="pre">begin</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.begin" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.change_user">
-<code class="sig-name descname">change_user</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.change_user" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.change_user">
+<span class="sig-name descname"><span class="pre">change_user</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.change_user" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.character_set_name">
-<code class="sig-name descname">character_set_name</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.character_set_name" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.character_set_name">
+<span class="sig-name descname"><span class="pre">character_set_name</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.character_set_name" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.close">
-<code class="sig-name descname">close</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.close" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.close">
+<span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.close" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.commit">
-<code class="sig-name descname">commit</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.commit" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.commit">
+<span class="sig-name descname"><span class="pre">commit</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.commit" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.cursor">
-<code class="sig-name descname">cursor</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.cursor" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.cursor">
+<span class="sig-name descname"><span class="pre">cursor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.cursor" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.dump_debug_info">
-<code class="sig-name descname">dump_debug_info</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.dump_debug_info" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.dump_debug_info">
+<span class="sig-name descname"><span class="pre">dump_debug_info</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.dump_debug_info" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.errno">
-<code class="sig-name descname">errno</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.errno" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.errno">
+<span class="sig-name descname"><span class="pre">errno</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.errno" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.error">
-<code class="sig-name descname">error</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.error" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.error">
+<span class="sig-name descname"><span class="pre">error</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.error" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.errorhandler">
-<code class="sig-name descname">errorhandler</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.errorhandler" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.errorhandler">
+<span class="sig-name descname"><span class="pre">errorhandler</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.errorhandler" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.insert_id">
-<code class="sig-name descname">insert_id</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.insert_id" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.insert_id">
+<span class="sig-name descname"><span class="pre">insert_id</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.insert_id" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.literal">
-<code class="sig-name descname">literal</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.literal" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.literal">
+<span class="sig-name descname"><span class="pre">literal</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.literal" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.ping">
-<code class="sig-name descname">ping</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.ping" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.ping">
+<span class="sig-name descname"><span class="pre">ping</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.ping" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.query">
-<code class="sig-name descname">query</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.query" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.query">
+<span class="sig-name descname"><span class="pre">query</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.query" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.rollback">
-<code class="sig-name descname">rollback</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.rollback" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.rollback">
+<span class="sig-name descname"><span class="pre">rollback</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.rollback" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.select_db">
-<code class="sig-name descname">select_db</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.select_db" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.select_db">
+<span class="sig-name descname"><span class="pre">select_db</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.select_db" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.server_capabilities">
-<code class="sig-name descname">server_capabilities</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.server_capabilities" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.server_capabilities">
+<span class="sig-name descname"><span class="pre">server_capabilities</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.server_capabilities" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.set_character_set">
-<code class="sig-name descname">set_character_set</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_character_set" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.set_character_set">
+<span class="sig-name descname"><span class="pre">set_character_set</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_character_set" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.set_isolation_level">
-<code class="sig-name descname">set_isolation_level</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_isolation_level" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.set_isolation_level">
+<span class="sig-name descname"><span class="pre">set_isolation_level</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_isolation_level" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.set_server_option">
-<code class="sig-name descname">set_server_option</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_server_option" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.set_server_option">
+<span class="sig-name descname"><span class="pre">set_server_option</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_server_option" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.set_sql_mode">
-<code class="sig-name descname">set_sql_mode</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_sql_mode" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.set_sql_mode">
+<span class="sig-name descname"><span class="pre">set_sql_mode</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.set_sql_mode" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.show_warnings">
-<code class="sig-name descname">show_warnings</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.show_warnings" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.show_warnings">
+<span class="sig-name descname"><span class="pre">show_warnings</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.show_warnings" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.shutdown">
-<code class="sig-name descname">shutdown</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.shutdown" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.shutdown">
+<span class="sig-name descname"><span class="pre">shutdown</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.shutdown" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.sqlstate">
-<code class="sig-name descname">sqlstate</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.sqlstate" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.sqlstate">
+<span class="sig-name descname"><span class="pre">sqlstate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.sqlstate" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.stat">
-<code class="sig-name descname">stat</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.stat" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.stat">
+<span class="sig-name descname"><span class="pre">stat</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.stat" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.store_result">
-<code class="sig-name descname">store_result</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.store_result" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.store_result">
+<span class="sig-name descname"><span class="pre">store_result</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.store_result" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.string_literal">
-<code class="sig-name descname">string_literal</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.string_literal" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.string_literal">
+<span class="sig-name descname"><span class="pre">string_literal</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.string_literal" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.thread_id">
-<code class="sig-name descname">thread_id</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.thread_id" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.thread_id">
+<span class="sig-name descname"><span class="pre">thread_id</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.thread_id" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.use_result">
-<code class="sig-name descname">use_result</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.use_result" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.use_result">
+<span class="sig-name descname"><span class="pre">use_result</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.use_result" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.GenericConnectionWrapper.warning_count">
-<code class="sig-name descname">warning_count</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.warning_count" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.GenericConnectionWrapper.warning_count">
+<span class="sig-name descname"><span class="pre">warning_count</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.GenericConnectionWrapper.warning_count" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.db_pool.PooledConnectionWrapper">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">PooledConnectionWrapper</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">baseconn</span></em>, <em class="sig-param"><span class="n">pool</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.PooledConnectionWrapper" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.PooledConnectionWrapper">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">PooledConnectionWrapper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">baseconn</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pool</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.PooledConnectionWrapper" title="Permalink to this definition">¶</a></dt>
<dd><p>A connection wrapper where:
- the close method returns the connection to the pool instead of closing it directly
- <code class="docutils literal notranslate"><span class="pre">bool(conn)</span></code> returns a reasonable value
- returns itself to the pool if it gets garbage collected</p>
<dl class="py method">
-<dt id="eventlet.db_pool.PooledConnectionWrapper.close">
-<code class="sig-name descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.PooledConnectionWrapper.close" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.PooledConnectionWrapper.close">
+<span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.PooledConnectionWrapper.close" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the connection to the pool, and remove the
reference to it so that you can’t use it again through this
wrapper object.</p>
@@ -349,17 +351,17 @@ wrapper object.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.db_pool.RawConnectionPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">RawConnectionPool</code><span class="sig-paren">(</span><em class="sig-param">db_module</em>, <em class="sig-param">min_size=0</em>, <em class="sig-param">max_size=4</em>, <em class="sig-param">max_idle=10</em>, <em class="sig-param">max_age=30</em>, <em class="sig-param">connect_timeout=5</em>, <em class="sig-param">cleanup=&lt;function cleanup_rollback&gt;</em>, <em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.RawConnectionPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">RawConnectionPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">db_module</span></em>, <em class="sig-param"><span class="pre">min_size=0</span></em>, <em class="sig-param"><span class="pre">max_size=4</span></em>, <em class="sig-param"><span class="pre">max_idle=10</span></em>, <em class="sig-param"><span class="pre">max_age=30</span></em>, <em class="sig-param"><span class="pre">connect_timeout=5</span></em>, <em class="sig-param"><span class="pre">cleanup=&lt;function</span> <span class="pre">cleanup_rollback&gt;</span></em>, <em class="sig-param"><span class="pre">*args</span></em>, <em class="sig-param"><span class="pre">**kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool" title="Permalink to this definition">¶</a></dt>
<dd><p>A pool which gives out plain database connections.</p>
<dl class="py method">
-<dt id="eventlet.db_pool.RawConnectionPool.connect">
-<em class="property">classmethod </em><code class="sig-name descname">connect</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">db_module</span></em>, <em class="sig-param"><span class="n">connect_timeout</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool.connect" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.RawConnectionPool.connect">
+<em class="property"><span class="pre">classmethod</span> </em><span class="sig-name descname"><span class="pre">connect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">db_module</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">connect_timeout</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool.connect" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.RawConnectionPool.create">
-<code class="sig-name descname">create</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool.create" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.RawConnectionPool.create">
+<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.RawConnectionPool.create" title="Permalink to this definition">¶</a></dt>
<dd><p>Generate a new pool item. In order for the pool to
function, either this method must be overriden in a subclass
or the pool must be constructed with the <cite>create</cite> argument.
@@ -377,18 +379,18 @@ called a second time.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.db_pool.TpooledConnectionPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">TpooledConnectionPool</code><span class="sig-paren">(</span><em class="sig-param">db_module</em>, <em class="sig-param">min_size=0</em>, <em class="sig-param">max_size=4</em>, <em class="sig-param">max_idle=10</em>, <em class="sig-param">max_age=30</em>, <em class="sig-param">connect_timeout=5</em>, <em class="sig-param">cleanup=&lt;function cleanup_rollback&gt;</em>, <em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.TpooledConnectionPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">TpooledConnectionPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">db_module</span></em>, <em class="sig-param"><span class="pre">min_size=0</span></em>, <em class="sig-param"><span class="pre">max_size=4</span></em>, <em class="sig-param"><span class="pre">max_idle=10</span></em>, <em class="sig-param"><span class="pre">max_age=30</span></em>, <em class="sig-param"><span class="pre">connect_timeout=5</span></em>, <em class="sig-param"><span class="pre">cleanup=&lt;function</span> <span class="pre">cleanup_rollback&gt;</span></em>, <em class="sig-param"><span class="pre">*args</span></em>, <em class="sig-param"><span class="pre">**kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool" title="Permalink to this definition">¶</a></dt>
<dd><p>A pool which gives out <a class="reference internal" href="../threading.html#eventlet.tpool.Proxy" title="eventlet.tpool.Proxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">Proxy</span></code></a>-based database
connections.</p>
<dl class="py method">
-<dt id="eventlet.db_pool.TpooledConnectionPool.connect">
-<em class="property">classmethod </em><code class="sig-name descname">connect</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">db_module</span></em>, <em class="sig-param"><span class="n">connect_timeout</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool.connect" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.TpooledConnectionPool.connect">
+<em class="property"><span class="pre">classmethod</span> </em><span class="sig-name descname"><span class="pre">connect</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">db_module</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">connect_timeout</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool.connect" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="py method">
-<dt id="eventlet.db_pool.TpooledConnectionPool.create">
-<code class="sig-name descname">create</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool.create" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.TpooledConnectionPool.create">
+<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.TpooledConnectionPool.create" title="Permalink to this definition">¶</a></dt>
<dd><p>Generate a new pool item. In order for the pool to
function, either this method must be overriden in a subclass
or the pool must be constructed with the <cite>create</cite> argument.
@@ -406,14 +408,15 @@ called a second time.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.db_pool.cleanup_rollback">
-<code class="sig-prename descclassname">eventlet.db_pool.</code><code class="sig-name descname">cleanup_rollback</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">conn</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.cleanup_rollback" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.db_pool.cleanup_rollback">
+<span class="sig-prename descclassname"><span class="pre">eventlet.db_pool.</span></span><span class="sig-name descname"><span class="pre">cleanup_rollback</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">conn</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.db_pool.cleanup_rollback" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -445,7 +448,7 @@ called a second time.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -470,14 +473,15 @@ called a second time.</p>
<li class="right" >
<a href="debug.html" title="debug – Debugging tools for Eventlet"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">db_pool</span></code> – DBAPI 2 database connection pooling</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/debug.html b/doc/modules/debug.html
index ae8ba12..e91b636 100644
--- a/doc/modules/debug.html
+++ b/doc/modules/debug.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>debug – Debugging tools for Eventlet &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>debug – Debugging tools for Eventlet &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="dagpool.html" title="dagpool – Dependency-Driven Greenthreads"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">debug</span></code> – Debugging tools for Eventlet</a></li>
</ul>
</div>
@@ -44,67 +46,63 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.debug">
+ <section id="module-eventlet.debug">
<span id="debug-debugging-tools-for-eventlet"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">debug</span></code> – Debugging tools for Eventlet<a class="headerlink" href="#module-eventlet.debug" title="Permalink to this headline">¶</a></h1>
<p>The debug module contains utilities and functions for better
debugging Eventlet-powered applications.</p>
<dl class="py function">
-<dt id="eventlet.debug.spew">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">spew</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">trace_names</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">show_values</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.spew" title="Permalink to this definition">¶</a></dt>
-<dd><p>Install a trace hook which writes incredibly detailed logs
-about what code is being executed to stdout.</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="eventlet.debug.unspew">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">unspew</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.unspew" title="Permalink to this definition">¶</a></dt>
-<dd><p>Remove the trace hook installed by spew.</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="eventlet.debug.format_hub_listeners">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">format_hub_listeners</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.format_hub_listeners" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.debug.format_hub_listeners">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">format_hub_listeners</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.format_hub_listeners" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns a formatted string of the current listeners on the current
hub. This can be useful in determining what’s going on in the event system,
especially when used in conjunction with <a class="reference internal" href="#eventlet.debug.hub_listener_stacks" title="eventlet.debug.hub_listener_stacks"><code class="xref py py-func docutils literal notranslate"><span class="pre">hub_listener_stacks()</span></code></a>.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.format_hub_timers">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">format_hub_timers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.format_hub_timers" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.debug.format_hub_timers">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">format_hub_timers</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.format_hub_timers" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns a formatted string of the current timers on the current
hub. This can be useful in determining what’s going on in the event system,
especially when used in conjunction with <a class="reference internal" href="#eventlet.debug.hub_timer_stacks" title="eventlet.debug.hub_timer_stacks"><code class="xref py py-func docutils literal notranslate"><span class="pre">hub_timer_stacks()</span></code></a>.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.hub_listener_stacks">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">hub_listener_stacks</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_listener_stacks" title="Permalink to this definition">¶</a></dt>
-<dd><p>Toggles whether or not the hub records the stack when clients register
-listeners on file descriptors. This can be useful when trying to figure
-out what the hub is up to at any given moment. To inspect the stacks
-of the current listeners, call <a class="reference internal" href="#eventlet.debug.format_hub_listeners" title="eventlet.debug.format_hub_listeners"><code class="xref py py-func docutils literal notranslate"><span class="pre">format_hub_listeners()</span></code></a> at critical
-junctures in the application logic.</p>
+<dt class="sig sig-object py" id="eventlet.debug.hub_blocking_detection">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">hub_blocking_detection</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_blocking_detection" title="Permalink to this definition">¶</a></dt>
+<dd><p>Toggles whether Eventlet makes an effort to detect blocking
+behavior in an application.</p>
+<p>It does this by telling the kernel to raise a SIGALARM after a
+short timeout, and clearing the timeout every time the hub
+greenlet is resumed. Therefore, any code that runs for a long
+time without yielding to the hub will get interrupted by the
+blocking detector (don’t use it in production!).</p>
+<p>The <em>resolution</em> argument governs how long the SIGALARM timeout
+waits in seconds. The implementation uses <a class="reference external" href="https://docs.python.org/3/library/signal.html#signal.setitimer" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.setitimer()</span></code></a>
+and can be specified as a floating-point value.
+The shorter the resolution, the greater the chance of false
+positives.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.hub_exceptions">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">hub_exceptions</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_exceptions" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.debug.hub_exceptions">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">hub_exceptions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_exceptions" title="Permalink to this definition">¶</a></dt>
<dd><p>Toggles whether the hub prints exceptions that are raised from its
timers. This can be useful to see how greenthreads are terminating.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.tpool_exceptions">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">tpool_exceptions</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.tpool_exceptions" title="Permalink to this definition">¶</a></dt>
-<dd><p>Toggles whether tpool itself prints exceptions that are raised from
-functions that are executed in it, in addition to raising them like
-it normally does.</p>
+<dt class="sig sig-object py" id="eventlet.debug.hub_listener_stacks">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">hub_listener_stacks</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_listener_stacks" title="Permalink to this definition">¶</a></dt>
+<dd><p>Toggles whether or not the hub records the stack when clients register
+listeners on file descriptors. This can be useful when trying to figure
+out what the hub is up to at any given moment. To inspect the stacks
+of the current listeners, call <a class="reference internal" href="#eventlet.debug.format_hub_listeners" title="eventlet.debug.format_hub_listeners"><code class="xref py py-func docutils literal notranslate"><span class="pre">format_hub_listeners()</span></code></a> at critical
+junctures in the application logic.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.hub_prevent_multiple_readers">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">hub_prevent_multiple_readers</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_prevent_multiple_readers" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.debug.hub_prevent_multiple_readers">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">hub_prevent_multiple_readers</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_prevent_multiple_readers" title="Permalink to this definition">¶</a></dt>
<dd><p>Toggle prevention of multiple greenlets reading from a socket</p>
<p>When multiple greenlets read from the same socket it is often hard
to predict which greenlet will receive what data. To achieve
@@ -114,33 +112,38 @@ to <code class="docutils literal notranslate"><span class="pre">False</span></co
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.hub_timer_stacks">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">hub_timer_stacks</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_timer_stacks" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.debug.hub_timer_stacks">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">hub_timer_stacks</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_timer_stacks" title="Permalink to this definition">¶</a></dt>
<dd><p>Toggles whether or not the hub records the stack when timers are set.
To inspect the stacks of the current timers, call <a class="reference internal" href="#eventlet.debug.format_hub_timers" title="eventlet.debug.format_hub_timers"><code class="xref py py-func docutils literal notranslate"><span class="pre">format_hub_timers()</span></code></a>
at critical junctures in the application logic.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.debug.hub_blocking_detection">
-<code class="sig-prename descclassname">eventlet.debug.</code><code class="sig-name descname">hub_blocking_detection</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">state</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">resolution</span><span class="o">=</span><span class="default_value">1</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.hub_blocking_detection" title="Permalink to this definition">¶</a></dt>
-<dd><p>Toggles whether Eventlet makes an effort to detect blocking
-behavior in an application.</p>
-<p>It does this by telling the kernel to raise a SIGALARM after a
-short timeout, and clearing the timeout every time the hub
-greenlet is resumed. Therefore, any code that runs for a long
-time without yielding to the hub will get interrupted by the
-blocking detector (don’t use it in production!).</p>
-<p>The <em>resolution</em> argument governs how long the SIGALARM timeout
-waits in seconds. The implementation uses <a class="reference external" href="https://docs.python.org/3/library/signal.html#signal.setitimer" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.setitimer()</span></code></a>
-and can be specified as a floating-point value.
-The shorter the resolution, the greater the chance of false
-positives.</p>
+<dt class="sig sig-object py" id="eventlet.debug.spew">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">spew</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">trace_names</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">show_values</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.spew" title="Permalink to this definition">¶</a></dt>
+<dd><p>Install a trace hook which writes incredibly detailed logs
+about what code is being executed to stdout.</p>
</dd></dl>
-</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.debug.tpool_exceptions">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">tpool_exceptions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">state</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.tpool_exceptions" title="Permalink to this definition">¶</a></dt>
+<dd><p>Toggles whether tpool itself prints exceptions that are raised from
+functions that are executed in it, in addition to raising them like
+it normally does.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.debug.unspew">
+<span class="sig-prename descclassname"><span class="pre">eventlet.debug.</span></span><span class="sig-name descname"><span class="pre">unspew</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.debug.unspew" title="Permalink to this definition">¶</a></dt>
+<dd><p>Remove the trace hook installed by spew.</p>
+</dd></dl>
+
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -163,7 +166,7 @@ positives.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -188,14 +191,15 @@ positives.</p>
<li class="right" >
<a href="dagpool.html" title="dagpool – Dependency-Driven Greenthreads"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">debug</span></code> – Debugging tools for Eventlet</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/event.html b/doc/modules/event.html
index e0ca4d5..071b0af 100644
--- a/doc/modules/event.html
+++ b/doc/modules/event.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>event – Cross-greenthread primitive &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>event – Cross-greenthread primitive &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="db_pool.html" title="db_pool – DBAPI 2 database connection pooling"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">event</span></code> – Cross-greenthread primitive</a></li>
</ul>
</div>
@@ -44,11 +46,11 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.event">
+ <section id="module-eventlet.event">
<span id="event-cross-greenthread-primitive"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">event</span></code> – Cross-greenthread primitive<a class="headerlink" href="#module-eventlet.event" title="Permalink to this headline">¶</a></h1>
<dl class="py class">
-<dt id="eventlet.event.Event">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.event.</code><code class="sig-name descname">Event</code><a class="headerlink" href="#eventlet.event.Event" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.event.Event">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.event.</span></span><span class="sig-name descname"><span class="pre">Event</span></span><a class="headerlink" href="#eventlet.event.Event" title="Permalink to this definition">¶</a></dt>
<dd><p>An abstraction where an arbitrary number of coroutines
can wait for one event from another.</p>
<p>Events are similar to a Queue that can only hold one item, but differ
@@ -73,8 +75,8 @@ is implemented.</p>
</pre></div>
</div>
<dl class="py method">
-<dt id="eventlet.event.Event.ready">
-<code class="sig-name descname">ready</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.ready" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.event.Event.ready">
+<span class="sig-name descname"><span class="pre">ready</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.ready" title="Permalink to this definition">¶</a></dt>
<dd><p>Return true if the <a class="reference internal" href="#eventlet.event.Event.wait" title="eventlet.event.Event.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> call will return immediately.
Used to avoid waiting for things that might take a while to time out.
For example, you can put a bunch of events into a list, and then visit
@@ -83,8 +85,8 @@ and then you can <a class="reference internal" href="#eventlet.event.Event.wait"
</dd></dl>
<dl class="py method">
-<dt id="eventlet.event.Event.send">
-<code class="sig-name descname">send</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">result</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">exc</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.send" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.event.Event.send">
+<span class="sig-name descname"><span class="pre">send</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">result</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exc</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.send" title="Permalink to this definition">¶</a></dt>
<dd><p>Makes arrangements for the waiters to be woken with the
result and then returns immediately to the parent.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">eventlet</span> <span class="kn">import</span> <span class="n">event</span>
@@ -113,8 +115,8 @@ result and then returns immediately to the parent.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.event.Event.send_exception">
-<code class="sig-name descname">send_exception</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.send_exception" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.event.Event.send_exception">
+<span class="sig-name descname"><span class="pre">send_exception</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.send_exception" title="Permalink to this definition">¶</a></dt>
<dd><p>Same as <a class="reference internal" href="#eventlet.event.Event.send" title="eventlet.event.Event.send"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send()</span></code></a>, but sends an exception to waiters.</p>
<p>The arguments to send_exception are the same as the arguments
to <code class="docutils literal notranslate"><span class="pre">raise</span></code>. If a single exception object is passed in, it
@@ -155,8 +157,8 @@ Event object, which may cause reference cycles. See the
</dd></dl>
<dl class="py method">
-<dt id="eventlet.event.Event.wait">
-<code class="sig-name descname">wait</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">timeout</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.wait" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.event.Event.wait">
+<span class="sig-name descname"><span class="pre">wait</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.event.Event.wait" title="Permalink to this definition">¶</a></dt>
<dd><p>Wait until another coroutine calls <a class="reference internal" href="#eventlet.event.Event.send" title="eventlet.event.Event.send"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send()</span></code></a>.
Returns the value the other coroutine passed to <a class="reference internal" href="#eventlet.event.Event.send" title="eventlet.event.Event.send"><code class="xref py py-meth docutils literal notranslate"><span class="pre">send()</span></code></a>.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">eventlet</span>
@@ -181,9 +183,10 @@ specifying a timeout for the operation in seconds (or fractions thereof).</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -206,7 +209,7 @@ specifying a timeout for the operation in seconds (or fractions thereof).</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -231,14 +234,15 @@ specifying a timeout for the operation in seconds (or fractions thereof).</p>
<li class="right" >
<a href="db_pool.html" title="db_pool – DBAPI 2 database connection pooling"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">event</span></code> – Cross-greenthread primitive</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/greenpool.html b/doc/modules/greenpool.html
index c966b9d..42d497d 100644
--- a/doc/modules/greenpool.html
+++ b/doc/modules/greenpool.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>greenpool – Green Thread Pools &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>greenpool – Green Thread Pools &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="event.html" title="event – Cross-greenthread primitive"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenpool</span></code> – Green Thread Pools</a></li>
</ul>
</div>
@@ -44,23 +46,52 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.greenpool">
+ <section id="module-eventlet.greenpool">
<span id="greenpool-green-thread-pools"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenpool</span></code> – Green Thread Pools<a class="headerlink" href="#module-eventlet.greenpool" title="Permalink to this headline">¶</a></h1>
<dl class="py class">
-<dt id="eventlet.greenpool.GreenPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.greenpool.</code><code class="sig-name descname">GreenPool</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">size</span><span class="o">=</span><span class="default_value">1000</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPile">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.greenpool.</span></span><span class="sig-name descname"><span class="pre">GreenPile</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">size_or_pool</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile" title="Permalink to this definition">¶</a></dt>
+<dd><p>GreenPile is an abstraction representing a bunch of I/O-related tasks.</p>
+<p>Construct a GreenPile with an existing GreenPool object. The GreenPile will
+then use that pool’s concurrency as it processes its jobs. There can be
+many GreenPiles associated with a single GreenPool.</p>
+<p>A GreenPile can also be constructed standalone, not associated with any
+GreenPool. To do this, construct it with an integer size parameter instead
+of a GreenPool.</p>
+<p>It is not advisable to iterate over a GreenPile in a different greenthread
+than the one which is calling spawn. The iterator will exit early in that
+situation.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPile.next">
+<span class="sig-name descname"><span class="pre">next</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile.next" title="Permalink to this definition">¶</a></dt>
+<dd><p>Wait for the next result, suspending the current greenthread until it
+is available. Raises StopIteration when there are no more results.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPile.spawn">
+<span class="sig-name descname"><span class="pre">spawn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile.spawn" title="Permalink to this definition">¶</a></dt>
+<dd><p>Runs <em>func</em> in its own green thread, with the result available by
+iterating over the GreenPile object.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.greenpool.</span></span><span class="sig-name descname"><span class="pre">GreenPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool" title="Permalink to this definition">¶</a></dt>
<dd><p>The GreenPool class is a pool of green threads.</p>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.free">
-<code class="sig-name descname">free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.free" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.free">
+<span class="sig-name descname"><span class="pre">free</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.free" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns the number of greenthreads available for use.</p>
<p>If zero or less, the next call to <a class="reference internal" href="#eventlet.greenpool.GreenPool.spawn" title="eventlet.greenpool.GreenPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a> or <a class="reference internal" href="#eventlet.greenpool.GreenPool.spawn_n" title="eventlet.greenpool.GreenPool.spawn_n"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn_n()</span></code></a> will
block the calling greenthread until a slot becomes available.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.imap">
-<code class="sig-name descname">imap</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">iterables</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.imap" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.imap">
+<span class="sig-name descname"><span class="pre">imap</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">iterables</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.imap" title="Permalink to this definition">¶</a></dt>
<dd><p>This is the same as <code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.imap()</span></code>, and has the same
concurrency and memory behavior as <a class="reference internal" href="#eventlet.greenpool.GreenPool.starmap" title="eventlet.greenpool.GreenPool.starmap"><code class="xref py py-meth docutils literal notranslate"><span class="pre">starmap()</span></code></a>.</p>
<p>It’s quite convenient for, e.g., farming out jobs from a file:</p>
@@ -74,8 +105,8 @@ concurrency and memory behavior as <a class="reference internal" href="#eventlet
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.resize">
-<code class="sig-name descname">resize</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">new_size</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.resize" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.resize">
+<span class="sig-name descname"><span class="pre">resize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">new_size</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.resize" title="Permalink to this definition">¶</a></dt>
<dd><p>Change the max number of greenthreads doing work at any given time.</p>
<p>If resize is called when there are more than <em>new_size</em> greenthreads
already working on tasks, they will be allowed to complete but no new
@@ -85,15 +116,15 @@ then, the return value of free() will be negative.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.running">
-<code class="sig-name descname">running</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.running" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.running">
+<span class="sig-name descname"><span class="pre">running</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.running" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns the number of greenthreads that are currently executing
functions in the GreenPool.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.spawn">
-<code class="sig-name descname">spawn</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.spawn" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.spawn">
+<span class="sig-name descname"><span class="pre">spawn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.spawn" title="Permalink to this definition">¶</a></dt>
<dd><p>Run the <em>function</em> with its arguments in its own green thread.
Returns the <code class="xref py py-class docutils literal notranslate"><span class="pre">GreenThread</span></code>
object that is running the function, which can be used to retrieve the
@@ -105,16 +136,16 @@ pool without risk of deadlocking the whole thing.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.spawn_n">
-<code class="sig-name descname">spawn_n</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.spawn_n" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.spawn_n">
+<span class="sig-name descname"><span class="pre">spawn_n</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.spawn_n" title="Permalink to this definition">¶</a></dt>
<dd><p>Create a greenthread to run the <em>function</em>, the same as
<a class="reference internal" href="#eventlet.greenpool.GreenPool.spawn" title="eventlet.greenpool.GreenPool.spawn"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn()</span></code></a>. The difference is that <a class="reference internal" href="#eventlet.greenpool.GreenPool.spawn_n" title="eventlet.greenpool.GreenPool.spawn_n"><code class="xref py py-meth docutils literal notranslate"><span class="pre">spawn_n()</span></code></a> returns
None; the results of <em>function</em> are not retrievable.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.starmap">
-<code class="sig-name descname">starmap</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="n">iterable</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.starmap" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.starmap">
+<span class="sig-name descname"><span class="pre">starmap</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">iterable</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.starmap" title="Permalink to this definition">¶</a></dt>
<dd><p>This is the same as <a class="reference external" href="https://docs.python.org/3/library/itertools.html#itertools.starmap" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">itertools.starmap()</span></code></a>, except that <em>func</em> is
executed in a separate green thread for each item, with the concurrency
limited by the pool’s size. In operation, starmap consumes a constant
@@ -123,51 +154,23 @@ suited for iterating over extremely long input lists.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.waitall">
-<code class="sig-name descname">waitall</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.waitall" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.waitall">
+<span class="sig-name descname"><span class="pre">waitall</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.waitall" title="Permalink to this definition">¶</a></dt>
<dd><p>Waits until all greenthreads in the pool are finished working.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.greenpool.GreenPool.waiting">
-<code class="sig-name descname">waiting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.waiting" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenpool.GreenPool.waiting">
+<span class="sig-name descname"><span class="pre">waiting</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPool.waiting" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the number of greenthreads waiting to spawn.</p>
</dd></dl>
</dd></dl>
-<dl class="py class">
-<dt id="eventlet.greenpool.GreenPile">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.greenpool.</code><code class="sig-name descname">GreenPile</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">size_or_pool</span><span class="o">=</span><span class="default_value">1000</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile" title="Permalink to this definition">¶</a></dt>
-<dd><p>GreenPile is an abstraction representing a bunch of I/O-related tasks.</p>
-<p>Construct a GreenPile with an existing GreenPool object. The GreenPile will
-then use that pool’s concurrency as it processes its jobs. There can be
-many GreenPiles associated with a single GreenPool.</p>
-<p>A GreenPile can also be constructed standalone, not associated with any
-GreenPool. To do this, construct it with an integer size parameter instead
-of a GreenPool.</p>
-<p>It is not advisable to iterate over a GreenPile in a different greenthread
-than the one which is calling spawn. The iterator will exit early in that
-situation.</p>
-<dl class="py method">
-<dt id="eventlet.greenpool.GreenPile.next">
-<code class="sig-name descname">next</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile.next" title="Permalink to this definition">¶</a></dt>
-<dd><p>Wait for the next result, suspending the current greenthread until it
-is available. Raises StopIteration when there are no more results.</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.greenpool.GreenPile.spawn">
-<code class="sig-name descname">spawn</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenpool.GreenPile.spawn" title="Permalink to this definition">¶</a></dt>
-<dd><p>Runs <em>func</em> in its own green thread, with the result available by
-iterating over the GreenPile object.</p>
-</dd></dl>
-
-</dd></dl>
-
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -190,7 +193,7 @@ iterating over the GreenPile object.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -215,14 +218,15 @@ iterating over the GreenPile object.</p>
<li class="right" >
<a href="event.html" title="event – Cross-greenthread primitive"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenpool</span></code> – Green Thread Pools</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/greenthread.html b/doc/modules/greenthread.html
index 88f9925..c0874a3 100644
--- a/doc/modules/greenthread.html
+++ b/doc/modules/greenthread.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>greenthread – Green Thread Implementation &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>greenthread – Green Thread Implementation &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="greenpool.html" title="greenpool – Green Thread Pools"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenthread</span></code> – Green Thread Implementation</a></li>
</ul>
</div>
@@ -44,11 +46,89 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.greenthread">
+ <section id="module-eventlet.greenthread">
<span id="greenthread-green-thread-implementation"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenthread</span></code> – Green Thread Implementation<a class="headerlink" href="#module-eventlet.greenthread" title="Permalink to this headline">¶</a></h1>
+<dl class="py class">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">GreenThread</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parent</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread" title="Permalink to this definition">¶</a></dt>
+<dd><p>The GreenThread class is a type of Greenlet which has the additional
+property of being able to retrieve the return value of the main function.
+Do not construct GreenThread objects directly; call <a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a> to get one.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread.cancel">
+<span class="sig-name descname"><span class="pre">cancel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">throw_args</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.cancel" title="Permalink to this definition">¶</a></dt>
+<dd><p>Kills the greenthread using <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a>, but only if it hasn’t
+already started running. After being canceled,
+all calls to <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise <em>throw_args</em> (which default
+to <code class="xref py py-class docutils literal notranslate"><span class="pre">greenlet.GreenletExit</span></code>).</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread.kill">
+<span class="sig-name descname"><span class="pre">kill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">throw_args</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.kill" title="Permalink to this definition">¶</a></dt>
+<dd><p>Kills the greenthread using <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a>. After being killed
+all calls to <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise <em>throw_args</em> (which default
+to <code class="xref py py-class docutils literal notranslate"><span class="pre">greenlet.GreenletExit</span></code>).</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread.link">
+<span class="sig-name descname"><span class="pre">link</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">curried_args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">curried_kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.link" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set up a function to be called with the results of the GreenThread.</p>
+<p>The function must have the following signature:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">gt</span><span class="p">,</span> <span class="p">[</span><span class="n">curried</span> <span class="n">args</span><span class="o">/</span><span class="n">kwargs</span><span class="p">]):</span>
+</pre></div>
+</div>
+<p>When the GreenThread finishes its run, it calls <em>func</em> with itself
+and with the <a class="reference external" href="http://en.wikipedia.org/wiki/Currying">curried arguments</a> supplied
+at link-time. If the function wants to retrieve the result of the GreenThread,
+it should call wait() on its first argument.</p>
+<p>Note that <em>func</em> is called within execution context of
+the GreenThread, so it is possible to interfere with other linked
+functions by doing things like switching explicitly to another
+greenthread.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread.unlink">
+<span class="sig-name descname"><span class="pre">unlink</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">curried_args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">curried_kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.unlink" title="Permalink to this definition">¶</a></dt>
+<dd><p>remove linked function set by <a class="reference internal" href="#eventlet.greenthread.GreenThread.link" title="eventlet.greenthread.GreenThread.link"><code class="xref py py-meth docutils literal notranslate"><span class="pre">link()</span></code></a></p>
+<p>Remove successfully return True, otherwise False</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.greenthread.GreenThread.wait">
+<span class="sig-name descname"><span class="pre">wait</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.wait" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the result of the main function of this GreenThread. If the
+result is a normal return value, <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> returns it. If it raised
+an exception, <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise the same exception (though the
+stack trace will unavoidably contain some frames from within the
+greenthread module).</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.greenthread.getcurrent">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">getcurrent</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">greenlet</span></span></span><a class="headerlink" href="#eventlet.greenthread.getcurrent" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the current greenlet (i.e. the one which called this function).</p>
+</dd></dl>
+
<dl class="py function">
-<dt id="eventlet.greenthread.sleep">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">sleep</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span><span class="o">=</span><span class="default_value">0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.sleep" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenthread.kill">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">kill</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">g</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">throw_args</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.kill" title="Permalink to this definition">¶</a></dt>
+<dd><p>Terminates the target greenthread by raising an exception into it.
+Whatever that greenthread might be doing; be it waiting for I/O or another
+primitive, it sees an exception right away.</p>
+<p>By default, this exception is GreenletExit, but a specific exception
+may be specified. <em>throw_args</em> should be the same as the arguments to
+raise; either an exception instance or an exc_info tuple.</p>
+<p>Calling <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a> causes the calling greenthread to cooperatively yield.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.greenthread.sleep">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">sleep</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.sleep" title="Permalink to this definition">¶</a></dt>
<dd><p>Yield control to another eligible coroutine until at least <em>seconds</em> have
elapsed.</p>
<p><em>seconds</em> may be specified as an integer, or a float if fractional seconds
@@ -60,8 +140,8 @@ occasionally; otherwise nothing else will run.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.greenthread.spawn">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">spawn</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenthread.spawn">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">spawn</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn" title="Permalink to this definition">¶</a></dt>
<dd><p>Create a greenthread to run <code class="docutils literal notranslate"><span class="pre">func(*args,</span> <span class="pre">**kwargs)</span></code>. Returns a
<a class="reference internal" href="#eventlet.greenthread.GreenThread" title="eventlet.greenthread.GreenThread"><code class="xref py py-class docutils literal notranslate"><span class="pre">GreenThread</span></code></a> object which you can use to get the results of the
call.</p>
@@ -72,32 +152,8 @@ after a finite delay.</p>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.greenthread.spawn_n">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">spawn_n</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_n" title="Permalink to this definition">¶</a></dt>
-<dd><p>Same as <a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>, but returns a <code class="docutils literal notranslate"><span class="pre">greenlet</span></code> object from
-which it is not possible to retrieve either a return value or
-whether it raised any exceptions. This is faster than
-<a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>; it is fastest if there are no keyword arguments.</p>
-<p>If an exception is raised in the function, spawn_n prints a stack
-trace; the print can be disabled by calling
-<a class="reference internal" href="debug.html#eventlet.debug.hub_exceptions" title="eventlet.debug.hub_exceptions"><code class="xref py py-func docutils literal notranslate"><span class="pre">eventlet.debug.hub_exceptions()</span></code></a> with False.</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="eventlet.greenthread.kill">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">kill</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">g</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">throw_args</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.kill" title="Permalink to this definition">¶</a></dt>
-<dd><p>Terminates the target greenthread by raising an exception into it.
-Whatever that greenthread might be doing; be it waiting for I/O or another
-primitive, it sees an exception right away.</p>
-<p>By default, this exception is GreenletExit, but a specific exception
-may be specified. <em>throw_args</em> should be the same as the arguments to
-raise; either an exception instance or an exc_info tuple.</p>
-<p>Calling <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a> causes the calling greenthread to cooperatively yield.</p>
-</dd></dl>
-
-<dl class="py function">
-<dt id="eventlet.greenthread.spawn_after">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">spawn_after</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span></em>, <em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_after" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenthread.spawn_after">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">spawn_after</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_after" title="Permalink to this definition">¶</a></dt>
<dd><p>Spawns <em>func</em> after <em>seconds</em> have elapsed. It runs as scheduled even if
the current greenthread has completed.</p>
<p><em>seconds</em> may be specified as an integer, or a float if fractional seconds
@@ -113,8 +169,8 @@ it’s started or not is the desired behavior, call <a class="reference internal
</dd></dl>
<dl class="py function">
-<dt id="eventlet.greenthread.spawn_after_local">
-<code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">spawn_after_local</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span></em>, <em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_after_local" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.greenthread.spawn_after_local">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">spawn_after_local</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_after_local" title="Permalink to this definition">¶</a></dt>
<dd><p>Spawns <em>func</em> after <em>seconds</em> have elapsed. The function will NOT be
called if the current greenthread has exited.</p>
<p><em>seconds</em> may be specified as an integer, or a float if fractional seconds
@@ -129,69 +185,22 @@ of whether it’s started or not is the desired behavior, call
<a class="reference internal" href="#eventlet.greenthread.GreenThread.kill" title="eventlet.greenthread.GreenThread.kill"><code class="xref py py-meth docutils literal notranslate"><span class="pre">GreenThread.kill()</span></code></a>.</p>
</dd></dl>
-<dl class="py class">
-<dt id="eventlet.greenthread.GreenThread">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.greenthread.</code><code class="sig-name descname">GreenThread</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">parent</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread" title="Permalink to this definition">¶</a></dt>
-<dd><p>The GreenThread class is a type of Greenlet which has the additional
-property of being able to retrieve the return value of the main function.
-Do not construct GreenThread objects directly; call <a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a> to get one.</p>
-<dl class="py method">
-<dt id="eventlet.greenthread.GreenThread.cancel">
-<code class="sig-name descname">cancel</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">throw_args</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.cancel" title="Permalink to this definition">¶</a></dt>
-<dd><p>Kills the greenthread using <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a>, but only if it hasn’t
-already started running. After being canceled,
-all calls to <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise <em>throw_args</em> (which default
-to <code class="xref py py-class docutils literal notranslate"><span class="pre">greenlet.GreenletExit</span></code>).</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.greenthread.GreenThread.kill">
-<code class="sig-name descname">kill</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">throw_args</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.kill" title="Permalink to this definition">¶</a></dt>
-<dd><p>Kills the greenthread using <a class="reference internal" href="#eventlet.greenthread.kill" title="eventlet.greenthread.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">kill()</span></code></a>. After being killed
-all calls to <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise <em>throw_args</em> (which default
-to <code class="xref py py-class docutils literal notranslate"><span class="pre">greenlet.GreenletExit</span></code>).</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.greenthread.GreenThread.link">
-<code class="sig-name descname">link</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">curried_args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">curried_kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.link" title="Permalink to this definition">¶</a></dt>
-<dd><p>Set up a function to be called with the results of the GreenThread.</p>
-<p>The function must have the following signature:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">gt</span><span class="p">,</span> <span class="p">[</span><span class="n">curried</span> <span class="n">args</span><span class="o">/</span><span class="n">kwargs</span><span class="p">]):</span>
-</pre></div>
-</div>
-<p>When the GreenThread finishes its run, it calls <em>func</em> with itself
-and with the <a class="reference external" href="http://en.wikipedia.org/wiki/Currying">curried arguments</a> supplied
-at link-time. If the function wants to retrieve the result of the GreenThread,
-it should call wait() on its first argument.</p>
-<p>Note that <em>func</em> is called within execution context of
-the GreenThread, so it is possible to interfere with other linked
-functions by doing things like switching explicitly to another
-greenthread.</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.greenthread.GreenThread.unlink">
-<code class="sig-name descname">unlink</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">func</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">curried_args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">curried_kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.unlink" title="Permalink to this definition">¶</a></dt>
-<dd><p>remove linked function set by <a class="reference internal" href="#eventlet.greenthread.GreenThread.link" title="eventlet.greenthread.GreenThread.link"><code class="xref py py-meth docutils literal notranslate"><span class="pre">link()</span></code></a></p>
-<p>Remove successfully return True, otherwise False</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.greenthread.GreenThread.wait">
-<code class="sig-name descname">wait</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.GreenThread.wait" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns the result of the main function of this GreenThread. If the
-result is a normal return value, <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> returns it. If it raised
-an exception, <a class="reference internal" href="#eventlet.greenthread.GreenThread.wait" title="eventlet.greenthread.GreenThread.wait"><code class="xref py py-meth docutils literal notranslate"><span class="pre">wait()</span></code></a> will raise the same exception (though the
-stack trace will unavoidably contain some frames from within the
-greenthread module).</p>
-</dd></dl>
-
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.greenthread.spawn_n">
+<span class="sig-prename descclassname"><span class="pre">eventlet.greenthread.</span></span><span class="sig-name descname"><span class="pre">spawn_n</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">func</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.greenthread.spawn_n" title="Permalink to this definition">¶</a></dt>
+<dd><p>Same as <a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>, but returns a <code class="docutils literal notranslate"><span class="pre">greenlet</span></code> object from
+which it is not possible to retrieve either a return value or
+whether it raised any exceptions. This is faster than
+<a class="reference internal" href="#eventlet.greenthread.spawn" title="eventlet.greenthread.spawn"><code class="xref py py-func docutils literal notranslate"><span class="pre">spawn()</span></code></a>; it is fastest if there are no keyword arguments.</p>
+<p>If an exception is raised in the function, spawn_n prints a stack
+trace; the print can be disabled by calling
+<a class="reference internal" href="debug.html#eventlet.debug.hub_exceptions" title="eventlet.debug.hub_exceptions"><code class="xref py py-func docutils literal notranslate"><span class="pre">eventlet.debug.hub_exceptions()</span></code></a> with False.</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -214,7 +223,7 @@ greenthread module).</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -239,14 +248,15 @@ greenthread module).</p>
<li class="right" >
<a href="greenpool.html" title="greenpool – Green Thread Pools"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">greenthread</span></code> – Green Thread Implementation</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/pools.html b/doc/modules/pools.html
index 56f75d4..d75a04e 100644
--- a/doc/modules/pools.html
+++ b/doc/modules/pools.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>pools - Generic pools of resources &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>pools - Generic pools of resources &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="greenthread.html" title="greenthread – Green Thread Implementation"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">pools</span></code> - Generic pools of resources</a></li>
</ul>
</div>
@@ -44,11 +46,11 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.pools">
+ <section id="module-eventlet.pools">
<span id="pools-generic-pools-of-resources"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">pools</span></code> - Generic pools of resources<a class="headerlink" href="#module-eventlet.pools" title="Permalink to this headline">¶</a></h1>
<dl class="py class">
-<dt id="eventlet.pools.Pool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.pools.</code><code class="sig-name descname">Pool</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">min_size</span><span class="o">=</span><span class="default_value">0</span></em>, <em class="sig-param"><span class="n">max_size</span><span class="o">=</span><span class="default_value">4</span></em>, <em class="sig-param"><span class="n">order_as_stack</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">create</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.pools.</span></span><span class="sig-name descname"><span class="pre">Pool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">min_size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">4</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">order_as_stack</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">create</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool" title="Permalink to this definition">¶</a></dt>
<dd><p>Pool class implements resource limitation and construction.</p>
<p>There are two ways of using Pool: passing a <cite>create</cite> argument or
subclassing. In either case you must provide a way to create
@@ -89,8 +91,8 @@ it cannot contain any more items than <em>max_size</em>, and if there are alread
greenthread calling <a class="reference internal" href="#eventlet.pools.Pool.get" title="eventlet.pools.Pool.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get()</span></code></a> to cooperatively yield until an item
is <a class="reference internal" href="#eventlet.pools.Pool.put" title="eventlet.pools.Pool.put"><code class="xref py py-meth docutils literal notranslate"><span class="pre">put()</span></code></a> in.</p>
<dl class="py method">
-<dt id="eventlet.pools.Pool.create">
-<code class="sig-name descname">create</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.create" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.create">
+<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.create" title="Permalink to this definition">¶</a></dt>
<dd><p>Generate a new pool item. In order for the pool to
function, either this method must be overriden in a subclass
or the pool must be constructed with the <cite>create</cite> argument.
@@ -106,22 +108,22 @@ called a second time.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.free">
-<code class="sig-name descname">free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.free" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.free">
+<span class="sig-name descname"><span class="pre">free</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.free" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the number of free items in the pool. This corresponds
to the number of <a class="reference internal" href="#eventlet.pools.Pool.get" title="eventlet.pools.Pool.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get()</span></code></a> calls needed to empty the pool.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.get">
-<code class="sig-name descname">get</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.get" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.get" title="Permalink to this definition">¶</a></dt>
<dd><p>Return an item from the pool, when one is available. This may
cause the calling greenthread to block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.item">
-<code class="sig-name descname">item</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.item" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.item">
+<span class="sig-name descname"><span class="pre">item</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.item" title="Permalink to this definition">¶</a></dt>
<dd><p>Get an object out of the pool, for use with with statement.</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">eventlet</span> <span class="kn">import</span> <span class="n">pools</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">pool</span> <span class="o">=</span> <span class="n">pools</span><span class="o">.</span><span class="n">TokenPool</span><span class="p">(</span><span class="n">max_size</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
@@ -136,15 +138,15 @@ cause the calling greenthread to block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.put">
-<code class="sig-name descname">put</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">item</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.put" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.put">
+<span class="sig-name descname"><span class="pre">put</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.put" title="Permalink to this definition">¶</a></dt>
<dd><p>Put an item back into the pool, when done. This may
cause the putting greenthread to block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.resize">
-<code class="sig-name descname">resize</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">new_size</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.resize" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.resize">
+<span class="sig-name descname"><span class="pre">resize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">new_size</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.resize" title="Permalink to this definition">¶</a></dt>
<dd><p>Resize the pool to <em>new_size</em>.</p>
<p>Adjusting this number does not affect existing items checked out of
the pool, nor on any greenthreads who are waiting for an item to free
@@ -154,22 +156,22 @@ the actual operation of the pool.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.pools.Pool.waiting">
-<code class="sig-name descname">waiting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.waiting" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.Pool.waiting">
+<span class="sig-name descname"><span class="pre">waiting</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.Pool.waiting" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the number of routines waiting for a pool item.</p>
</dd></dl>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.pools.TokenPool">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.pools.</code><code class="sig-name descname">TokenPool</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">min_size</span><span class="o">=</span><span class="default_value">0</span></em>, <em class="sig-param"><span class="n">max_size</span><span class="o">=</span><span class="default_value">4</span></em>, <em class="sig-param"><span class="n">order_as_stack</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">create</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.TokenPool" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.TokenPool">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.pools.</span></span><span class="sig-name descname"><span class="pre">TokenPool</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">min_size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">4</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">order_as_stack</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">create</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.TokenPool" title="Permalink to this definition">¶</a></dt>
<dd><p>A pool which gives out tokens (opaque unique objects), which indicate
that the coroutine which holds the token has a right to consume some
limited resource.</p>
<dl class="py method">
-<dt id="eventlet.pools.TokenPool.create">
-<code class="sig-name descname">create</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.TokenPool.create" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.pools.TokenPool.create">
+<span class="sig-name descname"><span class="pre">create</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.pools.TokenPool.create" title="Permalink to this definition">¶</a></dt>
<dd><p>Generate a new pool item. In order for the pool to
function, either this method must be overriden in a subclass
or the pool must be constructed with the <cite>create</cite> argument.
@@ -186,9 +188,10 @@ called a second time.</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -211,7 +214,7 @@ called a second time.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -236,14 +239,15 @@ called a second time.</p>
<li class="right" >
<a href="greenthread.html" title="greenthread – Green Thread Implementation"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">pools</span></code> - Generic pools of resources</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/queue.html b/doc/modules/queue.html
index 9ab567e..290be39 100644
--- a/doc/modules/queue.html
+++ b/doc/modules/queue.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>queue – Queue class &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>queue – Queue class &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="pools.html" title="pools - Generic pools of resources"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">queue</span></code> – Queue class</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="module-eventlet.queue">
+ <section id="module-eventlet.queue">
<span id="queue-queue-class"></span><h1><a class="reference external" href="https://docs.python.org/3/library/queue.html#module-queue" title="(in Python v3.9)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">queue</span></code></a> – Queue class<a class="headerlink" href="#module-eventlet.queue" title="Permalink to this headline">¶</a></h1>
<p>Synchronized queues.</p>
<p>The <a class="reference internal" href="#module-eventlet.queue" title="eventlet.queue"><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.queue</span></code></a> module implements multi-producer, multi-consumer
@@ -61,77 +63,48 @@ used as indicators of whether the subsequent <code class="xref py py-meth docuti
or <code class="xref py py-meth docutils literal notranslate"><span class="pre">Queue.put()</span></code> will not block. The new methods <code class="xref py py-meth docutils literal notranslate"><span class="pre">Queue.getting()</span></code>
and <code class="xref py py-meth docutils literal notranslate"><span class="pre">Queue.putting()</span></code> report on the number of greenthreads blocking
in <code class="xref py py-meth docutils literal notranslate"><span class="pre">put</span></code> or <code class="xref py py-meth docutils literal notranslate"><span class="pre">get</span></code> respectively.</p>
-<dl class="py class">
-<dt id="eventlet.queue.Queue">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">Queue</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">maxsize</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue" title="Permalink to this definition">¶</a></dt>
-<dd><p>Create a queue object with a given maximum size.</p>
-<p>If <em>maxsize</em> is less than zero or <code class="docutils literal notranslate"><span class="pre">None</span></code>, the queue size is infinite.</p>
-<p><code class="docutils literal notranslate"><span class="pre">Queue(0)</span></code> is a channel, that is, its <code class="xref py py-meth docutils literal notranslate"><span class="pre">put()</span></code> method always blocks
-until the item is delivered. (This is unlike the standard
-<code class="xref py py-class docutils literal notranslate"><span class="pre">Stdlib_Queue</span></code>, where 0 means infinite size).</p>
-<p>In all other respects, this Queue class resembles the standard library,
-<code class="xref py py-class docutils literal notranslate"><span class="pre">Stdlib_Queue</span></code>.</p>
-<dl class="py method">
-<dt id="eventlet.queue.Queue.join">
-<code class="sig-name descname">join</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue.join" title="Permalink to this definition">¶</a></dt>
-<dd><p>Block until all items in the queue have been gotten and processed.</p>
-<p>The count of unfinished tasks goes up whenever an item is added to the queue.
-The count goes down whenever a consumer thread calls <a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> to indicate
-that the item was retrieved and all work on it is complete. When the count of
-unfinished tasks drops to zero, <a class="reference internal" href="#eventlet.queue.Queue.join" title="eventlet.queue.Queue.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code></a> unblocks.</p>
-</dd></dl>
-
-<dl class="py method">
-<dt id="eventlet.queue.Queue.task_done">
-<code class="sig-name descname">task_done</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue.task_done" title="Permalink to this definition">¶</a></dt>
-<dd><p>Indicate that a formerly enqueued task is complete. Used by queue consumer threads.
-For each <code class="xref py py-meth docutils literal notranslate"><span class="pre">get</span></code> used to fetch a task, a subsequent call to
-<a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> tells the queue that the processing on the task is complete.</p>
-<p>If a <a class="reference internal" href="#eventlet.queue.Queue.join" title="eventlet.queue.Queue.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code></a> is currently blocking, it will resume when all items have been processed
-(meaning that a <a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> call was received for every item that had been
-<code class="xref py py-meth docutils literal notranslate"><span class="pre">put</span></code> into the queue).</p>
-<p>Raises a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.9)"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> if called more times than there were items placed in the queue.</p>
-</dd></dl>
-
+<dl class="py exception">
+<dt class="sig sig-object py" id="eventlet.queue.Empty">
+<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">Empty</span></span><a class="headerlink" href="#eventlet.queue.Empty" title="Permalink to this definition">¶</a></dt>
+<dd><p>Exception raised by Queue.get(block=0)/get_nowait().</p>
</dd></dl>
-<dl class="py class">
-<dt id="eventlet.queue.PriorityQueue">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">PriorityQueue</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">maxsize</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.PriorityQueue" title="Permalink to this definition">¶</a></dt>
-<dd><p>A subclass of <a class="reference internal" href="#eventlet.queue.Queue" title="eventlet.queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> that retrieves entries in priority order (lowest first).</p>
-<p>Entries are typically tuples of the form: <code class="docutils literal notranslate"><span class="pre">(priority</span> <span class="pre">number,</span> <span class="pre">data)</span></code>.</p>
+<dl class="py exception">
+<dt class="sig sig-object py" id="eventlet.queue.Full">
+<em class="property"><span class="pre">exception</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">Full</span></span><a class="headerlink" href="#eventlet.queue.Full" title="Permalink to this definition">¶</a></dt>
+<dd><p>Exception raised by Queue.put(block=0)/put_nowait().</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.queue.LifoQueue">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">LifoQueue</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">maxsize</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LifoQueue" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LifoQueue">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">LifoQueue</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">maxsize</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LifoQueue" title="Permalink to this definition">¶</a></dt>
<dd><p>A subclass of <a class="reference internal" href="#eventlet.queue.Queue" title="eventlet.queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> that retrieves most recently added entries first.</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.queue.LightQueue">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">LightQueue</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">maxsize</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">LightQueue</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">maxsize</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue" title="Permalink to this definition">¶</a></dt>
<dd><p>This is a variant of Queue that behaves mostly like the standard
<code class="xref py py-class docutils literal notranslate"><span class="pre">Stdlib_Queue</span></code>. It differs by not supporting the
<code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done</span></code> or
<code class="xref py py-meth docutils literal notranslate"><span class="pre">join</span></code> methods, and is a little faster for
not having that overhead.</p>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.empty">
-<code class="sig-name descname">empty</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.empty" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.empty">
+<span class="sig-name descname"><span class="pre">empty</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.empty" title="Permalink to this definition">¶</a></dt>
<dd><p>Return <code class="docutils literal notranslate"><span class="pre">True</span></code> if the queue is empty, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.full">
-<code class="sig-name descname">full</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.full" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.full">
+<span class="sig-name descname"><span class="pre">full</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.full" title="Permalink to this definition">¶</a></dt>
<dd><p>Return <code class="docutils literal notranslate"><span class="pre">True</span></code> if the queue is full, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise.</p>
<p><code class="docutils literal notranslate"><span class="pre">Queue(None)</span></code> is never full.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.get">
-<code class="sig-name descname">get</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">block</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.get" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.get">
+<span class="sig-name descname"><span class="pre">get</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.get" title="Permalink to this definition">¶</a></dt>
<dd><p>Remove and return an item from the queue.</p>
<p>If optional args <em>block</em> is true and <em>timeout</em> is <code class="docutils literal notranslate"><span class="pre">None</span></code> (the default),
block if necessary until an item is available. If <em>timeout</em> is a positive number,
@@ -142,23 +115,23 @@ an item if one is immediately available, else raise the <a class="reference inte
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.get_nowait">
-<code class="sig-name descname">get_nowait</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.get_nowait" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.get_nowait">
+<span class="sig-name descname"><span class="pre">get_nowait</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.get_nowait" title="Permalink to this definition">¶</a></dt>
<dd><p>Remove and return an item from the queue without blocking.</p>
<p>Only get an item if one is immediately available. Otherwise
raise the <a class="reference internal" href="#eventlet.queue.Empty" title="eventlet.queue.Empty"><code class="xref py py-class docutils literal notranslate"><span class="pre">Empty</span></code></a> exception.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.getting">
-<code class="sig-name descname">getting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.getting" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.getting">
+<span class="sig-name descname"><span class="pre">getting</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.getting" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns the number of greenthreads that are blocked waiting on an
empty queue.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.put">
-<code class="sig-name descname">put</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">item</span></em>, <em class="sig-param"><span class="n">block</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.put" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.put">
+<span class="sig-name descname"><span class="pre">put</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.put" title="Permalink to this definition">¶</a></dt>
<dd><p>Put an item into the queue.</p>
<p>If optional arg <em>block</em> is true and <em>timeout</em> is <code class="docutils literal notranslate"><span class="pre">None</span></code> (the default),
block if necessary until a free slot is available. If <em>timeout</em> is
@@ -170,50 +143,80 @@ is ignored in that case).</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.put_nowait">
-<code class="sig-name descname">put_nowait</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">item</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.put_nowait" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.put_nowait">
+<span class="sig-name descname"><span class="pre">put_nowait</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">item</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.put_nowait" title="Permalink to this definition">¶</a></dt>
<dd><p>Put an item into the queue without blocking.</p>
<p>Only enqueue the item if a free slot is immediately available.
Otherwise raise the <a class="reference internal" href="#eventlet.queue.Full" title="eventlet.queue.Full"><code class="xref py py-class docutils literal notranslate"><span class="pre">Full</span></code></a> exception.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.putting">
-<code class="sig-name descname">putting</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.putting" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.putting">
+<span class="sig-name descname"><span class="pre">putting</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.putting" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns the number of greenthreads that are blocked waiting to put
items into the queue.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.qsize">
-<code class="sig-name descname">qsize</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.qsize" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.qsize">
+<span class="sig-name descname"><span class="pre">qsize</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.qsize" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the size of the queue.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.queue.LightQueue.resize">
-<code class="sig-name descname">resize</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">size</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.resize" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.queue.LightQueue.resize">
+<span class="sig-name descname"><span class="pre">resize</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">size</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.LightQueue.resize" title="Permalink to this definition">¶</a></dt>
<dd><p>Resizes the queue’s maximum size.</p>
<p>If the size is increased, and there are putters waiting, they may be woken up.</p>
</dd></dl>
</dd></dl>
-<dl class="py exception">
-<dt id="eventlet.queue.Full">
-<em class="property">exception </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">Full</code><a class="headerlink" href="#eventlet.queue.Full" title="Permalink to this definition">¶</a></dt>
-<dd><p>Exception raised by Queue.put(block=0)/put_nowait().</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="eventlet.queue.PriorityQueue">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">PriorityQueue</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">maxsize</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.PriorityQueue" title="Permalink to this definition">¶</a></dt>
+<dd><p>A subclass of <a class="reference internal" href="#eventlet.queue.Queue" title="eventlet.queue.Queue"><code class="xref py py-class docutils literal notranslate"><span class="pre">Queue</span></code></a> that retrieves entries in priority order (lowest first).</p>
+<p>Entries are typically tuples of the form: <code class="docutils literal notranslate"><span class="pre">(priority</span> <span class="pre">number,</span> <span class="pre">data)</span></code>.</p>
</dd></dl>
-<dl class="py exception">
-<dt id="eventlet.queue.Empty">
-<em class="property">exception </em><code class="sig-prename descclassname">eventlet.queue.</code><code class="sig-name descname">Empty</code><a class="headerlink" href="#eventlet.queue.Empty" title="Permalink to this definition">¶</a></dt>
-<dd><p>Exception raised by Queue.get(block=0)/get_nowait().</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="eventlet.queue.Queue">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.queue.</span></span><span class="sig-name descname"><span class="pre">Queue</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">maxsize</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create a queue object with a given maximum size.</p>
+<p>If <em>maxsize</em> is less than zero or <code class="docutils literal notranslate"><span class="pre">None</span></code>, the queue size is infinite.</p>
+<p><code class="docutils literal notranslate"><span class="pre">Queue(0)</span></code> is a channel, that is, its <code class="xref py py-meth docutils literal notranslate"><span class="pre">put()</span></code> method always blocks
+until the item is delivered. (This is unlike the standard
+<code class="xref py py-class docutils literal notranslate"><span class="pre">Stdlib_Queue</span></code>, where 0 means infinite size).</p>
+<p>In all other respects, this Queue class resembles the standard library,
+<code class="xref py py-class docutils literal notranslate"><span class="pre">Stdlib_Queue</span></code>.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.queue.Queue.join">
+<span class="sig-name descname"><span class="pre">join</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue.join" title="Permalink to this definition">¶</a></dt>
+<dd><p>Block until all items in the queue have been gotten and processed.</p>
+<p>The count of unfinished tasks goes up whenever an item is added to the queue.
+The count goes down whenever a consumer thread calls <a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> to indicate
+that the item was retrieved and all work on it is complete. When the count of
+unfinished tasks drops to zero, <a class="reference internal" href="#eventlet.queue.Queue.join" title="eventlet.queue.Queue.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code></a> unblocks.</p>
</dd></dl>
-</div>
+<dl class="py method">
+<dt class="sig sig-object py" id="eventlet.queue.Queue.task_done">
+<span class="sig-name descname"><span class="pre">task_done</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.queue.Queue.task_done" title="Permalink to this definition">¶</a></dt>
+<dd><p>Indicate that a formerly enqueued task is complete. Used by queue consumer threads.
+For each <code class="xref py py-meth docutils literal notranslate"><span class="pre">get</span></code> used to fetch a task, a subsequent call to
+<a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> tells the queue that the processing on the task is complete.</p>
+<p>If a <a class="reference internal" href="#eventlet.queue.Queue.join" title="eventlet.queue.Queue.join"><code class="xref py py-meth docutils literal notranslate"><span class="pre">join()</span></code></a> is currently blocking, it will resume when all items have been processed
+(meaning that a <a class="reference internal" href="#eventlet.queue.Queue.task_done" title="eventlet.queue.Queue.task_done"><code class="xref py py-meth docutils literal notranslate"><span class="pre">task_done()</span></code></a> call was received for every item that had been
+<code class="xref py py-meth docutils literal notranslate"><span class="pre">put</span></code> into the queue).</p>
+<p>Raises a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.9)"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> if called more times than there were items placed in the queue.</p>
+</dd></dl>
+
+</dd></dl>
+
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -236,7 +239,7 @@ items into the queue.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -261,14 +264,15 @@ items into the queue.</p>
<li class="right" >
<a href="pools.html" title="pools - Generic pools of resources"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">queue</span></code> – Queue class</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/semaphore.html b/doc/modules/semaphore.html
index 0098d97..2de0c48 100644
--- a/doc/modules/semaphore.html
+++ b/doc/modules/semaphore.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>semaphore – Semaphore classes &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>semaphore – Semaphore classes &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="queue.html" title="queue – Queue class"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">semaphore</span></code> – Semaphore classes</a></li>
</ul>
</div>
@@ -44,11 +46,11 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="semaphore-semaphore-classes">
+ <section id="semaphore-semaphore-classes">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">semaphore</span></code> – Semaphore classes<a class="headerlink" href="#semaphore-semaphore-classes" title="Permalink to this headline">¶</a></h1>
<dl class="py class">
-<dt id="eventlet.semaphore.Semaphore">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.semaphore.</code><code class="sig-name descname">Semaphore</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">value</span><span class="o">=</span><span class="default_value">1</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.semaphore.</span></span><span class="sig-name descname"><span class="pre">Semaphore</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore" title="Permalink to this definition">¶</a></dt>
<dd><p>An unbounded semaphore.
Optionally initialize with a resource <em>count</em>, then <a class="reference internal" href="#eventlet.semaphore.Semaphore.acquire" title="eventlet.semaphore.Semaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> and
<a class="reference internal" href="#eventlet.semaphore.Semaphore.release" title="eventlet.semaphore.Semaphore.release"><code class="xref py py-meth docutils literal notranslate"><span class="pre">release()</span></code></a> resources as needed. Attempting to <a class="reference internal" href="#eventlet.semaphore.Semaphore.acquire" title="eventlet.semaphore.Semaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> when
@@ -69,8 +71,8 @@ nonzero again.</p>
</pre></div>
</div>
<dl class="py method">
-<dt id="eventlet.semaphore.Semaphore.acquire">
-<code class="sig-name descname">acquire</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">blocking</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.acquire" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore.acquire">
+<span class="sig-name descname"><span class="pre">acquire</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blocking</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.acquire" title="Permalink to this definition">¶</a></dt>
<dd><p>Acquire a semaphore.</p>
<p>When invoked without arguments: if the internal counter is larger than
zero on entry, decrement it by one and return immediately. If it is zero
@@ -88,9 +90,9 @@ same thing as when called without arguments, and return true.</p>
<p>Timeout value must be strictly positive.</p>
</dd></dl>
-<dl class="py method">
-<dt id="eventlet.semaphore.Semaphore.balance">
-<em class="property">property </em><code class="sig-name descname">balance</code><a class="headerlink" href="#eventlet.semaphore.Semaphore.balance" title="Permalink to this definition">¶</a></dt>
+<dl class="py property">
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore.balance">
+<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">balance</span></span><a class="headerlink" href="#eventlet.semaphore.Semaphore.balance" title="Permalink to this definition">¶</a></dt>
<dd><p>An integer value that represents how many new calls to
<a class="reference internal" href="#eventlet.semaphore.Semaphore.acquire" title="eventlet.semaphore.Semaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> or <a class="reference internal" href="#eventlet.semaphore.Semaphore.release" title="eventlet.semaphore.Semaphore.release"><code class="xref py py-meth docutils literal notranslate"><span class="pre">release()</span></code></a> would be needed to get the counter to
0. If it is positive, then its value is the number of acquires that can
@@ -102,21 +104,21 @@ are currently blocking in <a class="reference internal" href="#eventlet.semaphor
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.Semaphore.bounded">
-<code class="sig-name descname">bounded</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.bounded" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore.bounded">
+<span class="sig-name descname"><span class="pre">bounded</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.bounded" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns False; for consistency with
<a class="reference internal" href="#eventlet.semaphore.CappedSemaphore" title="eventlet.semaphore.CappedSemaphore"><code class="xref py py-class docutils literal notranslate"><span class="pre">CappedSemaphore</span></code></a>.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.Semaphore.locked">
-<code class="sig-name descname">locked</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.locked" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore.locked">
+<span class="sig-name descname"><span class="pre">locked</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.locked" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if a call to acquire would block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.Semaphore.release">
-<code class="sig-name descname">release</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">blocking</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.release" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.Semaphore.release">
+<span class="sig-name descname"><span class="pre">release</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blocking</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.Semaphore.release" title="Permalink to this definition">¶</a></dt>
<dd><p>Release a semaphore, incrementing the internal counter by one. When
it was zero on entry and another thread is waiting for it to become
larger than zero again, wake up that thread.</p>
@@ -127,16 +129,16 @@ ignored</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.semaphore.BoundedSemaphore">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.semaphore.</code><code class="sig-name descname">BoundedSemaphore</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">value</span><span class="o">=</span><span class="default_value">1</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.BoundedSemaphore" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.BoundedSemaphore">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.semaphore.</span></span><span class="sig-name descname"><span class="pre">BoundedSemaphore</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">value</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.BoundedSemaphore" title="Permalink to this definition">¶</a></dt>
<dd><p>A bounded semaphore checks to make sure its current value doesn’t exceed
its initial value. If it does, ValueError is raised. In most situations
semaphores are used to guard resources with limited capacity. If the
semaphore is released too many times it’s a sign of a bug. If not given,
<em>value</em> defaults to 1.</p>
<dl class="py method">
-<dt id="eventlet.semaphore.BoundedSemaphore.release">
-<code class="sig-name descname">release</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">blocking</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.BoundedSemaphore.release" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.BoundedSemaphore.release">
+<span class="sig-name descname"><span class="pre">release</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blocking</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.BoundedSemaphore.release" title="Permalink to this definition">¶</a></dt>
<dd><p>Release a semaphore, incrementing the internal counter by one. If
the counter would exceed the initial value, raises ValueError. When
it was zero on entry and another thread is waiting for it to become
@@ -148,8 +150,8 @@ and is ignored</p>
</dd></dl>
<dl class="py class">
-<dt id="eventlet.semaphore.CappedSemaphore">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.semaphore.</code><code class="sig-name descname">CappedSemaphore</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">count</span></em>, <em class="sig-param"><span class="n">limit</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.semaphore.</span></span><span class="sig-name descname"><span class="pre">CappedSemaphore</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">count</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">limit</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore" title="Permalink to this definition">¶</a></dt>
<dd><p>A blockingly bounded semaphore.</p>
<p>Optionally initialize with a resource <em>count</em>, then <a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.acquire" title="eventlet.semaphore.CappedSemaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> and
<a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.release" title="eventlet.semaphore.CappedSemaphore.release"><code class="xref py py-meth docutils literal notranslate"><span class="pre">release()</span></code></a> resources as needed. Attempting to <a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.acquire" title="eventlet.semaphore.CappedSemaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> when
@@ -169,8 +171,8 @@ instead of raising a ValueError.</p>
</pre></div>
</div>
<dl class="py method">
-<dt id="eventlet.semaphore.CappedSemaphore.acquire">
-<code class="sig-name descname">acquire</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">blocking</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.acquire" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore.acquire">
+<span class="sig-name descname"><span class="pre">acquire</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blocking</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.acquire" title="Permalink to this definition">¶</a></dt>
<dd><p>Acquire a semaphore.</p>
<p>When invoked without arguments: if the internal counter is larger than
zero on entry, decrement it by one and return immediately. If it is zero
@@ -187,9 +189,9 @@ an argument would block, return false immediately; otherwise, do the
same thing as when called without arguments, and return true.</p>
</dd></dl>
-<dl class="py method">
-<dt id="eventlet.semaphore.CappedSemaphore.balance">
-<em class="property">property </em><code class="sig-name descname">balance</code><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.balance" title="Permalink to this definition">¶</a></dt>
+<dl class="py property">
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore.balance">
+<em class="property"><span class="pre">property</span> </em><span class="sig-name descname"><span class="pre">balance</span></span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.balance" title="Permalink to this definition">¶</a></dt>
<dd><p>An integer value that represents how many new calls to
<a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.acquire" title="eventlet.semaphore.CappedSemaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> or <a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.release" title="eventlet.semaphore.CappedSemaphore.release"><code class="xref py py-meth docutils literal notranslate"><span class="pre">release()</span></code></a> would be needed to get the counter to
0. If it is positive, then its value is the number of acquires that can
@@ -201,20 +203,20 @@ are currently blocking in <a class="reference internal" href="#eventlet.semaphor
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.CappedSemaphore.bounded">
-<code class="sig-name descname">bounded</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.bounded" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore.bounded">
+<span class="sig-name descname"><span class="pre">bounded</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.bounded" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if a call to release would block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.CappedSemaphore.locked">
-<code class="sig-name descname">locked</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.locked" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore.locked">
+<span class="sig-name descname"><span class="pre">locked</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.locked" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns true if a call to acquire would block.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.semaphore.CappedSemaphore.release">
-<code class="sig-name descname">release</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">blocking</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.release" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.semaphore.CappedSemaphore.release">
+<span class="sig-name descname"><span class="pre">release</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">blocking</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.semaphore.CappedSemaphore.release" title="Permalink to this definition">¶</a></dt>
<dd><p>Release a semaphore. In this class, this behaves very much like
an <a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.acquire" title="eventlet.semaphore.CappedSemaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> but in the opposite direction.</p>
<p>Imagine the docs of <a class="reference internal" href="#eventlet.semaphore.CappedSemaphore.acquire" title="eventlet.semaphore.CappedSemaphore.acquire"><code class="xref py py-meth docutils literal notranslate"><span class="pre">acquire()</span></code></a> here, but with every direction
@@ -224,9 +226,10 @@ counter is greater than or equal to <em>limit</em>.</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -249,7 +252,7 @@ counter is greater than or equal to <em>limit</em>.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -274,14 +277,15 @@ counter is greater than or equal to <em>limit</em>.</p>
<li class="right" >
<a href="queue.html" title="queue – Queue class"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">semaphore</span></code> – Semaphore classes</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/timeout.html b/doc/modules/timeout.html
index 34e8428..bf517ec 100644
--- a/doc/modules/timeout.html
+++ b/doc/modules/timeout.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>timeout – Universal Timeouts &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>timeout – Universal Timeouts &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="semaphore.html" title="semaphore – Semaphore classes"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">timeout</span></code> – Universal Timeouts</a></li>
</ul>
</div>
@@ -44,11 +46,11 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="timeout-universal-timeouts">
+ <section id="timeout-universal-timeouts">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">timeout</span></code> – Universal Timeouts<a class="headerlink" href="#timeout-universal-timeouts" title="Permalink to this headline">¶</a></h1>
<dl class="py class">
-<dt id="eventlet.timeout.Timeout">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.timeout.</code><code class="sig-name descname">Timeout</code><a class="headerlink" href="#eventlet.timeout.Timeout" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.timeout.Timeout">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.timeout.</span></span><span class="sig-name descname"><span class="pre">Timeout</span></span><a class="headerlink" href="#eventlet.timeout.Timeout" title="Permalink to this definition">¶</a></dt>
<dd><p>Raises <em>exception</em> in the current greenthread after <em>timeout</em> seconds:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">timeout</span> <span class="o">=</span> <span class="n">Timeout</span><span class="p">(</span><span class="n">seconds</span><span class="p">,</span> <span class="n">exception</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
@@ -103,8 +105,8 @@ same instance that you set:</p>
</pre></div>
</div>
<dl class="py method">
-<dt id="eventlet.timeout.eventlet.timeout.Timeout.Timeout.cancel">
-<code class="sig-prename descclassname">Timeout.</code><code class="sig-name descname">cancel</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.timeout.eventlet.timeout.Timeout.Timeout.cancel" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.timeout.eventlet.timeout.Timeout.Timeout.cancel">
+<span class="sig-prename descclassname"><span class="pre">Timeout.</span></span><span class="sig-name descname"><span class="pre">cancel</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.timeout.eventlet.timeout.Timeout.Timeout.cancel" title="Permalink to this definition">¶</a></dt>
<dd><p>If the timeout is pending, cancel it. If not using
Timeouts in <code class="docutils literal notranslate"><span class="pre">with</span></code> statements, always call cancel() in a
<code class="docutils literal notranslate"><span class="pre">finally</span></code> after the block of code that is getting timed out.
@@ -113,16 +115,16 @@ unexpected section of the application.</p>
</dd></dl>
<dl class="py attribute">
-<dt id="eventlet.timeout.eventlet.timeout.Timeout.Timeout.pending">
-<code class="sig-prename descclassname">Timeout.</code><code class="sig-name descname">pending</code><a class="headerlink" href="#eventlet.timeout.eventlet.timeout.Timeout.Timeout.pending" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.timeout.eventlet.timeout.Timeout.Timeout.pending">
+<span class="sig-prename descclassname"><span class="pre">Timeout.</span></span><span class="sig-name descname"><span class="pre">pending</span></span><a class="headerlink" href="#eventlet.timeout.eventlet.timeout.Timeout.Timeout.pending" title="Permalink to this definition">¶</a></dt>
<dd><p>True if the timeout is scheduled to be raised.</p>
</dd></dl>
</dd></dl>
<dl class="py function">
-<dt id="eventlet.timeout.with_timeout">
-<code class="sig-prename descclassname">eventlet.timeout.</code><code class="sig-name descname">with_timeout</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">seconds</span></em>, <em class="sig-param"><span class="n">function</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwds</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.timeout.with_timeout" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.timeout.with_timeout">
+<span class="sig-prename descclassname"><span class="pre">eventlet.timeout.</span></span><span class="sig-name descname"><span class="pre">with_timeout</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">seconds</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">function</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwds</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.timeout.with_timeout" title="Permalink to this definition">¶</a></dt>
<dd><p>Wrap a call to some (yielding) function with a timeout; if the called
function fails to return before the timeout, cancel it and return a flag
value.</p>
@@ -158,9 +160,10 @@ if it took too long to return. Any exception raised by the <code class="docutil
is passed through to the caller.</p>
</dd></dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -183,7 +186,7 @@ is passed through to the caller.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -208,14 +211,15 @@ is passed through to the caller.</p>
<li class="right" >
<a href="semaphore.html" title="semaphore – Semaphore classes"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">timeout</span></code> – Universal Timeouts</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/websocket.html b/doc/modules/websocket.html
index df0dc8f..20b8f66 100644
--- a/doc/modules/websocket.html
+++ b/doc/modules/websocket.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>websocket – Websocket Server &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>websocket – Websocket Server &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="timeout.html" title="timeout – Universal Timeouts"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">websocket</span></code> – Websocket Server</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="websocket-websocket-server">
+ <section id="websocket-websocket-server">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">websocket</span></code> – Websocket Server<a class="headerlink" href="#websocket-websocket-server" title="Permalink to this headline">¶</a></h1>
<p>This module provides a simple way to create a <a class="reference external" href="http://dev.w3.org/html5/websockets/">websocket</a> server. It works with a few
tweaks in the <a class="reference internal" href="wsgi.html#module-eventlet.wsgi" title="eventlet.wsgi"><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgi</span></code></a> module that allow websockets to
@@ -74,29 +76,8 @@ documentation</p>
<p>The web socket spec is still under development, and it will be necessary to change the way that this module works in response to spec changes.</p>
</div>
<span class="target" id="module-eventlet.websocket"></span><dl class="py class">
-<dt id="eventlet.websocket.WebSocketWSGI">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.websocket.</code><code class="sig-name descname">WebSocketWSGI</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">handler</span></em>, <em class="sig-param"><span class="n">max_frame_length</span><span class="o">=</span><span class="default_value">8388608</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocketWSGI" title="Permalink to this definition">¶</a></dt>
-<dd><p>Wraps a websocket handler function in a WSGI application.</p>
-<p>Use it like this:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nd">@websocket</span><span class="o">.</span><span class="n">WebSocketWSGI</span>
-<span class="k">def</span> <span class="nf">my_handler</span><span class="p">(</span><span class="n">ws</span><span class="p">):</span>
- <span class="n">from_browser</span> <span class="o">=</span> <span class="n">ws</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
- <span class="n">ws</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">&quot;from server&quot;</span><span class="p">)</span>
-</pre></div>
-</div>
-<p>The single argument to the function will be an instance of
-<a class="reference internal" href="#eventlet.websocket.WebSocket" title="eventlet.websocket.WebSocket"><code class="xref py py-class docutils literal notranslate"><span class="pre">WebSocket</span></code></a>. To close the socket, simply return from the
-function. Note that the server will log the websocket request at
-the time of closure.</p>
-<p>An optional argument max_frame_length can be given, which will set the
-maximum incoming <em>uncompressed</em> payload length of a frame. By default, this
-is set to 8MiB. Note that excessive values here might create a DOS attack
-vector.</p>
-</dd></dl>
-
-<dl class="py class">
-<dt id="eventlet.websocket.WebSocket">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.websocket.</code><code class="sig-name descname">WebSocket</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sock</span></em>, <em class="sig-param"><span class="n">environ</span></em>, <em class="sig-param"><span class="n">version</span><span class="o">=</span><span class="default_value">76</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.websocket.WebSocket">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.websocket.</span></span><span class="sig-name descname"><span class="pre">WebSocket</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sock</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">environ</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">version</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">76</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket" title="Permalink to this definition">¶</a></dt>
<dd><p>A websocket object that handles the details of
serialization/deserialization to the socket.</p>
<p>The primary way to interact with a <a class="reference internal" href="#eventlet.websocket.WebSocket" title="eventlet.websocket.WebSocket"><code class="xref py py-class docutils literal notranslate"><span class="pre">WebSocket</span></code></a> object is to
@@ -115,15 +96,15 @@ but more convenient.</p>
</dd>
</dl>
<dl class="py method">
-<dt id="eventlet.websocket.WebSocket.close">
-<code class="sig-name descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.close" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.websocket.WebSocket.close">
+<span class="sig-name descname"><span class="pre">close</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.close" title="Permalink to this definition">¶</a></dt>
<dd><p>Forcibly close the websocket; generally it is preferable to
return from the handler method.</p>
</dd></dl>
<dl class="py method">
-<dt id="eventlet.websocket.WebSocket.send">
-<code class="sig-name descname">send</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">message</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.send" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.websocket.WebSocket.send">
+<span class="sig-name descname"><span class="pre">send</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">message</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.send" title="Permalink to this definition">¶</a></dt>
<dd><p>Send a message to the browser.</p>
<p><em>message</em> should be convertable to a string; unicode objects should be
encodable as utf-8. Raises socket.error with errno of 32
@@ -131,8 +112,8 @@ encodable as utf-8. Raises socket.error with errno of 32
</dd></dl>
<dl class="py method">
-<dt id="eventlet.websocket.WebSocket.wait">
-<code class="sig-name descname">wait</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.wait" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.websocket.WebSocket.wait">
+<span class="sig-name descname"><span class="pre">wait</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocket.wait" title="Permalink to this definition">¶</a></dt>
<dd><p>Waits for and deserializes messages.</p>
<p>Returns a single message; the oldest not yet processed. If the client
has already closed the connection, returns None. This is different
@@ -142,9 +123,31 @@ websocket message.</p>
</dd></dl>
+<dl class="py class">
+<dt class="sig sig-object py" id="eventlet.websocket.WebSocketWSGI">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.websocket.</span></span><span class="sig-name descname"><span class="pre">WebSocketWSGI</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">handler</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_frame_length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">8388608</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.websocket.WebSocketWSGI" title="Permalink to this definition">¶</a></dt>
+<dd><p>Wraps a websocket handler function in a WSGI application.</p>
+<p>Use it like this:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nd">@websocket</span><span class="o">.</span><span class="n">WebSocketWSGI</span>
+<span class="k">def</span> <span class="nf">my_handler</span><span class="p">(</span><span class="n">ws</span><span class="p">):</span>
+ <span class="n">from_browser</span> <span class="o">=</span> <span class="n">ws</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
+ <span class="n">ws</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s2">&quot;from server&quot;</span><span class="p">)</span>
+</pre></div>
</div>
+<p>The single argument to the function will be an instance of
+<a class="reference internal" href="#eventlet.websocket.WebSocket" title="eventlet.websocket.WebSocket"><code class="xref py py-class docutils literal notranslate"><span class="pre">WebSocket</span></code></a>. To close the socket, simply return from the
+function. Note that the server will log the websocket request at
+the time of closure.</p>
+<p>An optional argument max_frame_length can be given, which will set the
+maximum incoming <em>uncompressed</em> payload length of a frame. By default, this
+is set to 8MiB. Note that excessive values here might create a DOS attack
+vector.</p>
+</dd></dl>
+
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -167,7 +170,7 @@ websocket message.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -192,14 +195,15 @@ websocket message.</p>
<li class="right" >
<a href="timeout.html" title="timeout – Universal Timeouts"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">websocket</span></code> – Websocket Server</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/wsgi.html b/doc/modules/wsgi.html
index 6f81e98..5af3ee8 100644
--- a/doc/modules/wsgi.html
+++ b/doc/modules/wsgi.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>wsgi – WSGI server &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>wsgi – WSGI server &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="websocket.html" title="websocket – Websocket Server"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgi</span></code> – WSGI server</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="wsgi-wsgi-server">
+ <section id="wsgi-wsgi-server">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgi</span></code> – WSGI server<a class="headerlink" href="#wsgi-wsgi-server" title="Permalink to this headline">¶</a></h1>
<p>The wsgi module provides a simple and easy way to start an event-driven
<a class="reference external" href="http://wsgi.org/wsgi/">WSGI</a> server. This can serve as an embedded
@@ -64,8 +66,14 @@ server package. One such package is <a class="reference external" href="http://
<p>You can find a slightly more elaborate version of this code in the file
<code class="docutils literal notranslate"><span class="pre">examples/wsgi.py</span></code>.</p>
<span class="target" id="module-eventlet.wsgi"></span><dl class="py function">
-<dt id="eventlet.wsgi.server">
-<code class="sig-prename descclassname">eventlet.wsgi.</code><code class="sig-name descname">server</code><span class="sig-paren">(</span><em class="sig-param">sock</em>, <em class="sig-param">site</em>, <em class="sig-param">log=None</em>, <em class="sig-param">environ=None</em>, <em class="sig-param">max_size=None</em>, <em class="sig-param">max_http_version='HTTP/1.1'</em>, <em class="sig-param">protocol=&lt;class 'eventlet.wsgi.HttpProtocol'&gt;</em>, <em class="sig-param">server_event=None</em>, <em class="sig-param">minimum_chunk_size=None</em>, <em class="sig-param">log_x_forwarded_for=True</em>, <em class="sig-param">custom_pool=None</em>, <em class="sig-param">keepalive=True</em>, <em class="sig-param">log_output=True</em>, <em class="sig-param">log_format='%(client_ip)s - - [%(date_time)s] &quot;%(request_line)s&quot; %(status_code)s %(body_length)s %(wall_seconds).6f'</em>, <em class="sig-param">url_length_limit=8192</em>, <em class="sig-param">debug=True</em>, <em class="sig-param">socket_timeout=None</em>, <em class="sig-param">capitalize_response_headers=True</em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wsgi.server" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.wsgi.format_date_time">
+<span class="sig-prename descclassname"><span class="pre">eventlet.wsgi.</span></span><span class="sig-name descname"><span class="pre">format_date_time</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">timestamp</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wsgi.format_date_time" title="Permalink to this definition">¶</a></dt>
+<dd><p>Formats a unix timestamp into an HTTP standard string.</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.wsgi.server">
+<span class="sig-prename descclassname"><span class="pre">eventlet.wsgi.</span></span><span class="sig-name descname"><span class="pre">server</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">sock</span></em>, <em class="sig-param"><span class="pre">site</span></em>, <em class="sig-param"><span class="pre">log=None</span></em>, <em class="sig-param"><span class="pre">environ=None</span></em>, <em class="sig-param"><span class="pre">max_size=None</span></em>, <em class="sig-param"><span class="pre">max_http_version='HTTP/1.1'</span></em>, <em class="sig-param"><span class="pre">protocol=&lt;class</span> <span class="pre">'eventlet.wsgi.HttpProtocol'&gt;</span></em>, <em class="sig-param"><span class="pre">server_event=None</span></em>, <em class="sig-param"><span class="pre">minimum_chunk_size=None</span></em>, <em class="sig-param"><span class="pre">log_x_forwarded_for=True</span></em>, <em class="sig-param"><span class="pre">custom_pool=None</span></em>, <em class="sig-param"><span class="pre">keepalive=True</span></em>, <em class="sig-param"><span class="pre">log_output=True</span></em>, <em class="sig-param"><span class="pre">log_format='%(client_ip)s</span> <span class="pre">-</span> <span class="pre">-</span> <span class="pre">[%(date_time)s]</span> <span class="pre">&quot;%(request_line)s&quot;</span> <span class="pre">%(status_code)s</span> <span class="pre">%(body_length)s</span> <span class="pre">%(wall_seconds).6f'</span></em>, <em class="sig-param"><span class="pre">url_length_limit=8192</span></em>, <em class="sig-param"><span class="pre">debug=True</span></em>, <em class="sig-param"><span class="pre">socket_timeout=None</span></em>, <em class="sig-param"><span class="pre">capitalize_response_headers=True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wsgi.server" title="Permalink to this definition">¶</a></dt>
<dd><p>Start up a WSGI server handling requests from the supplied server
socket. This function loops forever. The <em>sock</em> object will be
closed after server exits, but the underlying file descriptor will
@@ -126,13 +134,7 @@ Default is True.</p></li>
</dl>
</dd></dl>
-<dl class="py function">
-<dt id="eventlet.wsgi.format_date_time">
-<code class="sig-prename descclassname">eventlet.wsgi.</code><code class="sig-name descname">format_date_time</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">timestamp</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.wsgi.format_date_time" title="Permalink to this definition">¶</a></dt>
-<dd><p>Formats a unix timestamp into an HTTP standard string.</p>
-</dd></dl>
-
-<div class="section" id="ssl">
+<section id="ssl">
<span id="wsgi-ssl"></span><h2>SSL<a class="headerlink" href="#ssl" title="Permalink to this headline">¶</a></h2>
<p>Creating a secure server is only slightly more involved than the base example. All that’s needed is to pass an SSL-wrapped socket to the <a class="reference internal" href="#eventlet.wsgi.server" title="eventlet.wsgi.server"><code class="xref py py-func docutils literal notranslate"><span class="pre">server()</span></code></a> method:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">wsgi</span><span class="o">.</span><span class="n">server</span><span class="p">(</span><span class="n">eventlet</span><span class="o">.</span><span class="n">wrap_ssl</span><span class="p">(</span><span class="n">eventlet</span><span class="o">.</span><span class="n">listen</span><span class="p">((</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="mi">8090</span><span class="p">)),</span>
@@ -143,8 +145,8 @@ Default is True.</p></li>
</pre></div>
</div>
<p>Applications can detect whether they are inside a secure server by the value of the <code class="docutils literal notranslate"><span class="pre">env['wsgi.url_scheme']</span></code> environment variable.</p>
-</div>
-<div class="section" id="non-standard-extension-to-support-post-hooks">
+</section>
+<section id="non-standard-extension-to-support-post-hooks">
<h2>Non-Standard Extension to Support Post Hooks<a class="headerlink" href="#non-standard-extension-to-support-post-hooks" title="Permalink to this headline">¶</a></h2>
<p>Eventlet’s WSGI server supports a non-standard extension to the WSGI
specification where <code class="samp docutils literal notranslate"><span class="pre">env['eventlet.posthooks']</span></code> contains an array of
@@ -174,8 +176,8 @@ arguments for every request processed.</p>
fully sent to the client (or when the client disconnects early). One example is
for more accurate logging of bandwidth used, as client disconnects use less
bandwidth than the actual Content-Length.</p>
-</div>
-<div class="section" id="continue-response-headers">
+</section>
+<section id="continue-response-headers">
<h2>“100 Continue” Response Headers<a class="headerlink" href="#continue-response-headers" title="Permalink to this headline">¶</a></h2>
<p>Eventlet’s WSGI server supports sending (optional) headers with HTTP “100 Continue”
provisional responses. This is useful in such cases where a WSGI server expects
@@ -221,10 +223,11 @@ the API <code class="xref py py-func docutils literal notranslate"><span class="
in the wsgi test case <code class="docutils literal notranslate"><span class="pre">tests/wsgi_test.py</span></code>,
<code class="xref py py-func docutils literal notranslate"><span class="pre">test_024b_expect_100_continue_with_headers_multiple_chunked()</span></code> and
<code class="xref py py-func docutils literal notranslate"><span class="pre">test_024c_expect_100_continue_with_headers_multiple_nonchunked()</span></code>.</p>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -257,7 +260,7 @@ in the wsgi test case <code class="docutils literal notranslate"><span class="pr
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -282,14 +285,15 @@ in the wsgi test case <code class="docutils literal notranslate"><span class="pr
<li class="right" >
<a href="websocket.html" title="websocket – Websocket Server"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">wsgi</span></code> – WSGI server</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/modules/zmq.html b/doc/modules/zmq.html
index 8860839..7df2c4f 100644
--- a/doc/modules/zmq.html
+++ b/doc/modules/zmq.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>eventlet.green.zmq – ØMQ support &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="../_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>eventlet.green.zmq – ØMQ support &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="../_static/classic.css" />
- <script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
+ <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
- <script src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -34,8 +35,9 @@
<li class="right" >
<a href="wsgi.html" title="wsgi – WSGI server"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" accesskey="U">Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> – ØMQ support</a></li>
</ul>
</div>
@@ -44,7 +46,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="eventlet-green-zmq-omq-support">
+ <section id="eventlet-green-zmq-omq-support">
<h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> – ØMQ support<a class="headerlink" href="#eventlet-green-zmq-omq-support" title="Permalink to this headline">¶</a></h1>
<p><a class="reference internal" href="#module-zmq" title="zmq"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pyzmq</span></code></a> <a class="footnote-reference brackets" href="#id4" id="id1">1</a> is a python binding to the C++ ØMQ <a class="footnote-reference brackets" href="#id5" id="id2">2</a> library written in Cython <a class="footnote-reference brackets" href="#id6" id="id3">3</a>.
<code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> is greenthread aware version of <cite>pyzmq</cite>.</p>
@@ -59,9 +61,10 @@
<dd><p><a class="reference external" href="http://www.cython.org">http://www.cython.org</a></p>
</dd>
</dl>
-</div>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -84,7 +87,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -109,14 +112,15 @@
<li class="right" >
<a href="wsgi.html" title="wsgi – WSGI server"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
- <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="../index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-1"><a href="../modules.html" >Module Reference</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> – ØMQ support</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/objects.inv b/doc/objects.inv
index 7106c83..5536a7d 100644
--- a/doc/objects.inv
+++ b/doc/objects.inv
Binary files differ
diff --git a/doc/patching.html b/doc/patching.html
index 79d103f..235a5c8 100644
--- a/doc/patching.html
+++ b/doc/patching.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Greening The World &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Greening The World &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="design_patterns.html" title="Design Patterns"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Greening The World</a></li>
</ul>
</div>
@@ -43,11 +45,11 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="greening-the-world">
+ <section id="greening-the-world">
<h1>Greening The World<a class="headerlink" href="#greening-the-world" title="Permalink to this headline">¶</a></h1>
<p>One of the challenges of writing a library like Eventlet is that the built-in networking libraries don’t natively support the sort of cooperative yielding that we need. What we must do instead is patch standard library modules in certain key places so that they do cooperatively yield. We’ve in the past considered doing this automatically upon importing Eventlet, but have decided against that course of action because it is un-Pythonic to change the behavior of module A simply by importing module B.</p>
<p>Therefore, the application using Eventlet must explicitly green the world for itself, using one or both of the convenient methods provided.</p>
-<div class="section" id="import-green">
+<section id="import-green">
<span id="id1"></span><h2>Import Green<a class="headerlink" href="#import-green" title="Permalink to this headline">¶</a></h2>
<p>The first way of greening an application is to import networking-related libraries from the <code class="docutils literal notranslate"><span class="pre">eventlet.green</span></code> package. It contains libraries that have the same interfaces as common standard ones, but they are modified to behave well with green threads. Using this method is a good engineering practice, because the true dependencies are apparent in every file:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">eventlet.green</span> <span class="kn">import</span> <span class="n">socket</span>
@@ -57,8 +59,8 @@
</div>
<p>This works best if every library can be imported green in this manner. If <code class="docutils literal notranslate"><span class="pre">eventlet.green</span></code> lacks a module (for example, non-python-standard modules), then <a class="reference internal" href="#eventlet.patcher.import_patched" title="eventlet.patcher.import_patched"><code class="xref py py-func docutils literal notranslate"><span class="pre">import_patched()</span></code></a> function can come to the rescue. It is a replacement for the builtin import statement that greens any module on import.</p>
<dl class="py function">
-<dt id="eventlet.patcher.import_patched">
-<code class="sig-prename descclassname">eventlet.patcher.</code><code class="sig-name descname">import_patched</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">module_name</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">additional_modules</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kw_additional_modules</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.import_patched" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.patcher.import_patched">
+<span class="sig-prename descclassname"><span class="pre">eventlet.patcher.</span></span><span class="sig-name descname"><span class="pre">import_patched</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">module_name</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">additional_modules</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kw_additional_modules</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.import_patched" title="Permalink to this definition">¶</a></dt>
<dd><p>Imports a module in a greened manner, so that the module’s use of networking libraries like socket will use Eventlet’s green versions instead. The only required argument is the name of the module to be imported:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">eventlet</span>
<span class="n">httplib2</span> <span class="o">=</span> <span class="n">eventlet</span><span class="o">.</span><span class="n">import_patched</span><span class="p">(</span><span class="s1">&#39;httplib2&#39;</span><span class="p">)</span>
@@ -77,14 +79,14 @@
</div>
</dd></dl>
-</div>
-<div class="section" id="monkeypatching-the-standard-library">
+</section>
+<section id="monkeypatching-the-standard-library">
<span id="monkey-patch"></span><h2>Monkeypatching the Standard Library<a class="headerlink" href="#monkeypatching-the-standard-library" title="Permalink to this headline">¶</a></h2>
<p>The other way of greening an application is simply to monkeypatch the standard
library. This has the disadvantage of appearing quite magical, but the advantage of avoiding the late-binding problem.</p>
<dl class="py function">
-<dt id="eventlet.patcher.monkey_patch">
-<code class="sig-prename descclassname">eventlet.patcher.</code><code class="sig-name descname">monkey_patch</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">os</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">select</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">socket</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">thread</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">time</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">psycopg</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.monkey_patch" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.patcher.monkey_patch">
+<span class="sig-prename descclassname"><span class="pre">eventlet.patcher.</span></span><span class="sig-name descname"><span class="pre">monkey_patch</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">os</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">select</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">socket</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thread</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">time</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">psycopg</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.monkey_patch" title="Permalink to this definition">¶</a></dt>
<dd><p>This function monkeypatches the key system modules by replacing their key elements with green equivalents. If no arguments are specified, everything is patched:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">eventlet</span>
<span class="n">eventlet</span><span class="o">.</span><span class="n">monkey_patch</span><span class="p">()</span>
@@ -101,18 +103,19 @@ library. This has the disadvantage of appearing quite magical, but the advantag
</dd></dl>
<dl class="py function">
-<dt id="eventlet.patcher.is_monkey_patched">
-<code class="sig-prename descclassname">eventlet.patcher.</code><code class="sig-name descname">is_monkey_patched</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">module</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.is_monkey_patched" title="Permalink to this definition">¶</a></dt>
+<dt class="sig sig-object py" id="eventlet.patcher.is_monkey_patched">
+<span class="sig-prename descclassname"><span class="pre">eventlet.patcher.</span></span><span class="sig-name descname"><span class="pre">is_monkey_patched</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">module</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.patcher.is_monkey_patched" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns whether or not the specified module is currently monkeypatched. <em>module</em> can either be the module itself or the module’s name.</p>
<blockquote>
<div><p>Based entirely off the name of the module, so if you import a module some other way than with the import keyword (including <a class="reference internal" href="#eventlet.patcher.import_patched" title="eventlet.patcher.import_patched"><code class="xref py py-func docutils literal notranslate"><span class="pre">import_patched()</span></code></a>), is_monkey_patched might not be correct about that particular module.</p>
</div></blockquote>
</dd></dl>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -144,7 +147,7 @@ library. This has the disadvantage of appearing quite magical, but the advantag
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -169,13 +172,14 @@ library. This has the disadvantage of appearing quite magical, but the advantag
<li class="right" >
<a href="design_patterns.html" title="Design Patterns"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Greening The World</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/py-modindex.html b/doc/py-modindex.html
index e349f1e..37b91f9 100644
--- a/doc/py-modindex.html
+++ b/doc/py-modindex.html
@@ -1,18 +1,18 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Python Module Index &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Python Module Index &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -29,7 +29,8 @@
<li class="right" >
<a href="#" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
</ul>
</div>
@@ -132,6 +133,7 @@
</table>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -141,7 +143,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -160,13 +162,14 @@
<li class="right" >
<a href="#" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Python Module Index</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/search.html b/doc/search.html
index ad1b8d8..ba6fd29 100644
--- a/doc/search.html
+++ b/doc/search.html
@@ -1,21 +1,22 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Search &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>Search &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<script src="_static/searchtools.js"></script>
+ <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
<script src="searchindex.js" defer></script>
@@ -31,7 +32,8 @@
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search</a></li>
</ul>
</div>
@@ -41,6 +43,7 @@
<div class="body" role="main">
<h1 id="search-documentation">Search</h1>
+
<div id="fallback" class="admonition warning">
<script>$('#fallback').hide();</script>
<p>
@@ -48,20 +51,28 @@
functionality.
</p>
</div>
+
+
<p>
Searching for multiple words only shows matches that contain
all words.
</p>
+
+
<form action="" method="get">
- <input type="text" name="q" aria-labelledby="search-documentation" value="" />
+ <input type="text" name="q" aria-labelledby="search-documentation" value="" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
+
+
<div id="search-results">
</div>
+
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -80,13 +91,14 @@
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Search</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/searchindex.js b/doc/searchindex.js
index 874ec39..f357a11 100644
--- a/doc/searchindex.js
+++ b/doc/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["authors","basic_usage","changelog","design_patterns","environment","examples","history","hubs","index","modules","modules/backdoor","modules/corolocal","modules/dagpool","modules/db_pool","modules/debug","modules/event","modules/greenpool","modules/greenthread","modules/pools","modules/queue","modules/semaphore","modules/timeout","modules/websocket","modules/wsgi","modules/zmq","patching","ssl","testing","threading","zeromq"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":2,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,sphinx:56},filenames:["authors.rst","basic_usage.rst","changelog.rst","design_patterns.rst","environment.rst","examples.rst","history.rst","hubs.rst","index.rst","modules.rst","modules/backdoor.rst","modules/corolocal.rst","modules/dagpool.rst","modules/db_pool.rst","modules/debug.rst","modules/event.rst","modules/greenpool.rst","modules/greenthread.rst","modules/pools.rst","modules/queue.rst","modules/semaphore.rst","modules/timeout.rst","modules/websocket.rst","modules/wsgi.rst","modules/zmq.rst","patching.rst","ssl.rst","testing.rst","threading.rst","zeromq.rst"],objects:{"":{zmq:[24,1,0,"-"]},"eventlet.backdoor":{SocketConsole:[10,0,1,""],backdoor:[10,3,1,""],backdoor_server:[10,3,1,""]},"eventlet.backdoor.SocketConsole":{"switch":[10,2,1,""]},"eventlet.corolocal":{get_ident:[11,3,1,""],local:[11,0,1,""]},"eventlet.dagpool":{Collision:[12,4,1,""],DAGPool:[12,0,1,""],PropagateError:[12,4,1,""]},"eventlet.dagpool.DAGPool":{__getitem__:[12,2,1,""],__init__:[12,2,1,""],get:[12,2,1,""],items:[12,2,1,""],keys:[12,2,1,""],kill:[12,2,1,""],post:[12,2,1,""],running:[12,2,1,""],running_keys:[12,2,1,""],spawn:[12,2,1,""],spawn_many:[12,2,1,""],wait:[12,2,1,""],wait_each:[12,2,1,""],wait_each_exception:[12,2,1,""],wait_each_success:[12,2,1,""],waitall:[12,2,1,""],waiting:[12,2,1,""],waiting_for:[12,2,1,""]},"eventlet.db_pool":{BaseConnectionPool:[13,0,1,""],ConnectTimeout:[13,4,1,""],ConnectionPool:[13,5,1,""],DatabaseConnector:[13,0,1,""],GenericConnectionWrapper:[13,0,1,""],PooledConnectionWrapper:[13,0,1,""],RawConnectionPool:[13,0,1,""],TpooledConnectionPool:[13,0,1,""],cleanup_rollback:[13,3,1,""]},"eventlet.db_pool.BaseConnectionPool":{clear:[13,2,1,""],get:[13,2,1,""],item:[13,2,1,""],put:[13,2,1,""]},"eventlet.db_pool.DatabaseConnector":{credentials_for:[13,2,1,""],get:[13,2,1,""]},"eventlet.db_pool.GenericConnectionWrapper":{affected_rows:[13,2,1,""],autocommit:[13,2,1,""],begin:[13,2,1,""],change_user:[13,2,1,""],character_set_name:[13,2,1,""],close:[13,2,1,""],commit:[13,2,1,""],cursor:[13,2,1,""],dump_debug_info:[13,2,1,""],errno:[13,2,1,""],error:[13,2,1,""],errorhandler:[13,2,1,""],insert_id:[13,2,1,""],literal:[13,2,1,""],ping:[13,2,1,""],query:[13,2,1,""],rollback:[13,2,1,""],select_db:[13,2,1,""],server_capabilities:[13,2,1,""],set_character_set:[13,2,1,""],set_isolation_level:[13,2,1,""],set_server_option:[13,2,1,""],set_sql_mode:[13,2,1,""],show_warnings:[13,2,1,""],shutdown:[13,2,1,""],sqlstate:[13,2,1,""],stat:[13,2,1,""],store_result:[13,2,1,""],string_literal:[13,2,1,""],thread_id:[13,2,1,""],use_result:[13,2,1,""],warning_count:[13,2,1,""]},"eventlet.db_pool.PooledConnectionWrapper":{close:[13,2,1,""]},"eventlet.db_pool.RawConnectionPool":{connect:[13,2,1,""],create:[13,2,1,""]},"eventlet.db_pool.TpooledConnectionPool":{connect:[13,2,1,""],create:[13,2,1,""]},"eventlet.debug":{format_hub_listeners:[14,3,1,""],format_hub_timers:[14,3,1,""],hub_blocking_detection:[14,3,1,""],hub_exceptions:[14,3,1,""],hub_listener_stacks:[14,3,1,""],hub_prevent_multiple_readers:[14,3,1,""],hub_timer_stacks:[14,3,1,""],spew:[14,3,1,""],tpool_exceptions:[14,3,1,""],unspew:[14,3,1,""]},"eventlet.event":{Event:[15,0,1,""]},"eventlet.event.Event":{ready:[15,2,1,""],send:[15,2,1,""],send_exception:[15,2,1,""],wait:[15,2,1,""]},"eventlet.greenpool":{GreenPile:[16,0,1,""],GreenPool:[16,0,1,""]},"eventlet.greenpool.GreenPile":{next:[16,2,1,""],spawn:[16,2,1,""]},"eventlet.greenpool.GreenPool":{free:[16,2,1,""],imap:[16,2,1,""],resize:[16,2,1,""],running:[16,2,1,""],spawn:[16,2,1,""],spawn_n:[16,2,1,""],starmap:[16,2,1,""],waitall:[16,2,1,""],waiting:[16,2,1,""]},"eventlet.greenthread":{GreenThread:[17,0,1,""],kill:[17,3,1,""],sleep:[17,3,1,""],spawn:[17,3,1,""],spawn_after:[17,3,1,""],spawn_after_local:[17,3,1,""],spawn_n:[17,3,1,""]},"eventlet.greenthread.GreenThread":{cancel:[17,2,1,""],kill:[17,2,1,""],link:[17,2,1,""],unlink:[17,2,1,""],wait:[17,2,1,""]},"eventlet.hubs":{get_default_hub:[7,3,1,""],get_hub:[7,3,1,""],trampoline:[7,3,1,""],use_hub:[7,3,1,""]},"eventlet.patcher":{import_patched:[25,3,1,""],is_monkey_patched:[25,3,1,""],monkey_patch:[25,3,1,""]},"eventlet.pools":{Pool:[18,0,1,""],TokenPool:[18,0,1,""]},"eventlet.pools.Pool":{create:[18,2,1,""],free:[18,2,1,""],get:[18,2,1,""],item:[18,2,1,""],put:[18,2,1,""],resize:[18,2,1,""],waiting:[18,2,1,""]},"eventlet.pools.TokenPool":{create:[18,2,1,""]},"eventlet.queue":{Empty:[19,4,1,""],Full:[19,4,1,""],LifoQueue:[19,0,1,""],LightQueue:[19,0,1,""],PriorityQueue:[19,0,1,""],Queue:[19,0,1,""]},"eventlet.queue.LightQueue":{empty:[19,2,1,""],full:[19,2,1,""],get:[19,2,1,""],get_nowait:[19,2,1,""],getting:[19,2,1,""],put:[19,2,1,""],put_nowait:[19,2,1,""],putting:[19,2,1,""],qsize:[19,2,1,""],resize:[19,2,1,""]},"eventlet.queue.Queue":{join:[19,2,1,""],task_done:[19,2,1,""]},"eventlet.semaphore":{BoundedSemaphore:[20,0,1,""],CappedSemaphore:[20,0,1,""],Semaphore:[20,0,1,""]},"eventlet.semaphore.BoundedSemaphore":{release:[20,2,1,""]},"eventlet.semaphore.CappedSemaphore":{acquire:[20,2,1,""],balance:[20,2,1,""],bounded:[20,2,1,""],locked:[20,2,1,""],release:[20,2,1,""]},"eventlet.semaphore.Semaphore":{acquire:[20,2,1,""],balance:[20,2,1,""],bounded:[20,2,1,""],locked:[20,2,1,""],release:[20,2,1,""]},"eventlet.timeout":{Timeout:[21,0,1,""],with_timeout:[21,3,1,""]},"eventlet.timeout.eventlet.timeout.Timeout.Timeout":{cancel:[21,2,1,""],pending:[21,5,1,""]},"eventlet.tpool":{Proxy:[28,0,1,""],execute:[28,3,1,""]},"eventlet.websocket":{WebSocket:[22,0,1,""],WebSocketWSGI:[22,0,1,""]},"eventlet.websocket.WebSocket":{close:[22,2,1,""],send:[22,2,1,""],wait:[22,2,1,""]},"eventlet.wsgi":{format_date_time:[23,3,1,""],server:[23,3,1,""]},eventlet:{GreenPile:[1,0,1,""],GreenPool:[1,0,1,""],Queue:[1,0,1,""],StopServe:[1,0,1,""],Timeout:[1,0,1,""],backdoor:[10,1,0,"-"],connect:[1,3,1,""],corolocal:[11,1,0,"-"],dagpool:[12,1,0,"-"],db_pool:[13,1,0,"-"],debug:[14,1,0,"-"],event:[15,1,0,"-"],greenpool:[16,1,0,"-"],greenthread:[17,1,0,"-"],import_patched:[1,3,1,""],listen:[1,3,1,""],monkey_patch:[1,3,1,""],pools:[18,1,0,"-"],queue:[19,1,0,"-"],serve:[1,3,1,""],sleep:[1,3,1,""],spawn:[1,3,1,""],spawn_after:[1,3,1,""],spawn_n:[1,3,1,""],tpool:[28,1,0,"-"],websocket:[22,1,0,"-"],wrap_ssl:[1,3,1,""],wsgi:[23,1,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","module","Python module"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:module","2":"py:method","3":"py:function","4":"py:exception","5":"py:attribute"},terms:{"001s":27,"0mq":29,"22e9de1d7957":2,"5c0322dc559bf":2,"8mib":[2,22],"94p2":2,"9p9m":2,"\u00f8mq":[8,9],"abstract":[15,16,29],"boolean":23,"break":[2,3,5,27],"byte":[2,5,23,29],"case":[0,2,3,5,7,12,13,18,19,20,21,23,25,26,27,28,29],"catch":[2,12,21],"class":[1,2,7,8,9,10,11,12,13,15,16,17,18,21,22,23,25,28],"default":[2,7,12,13,17,19,20,21,22,23,27,28],"export":23,"final":[2,5,12,13,21],"float":[14,15,17,21],"function":[2,3,5,8,10,12,13,14,16,17,18,21,22,23,25,27,28],"hron\u010dok":2,"import":[0,1,2,3,5,6,7,8,10,12,13,15,18,22,23,26,27,28],"int":21,"kobli\u017eek":0,"long":[2,10,13,14,16,21,23],"new":[1,2,3,5,10,12,13,15,16,18,19,20,26,28],"nov\u00fd":0,"ond\u0159ej":0,"pi\u00ebt":0,"public":2,"return":[1,2,3,5,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,28],"short":[5,14],"static":3,"switch":[2,7,10,17,28],"throw":15,"transient":2,"true":[1,2,3,5,7,12,14,15,17,19,20,21,23,25,28],"try":[2,5,12,13,14,15,21,25],"villac\u00ed":[0,2],"while":[2,3,5,12,15,23,28,29],Added:2,Adding:2,But:[2,12,14],DNS:2,DOS:22,DoS:[2,3],Doing:[12,25],For:[1,5,12,15,17,19,23,26,27],Has:1,Its:12,NOT:17,Not:[2,5,12,27],One:[3,12,23,25,27],That:[3,12,27],The:[0,1,2,3,4,5,7,8,10,12,13,14,15,16,17,18,19,20,22,23,27,28],Then:12,There:[2,3,16,18,20,21,27],These:[1,4,12,27],Use:[0,2,7,15,17,22],Used:[2,4,15,19,23],Useful:11,Using:[3,8,25],With:[2,8,12,28,29],__all__:10,__class__:12,__del__:2,__doc__:10,__enter__:2,__exit__:2,__file__:5,__future__:5,__getitem:12,__getitem__:12,__init__:[2,12],__main__:[5,7],__name__:[5,10,12],__set__:2,__str__:2,__version__:2,_at_fork_reinit:2,_exc:15,_exit_func:2,_imp:2,_main_wrapp:2,_queuelock:2,_recv_loop:2,_socket_nodn:0,aayush:0,abil:[2,25,27],abl:[1,6,17,21,23],abort:[1,2,17,21],about:[2,3,5,6,10,12,14,15,23,25,27],abov:[10,12,23],abramowitz:0,absenc:0,accept:[0,1,2,3,4,5,10,12,13,18,23,26,29],access:[1,2,10,27,28],accident:[1,3],accompani:23,account:[2,20],accumul:[0,2],accur:23,achiev:[14,28],acquir:[0,2,20],across:[2,19],act:[5,18],action:25,activ:[10,23],actor:2,actual:[5,12,18,23],acycl:12,adamkg:0,add:[1,2,5],added:[2,6,19],adding:[0,2],addit:[13,14,17,21,23],addition:2,additional_modul:[1,25],addl:29,addr:[1,5,26],address:[1,2,3,5,12,23],addressfamili:1,adjust:18,adopt:2,advanc:4,advantag:[1,25,26],advic:0,advis:16,advisori:2,af_inet:[1,26],affect:18,affected_row:13,affin:2,afford:[1,25],after:[1,2,6,12,13,14,17,20,21,23,27],again:[2,7,12,13,15,20],against:[2,14,25],aggreg:3,agnost:13,agusto:2,aha:12,aka:12,alaniz:0,alanp:2,aldona:0,alex:[0,2],alexei:[0,2],alexi:[0,2],alia:[12,13],alik:13,all:[1,2,3,5,6,12,13,15,16,17,19,22,23,26,27],allow:[0,1,2,12,13,16,22,23,29],along:2,alreadi:[2,3,5,12,13,15,16,17,18,22,23,28],already_handl:2,also:[1,2,3,6,7,12,16,22,23,25,28],alter:2,altern:[2,12],although:[2,12],alvarez:2,alwai:[2,12,19,21,23],amajorek:2,ambroff:[0,2],amen:28,amount:[1,3,13,16],andrei:[0,2],andrew:0,ani:[1,3,4,5,6,7,12,13,14,16,17,18,21,23,25,27,28],annot:27,announc:25,annoy:1,anonym:0,anoth:[1,2,7,12,15,17,20,26],answer:[2,12],anthoni:0,antonio:[0,2],anymor:2,anyth:[1,12],anywai:2,api:[2,7,8,13,19,20,23],app:[2,3,5],appar:25,appear:[2,25],append:23,appli:[2,3],applic:[1,2,3,5,7,10,12,14,21,22,23,25],appreci:0,approach:25,appropri:[2,12,27],arbitrari:[12,15],arg1:23,arg2:23,arg:[1,2,10,12,13,15,16,17,19,21,23,28],argument:[0,1,2,3,7,9,10,12,14,15,16,17,18,20,21,22,23,25],armstrong:2,around:[1,2],arrai:23,arrang:[5,15,17],arriv:12,artur:[0,2],ashutosh:[0,2],ask:[2,12],aspect:[3,25],assertionerror:15,assign:2,associ:[2,12,16],astrum:[0,2],asynchat:2,asynchron:[2,13,29],asyncor:25,atle:0,atom:29,attack:22,attempt:[12,20],attent:0,attribut:[2,12,28],attributeerror:2,authent:13,author:[2,8,29],auto:2,autocommit:13,automat:[2,7,25],autowrap:28,autowrap_nam:28,avail:[1,2,7,8,12,13,16,17,18,19,22],averi:2,avoid:[2,12,15,25],awai:[6,17,27],awaken:20,awar:[1,2,12,21,24],awesom:27,ayncor:2,azhar:[0,2],bachri:[0,2],back:[2,5,7,13,18,22,23],backbon:6,backdoor:[2,8,9],backdoor_serv:10,backend:7,backlog:[1,2],backtrac:2,backward:2,bad:[2,3,12],badli:29,balanc:20,ballanc:0,ban:3,bando:0,bandwidth:23,bar:23,bare:3,barton:[0,2],base:[2,5,6,7,13,23,25,27],baseconn:13,baseconnectionpool:[2,13],baseexcept:[21,23],basehttpserv:25,basi:[0,2,7,13,15,23],basic:[3,8],baz:15,bean:6,becam:6,becaus:[1,2,3,4,7,12,19,20,22,25,27],becciu:2,becom:[3,12,13,16,20,23],been:[0,2,7,10,12,13,19,21,22,23],befor:[2,4,7,10,12,13,18,20,21,23,25,28],began:6,begin:[4,7,13],behav:[1,2,10,12,19,20,23,25,28],behavior:[1,2,3,4,12,14,16,17,20,22,25],behaviour:2,being:[1,2,5,7,14,17,29],beislei:0,below:16,ben:[0,2],benchmark:2,bend:2,benefit:[13,25],bennett:[0,2],benoit:[0,2],best:[7,18,25,27],beta:[3,5,8],better:[0,2,14],between:[0,1,2,3,10,12,15,27,28],beyond:7,bidirect:5,big:27,bilenko:0,bin:[2,5],bind:[1,2,12,24,25,26,27,29],bit:13,bitbucket:[0,2],blank:2,block:[1,2,3,6,10,12,13,14,16,18,19,20,21,26,28],block_on:2,blockingli:20,board:2,bob:[0,6],bodi:[2,3,5,8,10,23,26],body_length:23,boil:3,bombard:29,book:[2,29],bool:13,borzenkov:[0,2],both:[2,12,13,19,25,27],bound:[3,20,23,29],boundedsemaphor:[2,20],branch:[2,25],brandon:2,brantlei:0,brett:2,brian:[0,2],broadcast:5,broken:[2,5,22],brought:2,brows:2,browser:[5,22],brunswick:[0,2],brutal:5,bruynoogh:[0,2],bryan:0,buffer:[0,2],buflen:2,bufsiz:2,bug:[2,8,20],bugfix:2,build:[2,10,12,18],build_product_for_kei:12,builder:12,built:[1,2,7,25,26],builtin:[2,25],bulg:29,bunch:[1,2,3,5,8,13,15,16,25,27],bundl:2,burk:[0,2],busi:[0,2],busywait:2,ca_cert:1,cach:0,cadefault:0,cafil:0,calcul:17,call:[1,2,3,4,5,7,10,12,13,14,15,16,17,18,19,20,21,22,23,25,27,28],call_aft:2,callabl:[2,12,21],callback:[2,5],calledprocesserror:2,caller:[2,10,12,13,17,18,21],can:[0,1,2,3,4,5,7,10,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],cancel:[1,2,17,21],cannot:[18,21,23],canon:[3,17],capabl:5,capac:[16,20],capath:0,capit:2,capitalize_response_head:[2,23],cappedsemaphor:20,care:3,carlisl:0,carter:0,categor:12,caus:[2,3,7,12,13,15,17,18,23],cavanaugh:[0,2],caveat:[13,21],ccp:2,ceas:6,cert:[23,26],cert_req:1,certain:[1,2,12,25],certfil:23,certif:26,cesar:[0,2],cflag:12,cgi:2,cgihttpserv:2,chain:12,challeng:25,chanc:[0,1,14],chang:[2,3,7,10,12,14,16,22,25,27],changbo:0,change_us:13,channel:[2,19],character_set_nam:13,characterist:23,chase:12,chat:[0,2,8],chat_serv:5,chatserv:5,cheap:1,check:[1,2,12,13,18,20,21],chesneau:0,chet:0,child:2,children:0,chri:[0,2],christofi:[0,2],christoph:[0,2],chrome:2,chronolog:12,chu:0,chuck:0,chunk:[0,1,2,23],chunked_encod:2,chunkreaderror:2,chwagssd:2,circular:2,clad:29,clai:[0,2],classmethod:13,clean:2,cleaner:2,cleanup:[2,13],cleanup_rollback:13,clear:[2,13,14],cleaton:[0,2],clever:1,client:[0,1,2,5,8,10,14,22,23,26,27,29],client_addr:1,client_conn:26,client_ip:23,client_sock:[1,27],clock:2,clone:2,close:[0,1,2,5,13,22,23,26],closed_callback:5,closer:2,closur:22,code:[0,1,2,3,5,7,8,12,14,21,22,23,27,28],coexist:22,collect:[3,5,13,23,28],collin:[0,2],collis:12,com:[2,3,5,6,8,13,21,24,26],come:[2,3,12,23,25,28],comic:29,command:[5,10,26,27],comment:2,commit:13,common:[1,2,3,7,12,25,28],commun:[1,2,3,15,23,28],comparison:[2,29],compat:[0,2,13,20,28],compil:[5,12],complet:[1,2,3,7,12,16,17,19,23,25,27,28],complex:3,complianc:2,complic:12,concaten:3,concept:[1,6],concurr:[1,3,5,8,12,13,16,18,28],condit:2,configur:[2,7,12,26,28],confin:28,conform:0,conjunct:[14,28],conn:13,conn_info:10,conn_pool:13,connect:[1,2,3,8,9,10,22,23,26,27,28,29],connect_ex:2,connect_tcp:2,connect_timeout:13,connectionpool:13,connecttimeout:13,conserv:1,consid:[7,12,14,25],consist:[1,2,20,27],consol:[10,27],constant:[2,16],constern:12,constrain:12,construct:[1,3,4,12,13,16,17,18],constructor:[2,9],consult:2,consum:[1,2,3,8,12,16,18,19],contact:2,contain:[2,3,5,12,13,14,17,18,23,25,27,28],content:[2,3,5,9,23],context:[1,2,17,18,20,26],contin:2,continu:[0,2,9,10,12],contrast:12,contribut:[0,12],contributor:8,contriv:3,control:[3,4,5,7,8,17,25],conveni:[0,2,3,8,10,16,21,22,25,27],convent:[27,29],convert:[1,2,22],cooper:[1,3,10,13,17,18,21,25,28],coordin:5,copi:[2,5,27],copyright:[2,10],core:2,corei:[0,2],coro:2,coroloc:[2,8,9],corotwin:2,coroutin:[1,2,5,6,7,8,9,15,17,18,28],coroutinepool:2,correct:[0,2,12,25,27],correctli:[0,2],correspond:[12,13,18],corrupt:1,cosmic:29,cost:28,costa:[0,2],could:[2,3,5,6,12],count:[2,19,20],counter:20,counterpart:26,coupl:12,cours:[5,12,25],courtesi:2,cover:27,coverag:[2,8],cpu:[2,21],cpython:[2,8],crash:[2,5],crawl:5,crawler:[3,8],creat:[3,13,15,16,17,18,19,22,23,26],create_connect:2,creation:[1,13],credenti:13,credentials_for:13,credit:10,critic:14,cross:[8,9,28],crt:23,ctrl:5,cuni:[0,2],current:[0,1,2,7,8,10,11,12,13,14,15,16,17,19,20,21,25,27,28],current_s:2,current_thread:2,curri:17,curried_arg:17,curried_kwarg:17,cursor:[13,28],custom:[1,2,23],custom_pool:23,customiz:2,cycl:[15,18],cython:24,dag:12,dagpool:[2,8,9],dagu:[0,2],dai:[6,26],daisuk:[0,2],dan:2,danc:2,daniel:[0,2,25],daringfirebal:5,darwin:2,data:[0,1,2,3,5,12,14,19,21,23],databas:[8,9,28],databaseconnector:9,datagram:29,date_tim:23,davanum:[0,2],dave:0,david:[0,2],davoian:0,db_modul:13,db_pool:[2,8,9],dbapi:[8,9],dbfbfc818e3d:2,dbname:13,dead:10,deadlock:[2,12,16],deal:2,death:2,debug:[0,2,8,9,10,11,17,23],decid:[13,25],decis:23,decod:5,decor:[2,22],decoupl:12,decrement:20,def:[1,3,5,8,12,15,16,17,18,22,23,28],defaultselector:2,defer:2,defin:[18,23,25],deflat:[0,2],del:2,delai:[1,17],delet:2,deliv:[12,19],deliveri:[2,12,29],delport:0,demand:13,demo:5,demonstr:5,deni:0,denomin:7,dep:12,depend:[0,1,2,5,6,7,8,9,13,25,26,29],deprec:[2,7,8,23],deprecationwarn:2,depth:2,deriv:25,derk:[0,2],desc:10,descriptor:[2,7,14,23],deseri:22,design:[1,8,27],desir:[1,6,7,12,17,18,28],despit:2,dest:5,destin:13,destroi:5,detail:[1,2,14,22],detect:[0,2,14,23,27],detector:[2,14],determin:[12,13,14],deva:0,develop:[2,6,22],devpol:2,devpollselector:2,diagnos:12,diagnosi:0,dict:[10,12],dictionari:[2,10,13,23],did:[2,12],didn:3,differ:[0,1,3,5,12,15,16,19,20,22,28,29],difficult:12,dir:10,direct:[12,20],directli:[1,12,13,15,17,21,27],directori:[5,6,26,27],dirnam:5,disabl:[2,7,17,23],disadvantag:25,discard:[2,12],disconnect:[2,5,23],discov:12,discret:29,disguis:29,dispatch:[5,7,8,27],distinct:12,distinguish:[2,12],distract:2,distribut:27,dmitri:[0,2],dmitrii:[0,2],dns:2,dnspython:[0,2],do_handshake_connect:2,do_handshake_on_connect:1,do_some_stuff:20,do_someth:16,doc:[2,20,26],docstr:2,doctest:8,document:[0,1,2,7,15,22],doe:[2,5,7,10,12,14,18,20,27],doesn:[2,3,5,7,12,13,20,21,25,27],doing:[1,2,3,7,14,15,16,17,25],don:[1,2,3,5,12,14,23,25,27],donagh:2,done:[0,1,2,3,5,13,18,20,25],donovan:[0,2,6],dostuff:18,doubl:[0,2],down:[0,2,3,19],download:27,downstream:12,dprog:12,draft:2,dramat:3,driven:[2,8,9,23],drop:[2,16,19],drug:29,due:[2,20],dump:27,dump_debug_info:13,dup:[0,2,23],duplex:2,duplic:2,dure:[2,6,13,25,27],dweimer:2,each:[1,2,3,7,10,12,16,19,23,27,28],eai_nodata:2,earli:[2,16,23,25],easi:[2,3,7,23,26,27],easier:[2,5,12,27],easili:[3,13],easy_instal:2,echo:[3,8],echoserv:[2,5],edward:[0,2],eexist:2,effect:[5,12,13,29],effici:2,effort:14,either:[7,12,13,17,18,21,25,26,29],elabor:[22,23],elaps:[1,7,17],element:[3,25],elif:5,elig:17,elimin:[2,7],els:[2,5,12,17,19,21],emb:2,embed:23,emit:27,empti:[2,5,12,18,19,21,22,23],en_al:[3,5,8],enabl:[2,7],enchant:[0,2],encod:[0,2,22],encount:12,encrypt:23,end:5,endless:2,endpoint:29,engin:25,enotconn:2,enough:[16,27],enqueu:19,ensur:[1,2,7,12],enter:12,enthusiast:2,entir:[15,25,27],entri:[2,13,19,20],enum34:2,enumer:12,env:[2,5,23],environ:[0,2,3,5,7,8,22,23,27,28],environment:27,eof:5,epol:[2,7,27],epollselector:2,equal:[0,20],equival:[4,21,25],era:29,erdfelt:[0,2],erenst:[0,2],eric:[0,2],erpc:2,err:12,errno:[13,22],error:[0,2,5,13,15,22,23],errorhandl:13,especi:[2,14],essenc:[1,12],essenti:3,etc:2,eugen:0,evalu:27,even:[2,12,17,23],evenlet:23,event:[0,2,7,8,9,14,23,29],eventlet:[0,1,2,3,4,5,6,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,28,29],eventlet_hub:[2,4,7,27],eventlet_no_greendn:2,eventlet_threadpool_s:[4,28],eventlet_tpool_dn:2,eventlet_tpool_gethostbynam:2,eventu:12,everi:[1,2,5,7,12,13,14,19,20,23,25,28],everyth:[1,2,12,25,27],everywher:7,evid:3,evt:[2,15],exact:[0,2,29],exactli:[2,12,20,25,26],exampl:[0,1,2,3,8,13,15,17,21,22,23,25,26,27,28],exc:[2,12,15],exc_aft:2,exc_info:[2,15,17],exce:[13,18,20],exceed:[2,23],except:[0,1,2,3,5,13,14,15,16,17,19,21,23,25,29],exceptionsubclass:12,excess:[1,2,22],exec:2,execut:[1,2,3,10,13,14,16,17,21,23,27,28],execv:2,exercis:[5,27],exist:[1,2,7,12,13,16,18,27],exit:[2,5,16,17,23],expect:[2,23],expens:17,expir:2,expiri:2,explain:2,explicit:[2,12,13],explicitli:[1,2,7,12,17,25],express:[17,18],extens:[0,2,9],extern:[2,3,6,12],extrem:16,face:1,fact:[3,12],factor:27,fai:2,fail:[2,4,12,21,27],failur:[2,12],fall:3,fals:[1,2,5,12,14,17,18,19,20,21,23],famili:1,farm:[5,16],fashion:[2,26],fast:2,faster:[1,17,19],fastest:[7,17],favo:[0,2],favor:2,fcntl:2,fds:2,featur:[1,2,5,21,23],feed:[3,8],feedpars:[3,5],feedscrap:[3,5],feng:0,fetch:[3,5,8,19,26],fetch_titl:[3,5],fetish:29,few:[2,3,4,6,22,25],fewer:[1,2],field:[2,23],figur:[0,14],file:[2,3,5,7,14,15,16,22,23,25,27],filenam:[16,27],filter:12,find:[1,8,12,22,23],findit:5,fine:[7,25],finer:27,finish:[12,16,17,23],finit:[1,17],fire:2,first:[1,2,4,7,12,13,17,18,19,21,25,26],five:12,fix:[0,2,12],flag:[0,2,12,21],flori:[0,2],flow:12,flush:[2,5],follow:[2,12,17,22,23,26,27],foo:[2,23,27],foo_class_test:27,foo_test:27,forbidden:5,forc:[4,28],forcibl:22,ford:[0,2],forestal:2,forev:[12,23],forgot:12,forgotten:7,fork:[2,6],form:[7,19],format:[12,14,15,23,27],format_date_tim:23,format_hub_listen:14,format_hub_tim:14,formerli:19,forth:[12,22],fortun:[25,28],forward:[2,6,8,23,28],found:[5,19],fraction:[15,17],frame:[2,17,22],framework:[5,6,7],free:[1,13,16,18,19],freebsd:2,friendli:1,from:[0,1,2,3,5,7,8,10,12,13,14,15,16,17,18,19,22,23,25,26,27,28,29],from_brows:22,ftplib:2,fukuchi:[0,2],full:[2,3,19,22,23,27],fuller:2,fulli:[2,5,23],func:[1,16,17,21,23],functool:18,fund:2,fundament:1,further:29,furthermor:2,futur:[2,8],gao:2,garbag:13,garcia:2,garth:2,gasp:3,gaynor:2,gcb:0,gener:[1,2,8,9,12,13,15,17,22,23,27,29],genericconnectionwrapp:13,genrsa:26,geoff:[0,2],geoffrei:[0,2],georg:[0,2],gerrard:[0,2],get:[0,1,2,3,5,6,7,12,13,14,16,17,18,19,20,21,27,29],get_default_hub:[2,7],get_hub:[2,7],get_id:[11,28],get_nowait:19,getaddrinfo:2,getattr:2,gethostbynam:[2,5],getsocknam:27,getsockopt:[0,2],geturl:5,gevent:2,gevorg:0,gholt:2,ghsa:2,gif:[3,5,8],gigabyt:3,github:[2,24],give:[0,2,13,18],given:[3,7,10,12,13,14,16,17,19,20,22],global:[1,2,3],goal:1,godwin:0,goe:19,goetz:[0,2],gogreen:0,gohad:[0,2],going:14,gone:2,good:[0,1,3,5,7,15,17,23,25],goodspe:[0,2],googl:[2,3,5,8,21,26],got:[3,5,8,12,13,18],gotten:[12,19],govern:14,grace:[2,5,22],gracefulli:1,grainger:[0,2],grammat:2,grant:[0,2],granular:27,graph:12,great:[0,5],greater:[14,18,20],greatli:0,green:[0,1,2,3,5,8,9,23,26,28,29],green_fileobject:2,greendn:2,greenfil:2,greenfileio:2,greenio:2,greenlet:[2,6,7,10,11,14,17,19,23,28],greenletcontext:2,greenletexit:[17,23],greenlib:2,greenpil:[1,2,3,5,16],greenpip:2,greenpool:[1,2,3,5,8,9,12,23],greensocket:[0,2],greenssl:2,greensslobject:2,greenthread:[0,2,5,7,8,9,10,13,14,16,18,19,20,21,24,28],gregori:[0,2],grinberg:[0,2],group:5,grow:3,grugq:[0,2],guarante:12,guard:20,gubarev:[0,2],guemar:[0,2],gunicorn:2,guo:0,gysin:0,had:[2,3,6,7,19],haferkamp:[0,2],haikel:[0,2],hand:[3,5,12,29],handi:3,handl:[0,1,2,3,5,10,12,22,23,26,27],handler:[2,5,22],hang:[2,23],hansen:[0,2],happen:[3,4,7,12,20,25],happili:2,hard:[12,14,18],hardcod:27,harder:27,hardi:0,harkot:[0,2],harri:0,has:[0,1,2,3,5,6,7,10,12,13,15,16,17,18,20,21,22,23,25,26],hasn:17,hassl:8,have:[1,2,3,5,7,12,13,17,19,23,25,26,27,28],header:[0,2,9,22],headers_raw:2,hello:[5,22,23,26],hello_world:[5,22,23],help:[0,2,10,12,23],henc:12,here:[1,2,3,5,10,20,21,22,25,26,27],high:[13,18],higher:2,hint:[0,23],his:6,histor:13,histori:8,hit:1,hmm:12,hoerner:2,hog:2,hohberg:2,hold:[1,2,13,15,18],holger:0,holt:[0,2],hood:25,hook:[9,14],host:[1,2,6,13],hostnam:13,hostport:10,how:[1,2,3,5,8,10,12,13,14,15,20,23,27],howev:[6,12],hrachyshka:[0,2],html:[2,5,23,27],html_path:5,http:[2,3,5,6,8,18,21,23,24,26],http_pool:18,httpc:2,httpd:2,httpdate:2,httplib2:[2,18,25],httplib:2,httpprotocol:23,httpserver:2,hua:[0,2],hub:[0,2,4,8,14,28],hub_blocking_detect:14,hub_except:[14,17],hub_listener_stack:14,hub_prevent_multiple_read:14,hub_timer_stack:14,hudson:2,huge:27,hundr:23,hung:12,hussain:[0,2],hybrid:7,ibarra:2,idea:[7,17],ideal:7,ident:[2,5],identifi:12,idiom:[1,3],idl:[2,13],ietf:23,ignor:[1,2,5,19,20,23],ihar:[0,2],illumin:1,imag:[3,5,8],imagin:[3,20],imap:[3,5,8,12,16],img:3,immedi:[1,12,15,17,19,20],imp:2,imped:27,implement:[0,1,2,5,6,7,8,9,12,14,15,18,19,20],implic:12,implicit:12,implicitli:12,import_patch:[1,3,5,25],importerror:2,imposs:2,improp:2,improperli:2,improv:[0,2,23],includ:[2,3,6,10,12,13,23,25,27],inclus:27,incom:[1,22,29],incompat:[0,2],incorpor:2,incorrect:[0,2],incorrectli:2,increas:[2,19],incred:[0,5,14],increment:[3,20],indetermin:[12,18],index:[2,8],indic:[5,12,18,19,23],indra:6,infinit:[2,19],info:[10,23],inform:[1,10,12,25],inherit:[23,25],init:2,initi:[2,12,19,20],inject:[2,29],input:[1,2,3,5,12,16,23],insecur:26,insensit:2,insert_id:[2,13],insid:23,inspect:[1,7,10,14],inspir:2,instal:[2,5,7,14,27],instanc:[1,7,12,13,17,18,21,22,23],instead:[1,2,3,4,7,12,13,14,16,20,25,27],instruct:2,integ:[2,16,17,20],integr:[0,2],intend:[13,21],intention:12,interact:[8,9,12,22],interchang:1,interest:[3,5,19],interfac:[1,2,25,26,28,29],interfer:17,interlock:20,intern:[2,7,10,13,20],internet:[2,5],interpret:[8,9],interrupt:[12,14],intl:[3,5,8],introduc:[0,2],invalid:[0,2],investig:2,invis:3,invit:2,invoc:28,invok:20,involv:[3,12,23,27],ioerror:2,ippolito:[0,6],ipv6:2,is_monkey_patch:25,is_timeout:2,ishaya:2,isinst:[12,28],isn:[2,3,27],isol:2,isotop:29,issu:[0,2,6,23],issuer:26,item:[12,13,15,16,18,19],iter:[0,1,2,3,5,12,16],itertool:16,its:[1,2,3,4,5,10,12,13,14,16,17,18,19,20,27,28],itself:[1,2,3,5,7,12,13,14,17,21,25,27,29],jacofouri:2,jago:0,jake:[0,2],jakub:[0,2],jame:0,jan:[0,2],janusz:[0,2],jarrod:0,jaum:2,jessica:2,jira:2,jm8w:2,job:[0,2,3,5,16],joe:0,johann:[0,2],john:0,johnson:0,join:[2,3,5,19],join_reactor:2,josh:[0,2],joshua:0,json:2,jsonhttp:2,juan:2,julien:2,junctur:14,junyi:2,just:[3,5,12,25,26,27],justdoit0823:2,justin:2,kaprielian:0,kartic:0,kasarher:2,kashirin:2,kasurd:0,keep:[2,5,21,26],keepal:[2,23],kei:[3,12,23,25,26,28,29],kent:0,kept:3,kernel:14,kerr:[0,2],kerrin:[0,2],kevent:2,kevin:0,keyboardinterrupt:5,keyerror:12,keyfil:23,keyword:[1,2,10,12,13,17,21,25],kill:[2,12,17,23],killal:2,kim:[0,2],kind:5,know:[1,2,7,12,14],known:[2,12],konstantin:[0,2],kovari:[0,2],kqueue:[2,7,27],kqueueselector:2,krekel:0,krishnamurthi:0,kruglyak:[0,2],kuo:[0,2],kw_additional_modul:[1,25],kwan:0,kwarg3:23,kwarg4:23,kwarg:[2,10,13,16,17,23,28],kwd:[12,21],lab:[3,6,8],lack:[2,25,27],lambda:[5,18],languag:12,larg:[2,17],larger:20,lasso:[0,2],last:[2,12,15,21],lastli:27,late:25,later:[1,2,3,21,26],latin:2,launch:[1,3,7,12,16,23],lazi:7,lead:0,leak:2,learn:10,least:[1,2,17,27],leav:[1,10,12],lee:[0,2],left:[2,5,12],legaci:2,legal:2,len:[3,5,8,23],length:[2,5,22,23],lengthi:13,less:[2,16,19,20,23,29],let:[7,12],level:[2,23],levent:[0,2],lib:[2,6,27],liberal_regex_for_matching_url:5,libev:[2,7],libnam:12,librari:[0,1,2,6,7,8,12,19,24,28],libzmq:2,licens:[2,10],life:[6,13],lifespan:13,lifetim:25,lifoqueu:19,light:6,lightqueu:19,like:[1,2,5,7,12,13,14,17,19,20,22,23,25,26,27,28],limit:[1,2,3,5,13,16,18,20,21,27],linb:[0,2],linden:[2,3,6,8],line:[1,2,3,5,7,15,16,21,23,25,27],linger:2,link:[1,2,5,17],linkflag:12,linux:[2,7,27],lior:[0,2],list:[0,2,3,4,5,15,16,17,27],listen:[1,2,3,5,7,10,14,22,23,26,27],liter:[0,12,13],littl:[5,7,19,27,28],live:0,local:[1,7,8,9,10,27],localhost:[5,10,13,27],locat:[0,6],lock:[1,2,20],log:[0,2,14,22,23],log_format:[2,23],log_output:[2,23],log_x_forwarded_for:23,logfil:2,logger:23,logic:14,logo:[3,5,8],logutil:2,lon:2,longer:[2,13],look:27,loop:[1,2,3,5,6,7,10,17,23],loss:2,lost:2,lot:1,lowercas:[0,2],lowest:[7,19],luci:0,luke:0,luo:[0,2],macosx:2,mad:2,made:[2,5,8,19],magic:25,mai:[1,5,6,7,12,13,15,17,18,19,20,21,23,25,26,29],mail:0,main:[1,2,6,7,17,25,28],mainloop:7,maintain:[8,13],major:[1,2,19,28],majorek:0,make:[0,1,2,3,5,7,12,14,15,20,23,26,27,28],makefil:[2,5,21],makegreenfil:2,malcolm:[0,2],malicki:0,manag:[1,2,5,7,13,18,20],mandat:23,mani:[0,1,2,5,12,16,20,23,27,29],manner:[7,25],manual:2,manuel:2,map:13,marc:0,marcel:2,marcin:[0,2],marcu:[0,2],marhuenda:2,mark:[2,13,18],mark_as_clos:[2,7],mashup:5,mask:2,match:[2,18,28],matt:[0,2],matthew:[0,2],max:[12,16,18],max_ag:13,max_frame_length:22,max_http_vers:23,max_idl:13,max_siz:[13,18,23],maximum:[1,2,18,19,22,23],maxsiz:19,mcarter:2,mccabe:2,mclaren:[0,2],mean:[2,4,5,7,12,13,19,23,25,27,29],meant:[2,6,10],measur:13,mechan:[2,23],memori:[1,2,3,16],mere:[2,17],merg:2,merritt:[0,2],messag:[2,5,22,23,29],meth:28,method:[0,1,2,3,7,12,13,17,18,19,20,22,23,25,28],michael:[0,2],middl:2,might:[7,12,15,17,21,22,23,25,27,28],miguel:[0,2],mike:[0,2],mikepk:[0,2],min:18,min_siz:[2,13,18],mind:21,minimum:[3,23],minimum_chunk_s:[0,2,23],minimum_write_chunk_s:23,minor:2,miro:2,misc:2,mishra:[0,2],mismatch:[2,27],miss:[2,27],mission:2,mistak:[2,14],mit:8,mix:29,mode:2,modern:2,modif:2,modifi:[2,3,18,25],modul:[0,1,2,5,7,8,10,13,14,15,17,19,22,23,25,26,27,28,29],module_nam:25,modulenam:1,mollett:2,moment:[14,23],monkei:2,monkey_patch:[1,2,25],monkeypatch:[1,2,8,28],monoton:2,more:[1,2,3,5,6,8,10,12,16,18,19,20,22,23,25,26],most:[1,2,5,6,13,15,19,20,21,25,27],mostli:19,move:[2,5],mswindow:2,much:[1,2,12,13,20,26,27],multi:[2,8,19],multicast:29,multipl:[1,2,5,7,10,12,13,14,15,20,23,25,29],multiplex:7,multiprocess:19,multitudin:2,murau:[0,2],murthi:0,muscl:29,must:[2,12,13,15,17,18,20,21,23,25],my_func:28,my_handl:22,myapp:10,myfunc:10,myhandl:1,myhub:7,myobject:18,mypackag:7,mypool:18,mysock:21,mysql:2,mysqldb:[0,2,13],nake:1,name:[1,2,6,7,12,13,23,25,27,28],nameerror:2,nameserv:2,nat:[0,2],nativ:[7,25,28],natur:12,nearli:1,necessari:[2,7,12,18,19,22],necessarili:12,need:[1,2,4,7,12,18,20,23,25,26],neg:[2,16,20],neither:12,net:[2,5],network:[2,6,8,25,27],neudorf:[0,2],never:[10,12,15,19,21],new_connect:5,new_siz:[16,18],new_sock:[3,5],new_url:5,new_writ:5,newli:12,next:[2,3,12,16,17,20],nginx:2,nica:[0,2],nice:[0,2,27],nick:[0,2],noblock:[0,2],nobodi:2,node:[12,26],non:[2,5,6,9,12,18,25,26],nonblock:[2,28],nonblockingli:1,none:[1,2,5,7,10,12,13,14,15,16,18,19,20,21,22,23,25],nonsens:2,nonsocket:2,nontrivi:12,nonzero:20,nor:[12,18],normal:[1,3,7,10,13,14,17,22,23,25,28,29],nose:[2,27],nosetest:27,notabl:2,notdon:12,note:[1,3,4,5,15,17,22,27],noth:17,notic:[2,12],notify_open:2,now:[2,12,13],nullari:18,number:[1,2,3,5,12,13,15,16,18,19,20,23,27],nvisit:5,obj:[13,18,28],object:[1,2,7,12,13,15,16,17,18,19,22,23,28],observ:[10,12],obtain:12,obviou:1,occasion:[17,27],occur:[15,21],octal:0,oden:0,off:[1,3,12,25],often:[2,12,14],old:[2,7],oldest:22,omit:[1,12,21,27],onc:[2,3,6,12,13,15],one:[1,2,3,4,5,7,10,12,13,15,16,17,18,19,20,21,23,25,26,27,28,29],ones:[1,5,7,12,25,27],onli:[0,1,2,4,5,7,8,12,13,15,17,18,19,21,23,25,26,28,29],onto:28,opaqu:18,open:[0,1,2,3,5,6,8,13,16,21,23],openssl:[0,2,26],oper:[0,2,5,6,7,10,13,15,16,18,19,21,23,28],oppenheim:[0,2],opportun:17,opposit:20,optim:[2,3,4],option:[0,1,2,12,19,20,22,23,27,28],order:[3,6,7,12,13,18,19,20,22,27,28],order_as_stack:18,org:[3,5,8,23,24],organ:29,orient:29,orig_err:12,origin:[8,12,15,22],originalerror:12,orishoshan:[0,2],orlov:[0,2],oserror:2,other:[1,2,3,7,12,13,15,17,18,19,20,22,23,25,27,28],otherwis:[17,19,20],our:5,out:[0,1,2,5,10,13,14,15,16,18,20,21,25],outbound:5,outgo:3,output:[2,12,27],outq:5,outsid:[12,21],over:[1,2,3,5,12,16,17,25,26],overal:[2,16],overhaul:2,overhead:[19,28],overrid:2,overridden:[2,23],overriden:[0,2,13,18],own:[5,7,12,16,17,27,28],owner:2,packag:[2,23,25,27],page:[0,2,5,8],pagel:[0,2],pai:0,pair:[2,12,23,25,29],parallel:[1,2,3,5,27],paramet:[1,2,12,13,16,21,23],paramiko:2,parent:[2,15,17,28],pars:[3,5],parse_q:2,part:[1,2,23],parti:7,partial:[2,12,18],particip:5,particular:[2,3,13,25,27],pascu:2,pass:[0,2,5,7,12,13,15,18,21,22,23,26],passwd:13,past:25,patch:[0,2,8,25],patcher:[0,2,25],patcher_test:2,path:[2,5,12,22],path_info:[2,5,22],pathlib:2,patienc:0,patrick:0,patrin:2,pattern:[1,5,8],paul:[0,2],pavel:6,payload:[22,23],peak:13,peer:29,pend:[1,12,21],pep333:23,pep:[0,2,25],per:[0,1,2,13,23],perform:[2,6,10,12,17,23,25],perhap:5,period:13,permessag:[0,2],peter:[0,2],phu:[0,2],physic:29,pick:[4,20],pie:12,pigmej:2,pile:[3,5],pin:2,ping:13,pipe:[5,22,28],place:[2,7,19,25,27],plai:2,plain:[2,3,5,13,23],plan:21,platform:[2,7,27],plch:2,pleas:[2,22,26],plu:[2,12],plugin:27,plumb:2,png:3,podoliaka:[0,2],point:[1,2,5,12,14,15],poll:[0,2,7,12],pollhub:2,pollselector:2,pollut:2,polyak:[0,2],pool:[1,2,3,4,5,8,9,12,14],pooledconnectionwrapp:13,popen4:2,popen:2,popul:18,port:[1,2,3,8,10,23,27],portant:[0,2],posit:[12,14,19,20,21],possibl:[1,2,7,12,17,19,20,25],post:[0,3,5,9],postgr:0,posthook:[2,23],potenti:2,power:[14,26],pprint:12,practic:[3,7,25],pre:[0,18],preced:0,precis:2,precompil:12,predict:14,preemptiv:1,prefer:[1,7,22],prematur:2,prepopul:12,present:[1,2,15,25,27,29],preserv:[2,15],preston:[0,2,6],pretend:23,pretti:5,prevent:[1,2,14,17],previou:[2,13,18],previous:[2,12],primari:[2,8,13,22,28],primit:[1,8,9,17,28],primitv:5,print:[1,2,3,5,8,12,13,14,15,16,17,18,23,26,27,28],print_funct:5,printout:27,prior:12,prioriti:19,priorityqueu:19,privat:[23,26],probabl:[2,7],problem:[2,3,12,21,25],problemat:23,proc:2,proce:12,process:[1,2,3,5,8,9,12,16,19,22,23],produc:[2,8,12,19,28],producer_consum:5,product:[3,12,14],profil:[0,2],program:[4,5,7,12],programmat:12,progress:12,project:[0,2,6,29],promot:7,proof:6,propag:2,propagateerror:12,proper:20,properli:[2,23],properti:[17,20,22],proport:16,protect:[2,3,14],protocol:[2,22,23],provabl:12,provid:[0,1,2,3,5,12,13,18,21,22,23,25,27,28,29],provision:23,proxi:[0,2,3,13,28],psycopg2:[2,13,25],psycopg:[2,25],pub:2,pull:[0,2],punct:5,purpos:[2,3,26,27],push:[5,20],put:[2,5,7,13,15,18,19,23,29],put_nowait:19,putter:19,py27:2,py2:2,py37:2,py39:2,py3:2,py3k:2,pycon:[2,6],pycurl:2,pyevent:[2,7,28],pygtk:0,pyobj:2,pyopenssl:[1,2,8],pypi:[0,2,5],pytest:2,python2:2,python3:[0,2],python:[0,1,2,3,5,6,7,9,12,23,24,25,26,27,28],pythonpath:[5,27],pyzmq:[2,24],qsize:19,qthcn:0,quad:2,quan:[0,2],quantiti:16,queri:[2,13],question:[0,12],queu:[1,29],queue:[1,2,5,8,9,15,25,29],quick:1,quickli:5,quirk:0,quit:[1,5,16,25,27],race:2,radioact:29,radix:0,rai:29,rais:[1,2,5,7,12,13,14,15,16,17,19,20,21,22,23],ralf:[0,2],ramakrishnan:[0,2],ran:27,rand:2,random:[2,5,20,28],rang:5,rare:[2,21,25],rather:[1,3,5,12,27],rational:9,raw_path_info:2,rawconnectionpool:13,raylu:[0,2],raymon:2,raymond:0,rcvtimeo:2,rdtype:2,reach:20,reactor:2,read:[0,1,2,3,5,7,8,14,21,23,26,27],read_chat_forev:5,readabl:[1,2],readal:2,reader:[2,3,5],readi:[2,7,12,15],readlin:[0,2,3,5,21],readm:0,readuntil:2,real:28,realli:14,realtim:12,reason:[12,13,25,27,28],rebuild:[2,12],receiv:[2,3,14,19,29],recent:[2,15,19,21],recommend:12,reconnect:29,record:[12,14],recurs:[2,8,12],recursionerror:2,recursive_crawl:5,recv:[2,3,5],recv_into:2,red:6,redbo:2,reduc:[0,2],redund:2,reentrant:[2,16],ref:2,refactor:2,refer:[1,2,8,13,15,25],reflect:[2,12],regard:0,regardless:[1,2,12,17],regist:[7,14],register_at_fork:2,regular:[1,2,5],reimplement:2,reimport:2,rel:2,relat:[1,2,8,16,25],relationship:29,releas:[2,20],relev:12,reli:[20,25],reliabl:[2,29],reload:5,remain:[8,13,23,28],remot:2,remote_port:[0,2],remov:[2,5,8,13,14,17,19],renam:2,render:0,repeatedli:[3,15],replac:[2,12,25],report:[0,2,12,19,27],repr:[5,26],repres:[1,12,13,16,20,28],represent:2,repro:0,req:26,request:[0,1,2,3,5,8,10,12,22,23,26],request_lin:23,request_method:5,requir:[1,2,5,6,7,12,13,20,23,25],rescu:25,research:29,resembl:19,reset:[2,15],resiz:[2,16,18,19],resolut:14,resolv:[2,5],resourc:[8,9,14,20],resourcewarn:2,respect:[0,2,3,5,12,19],respond:[0,3,23],respons:[0,2,9,22],rest:[1,10,12,13],restart:12,restor:25,restrict:[1,28],restructur:7,restserv:6,result:[0,1,2,3,5,12,13,15,16,17,18,21],result_from_a:12,result_from_zlib:12,resum:[2,10,12,14,19],retri:[0,2],retriev:[1,3,12,16,17,19],return_valu:12,retval:15,reus:[13,15],reuse_addr:1,reuse_port:1,revers:20,review:2,rfc3493:2,rfc7231:23,rfc:23,rfk:[0,2],rhel:2,rhode:2,right:[2,17,18],risk:16,rivera:0,rlock:2,robinson:0,robot:5,robust:[2,3],rollback:13,roman:[0,2],root:13,routin:18,rss:3,rtyler:2,rudd:0,ruijun:[0,2],rule:[10,25],run:[0,1,2,3,5,6,7,8,9,12,14,16,17,23,26,27,28],runner:2,running_kei:12,runtim:[18,25],runtimeerror:15,ryan:[0,2],s33kr1t:13,safe:[1,2,7,25,28],safeti:5,sai:12,sake:26,salmon:[0,2],sam:2,same:[0,1,2,3,5,6,7,10,12,14,15,16,17,20,21,22,23,25,26,27],sampl:23,samuel:[0,2],saranwrap:2,save:[0,1],saw:5,scenario:23,schedul:[1,2,6,7,17,21],schema:13,scheme:2,schmir:[0,2],schmitt:0,scope:[2,7],scott:[0,2],scraper:[3,8],script:2,sean:[0,2],search:[5,8],second:[0,1,2,7,13,14,15,17,18,19,21],secondlif:[2,26],secret:29,section:[21,23],secur:[2,23,26],sedov:2,see:[1,2,4,5,7,12,14,15,17,21,22,25,27],seed:5,seek:2,seem:5,seen:5,select26:2,select:[0,1,2,7,13,25],select_db:13,selector:2,selectselector:2,self:[10,15,18,26],sem:20,semant:[2,20,29],semaphor:[0,2,8,9],send:[2,5,15,22,23],send_except:[2,15],send_hundred_continue_head:2,send_hundred_continue_respons:23,sendal:[0,2,3,5],sender:5,sendto:2,sens:27,sensibl:[2,27],sent:[2,23],separ:[1,2,16],sequenc:[2,12,25],sergei:[0,2],sergeyev:[0,2],serial:[12,22],serv:[1,2,10,12,23,27],serve_forev:2,server:[1,2,8,9,10,26,27,29],server_cap:13,server_ev:23,server_sid:[1,23],server_sock:27,servic:3,session:1,set:[1,2,5,10,12,13,14,17,18,20,21,22,23,26,28],set_accept_st:26,set_character_set:13,set_hundred_continue_response_head:23,set_isolation_level:[2,13],set_nonblock:2,set_num_thread:2,set_server_opt:13,set_sql_mod:13,setitim:[2,14],settimeout:[0,2],setup:[2,12,27,29],setuptool:2,sever:[12,13],seyeong:[0,2],sha1:26,share:[1,13,14],shaun:[0,2],shaw:2,shepelev:[0,2],ship:2,shop:26,shorter:14,shorthand:12,should:[1,2,12,15,17,20,21,22,23,25,28],shouldn:2,show:[3,5],show_valu:14,show_warn:13,shown:[12,23],shutdown:[2,13,26],side:3,sigalarm:14,sigchld:2,sign:[20,26],signal:14,signatur:[2,17],signific:2,silenc:21,silent:4,similar:[2,15,19],similarli:12,simmon:[0,2],simon:0,simpl:[3,5,8,12,22,23],simplehttpserv:2,simplejson:2,simpler:28,simplest:28,simpli:[1,2,7,10,12,13,22,23,25,27],simplic:[1,26],simultan:[0,2,3,5,29],sinc:[5,25,28],singh:0,singl:[1,2,10,12,13,15,16,18,22,23,25],singleton:7,sit:1,site:[5,23],situ:10,situat:[12,16,20],six:[2,5],size:[2,4,12,16,18,19,23,28],size_or_pool:16,skip:[2,27],skip_if_no_ssl:2,skirko:[0,2],slant:0,sleep:[1,2,5,15,17,21,25],slide:0,slight:25,slightli:[2,3,22,23],slot:[16,19],slow:25,small:[0,2,5,23],smart:[2,27],snapshot:12,sndhwm:2,so_reuseaddr:[0,1,2],so_reuseport:2,sock:[1,2,10,22,23,26],sock_dgram:29,sock_stream:[26,29],socket:[0,1,2,3,7,8,10,14,17,22,23,25,26,28,29],socket_timeout:[2,23],socketconsol:10,socketserv:25,softwar:13,some:[1,2,3,5,6,7,12,13,17,18,20,21,25,26,27,28,29],someon:[2,12],someth:[2,3],sometim:[2,25,27],somewhat:3,soon:12,soren:[0,2],sorri:2,sort:[5,12,25],sottil:0,soup:27,sourc:[0,2,5,6,8,27],soviet:29,spandex:29,spare:6,spawn:[2,3,5,8,10,12,15,16,17,23,26,27],spawn_aft:[1,2,17],spawn_after_loc:17,spawn_mani:12,spawn_n:[1,3,5,15,16,17],speak:29,spec:[22,23],special:[7,12,21],specif:[1,7,12,13,17,23,27],specifi:[4,7,10,12,14,15,17,18,20,23,25],spent:6,spew:14,sporad:0,spread:2,sqlite:2,sqlstate:13,squeaki:2,squelch:0,sriniva:[0,2],ssl:[0,1,2,8,9,22,25],ssl_listen:2,ssl_version:1,sslconnect:2,sslcontext:2,sslsocket:[2,26],sslv23_method:26,sslwantreaderror:2,stack:[5,14,15,17],stacktrac:15,stand:2,standalon:16,standard:[1,2,3,5,8,9,19,26],stanescu:0,stanworth:[0,2],starmap:16,start:[1,2,3,5,6,7,12,17,23],start_respons:[3,5,23],start_url:5,starting_id:28,startup:2,stasiak:[0,2],stat:13,state:[6,10,14,25],statement:[1,2,12,13,18,21,25],statu:23,status_cod:23,stawiarski:[0,2],stderr:23,stdin:15,stdlib:[2,27],stdlib_queu:19,stdout:14,stefan:[0,2],stefano:0,step:2,steven:[0,2],stick:[5,10,28],still:[2,12,13,21,22],stinner:[0,2],stock:[0,2],stolen:29,stomp:2,stop:[1,2,6,12,14],stopiter:[12,16],stopserv:1,storag:[8,9],store:[3,12,15],store_result:13,str:[2,12,23],straightforward:2,straightforwardli:12,strang:2,stream:29,strict:[12,29],strictli:[12,20],string:[2,3,12,14,21,22,23,28],string_liter:13,strip:[2,5],structur:[1,3],stuart:[0,2],stub:27,stuck:12,stuf:1,stuff:[1,2],style:[3,6],sub:[2,27],subclass:[2,12,13,18,19],submiss:0,submodul:2,subprocess:[0,2],subscrib:2,subsect:1,subsequ:[12,19],subset:13,substanti:7,subtl:2,subtli:20,succe:12,succeed:12,success:2,successfulli:[12,17],suffic:12,suggest:0,suit:[2,13,16],suitabl:2,sullivan:0,summari:[1,27],supersocket:2,suppli:[1,7,10,17,23,28],support:[0,2,5,7,9,19,22,25,27,29],suppos:[12,13,18],suppress:[2,21],suppress_ragged_eof:[1,2],sure:[0,1,2,7,20],suspend:[1,7,16,20],svn:6,swallow:2,swap:25,swap_in:2,swap_out:2,switch_out:2,switchingtodeadgreenlet:2,synchron:[2,19,29],syntax:2,syntaxwarn:2,sys:[2,15,23,25],syscal:[0,2],system:[1,2,7,14,25,27],systemexit:5,szotten:[0,2],takashi:2,take:[1,6,12,13,15,20,29],taken:13,tal:0,talk:[2,6,8],tarbal:[2,27],target:[13,17],task:[2,7,16,19],task_don:19,taso:0,tavi:[0,2],tcp:[1,2,29],tcp_listen:2,tcp_nodelai:2,tcp_quickack:2,tcp_server:2,teardown:29,technic:23,tediou:5,tegel:[0,2],tell:[14,19,27],telnet:[5,10],templat:23,tempmod:27,temporarili:25,ten:3,tend:13,term:[1,3,8],termin:[1,5,12,14,17,22,26],tesler:[0,2],tess:0,test:[0,2,8,12,13,23,26],test_024a_expect_100_continue_with_head:23,test_024b_expect_100_continue_with_headers_multiple_chunk:23,test_024c_expect_100_continue_with_headers_multiple_nonchunk:23,test_import_patched_default:2,text:[2,3,5,23],than:[1,3,5,12,13,16,17,18,19,20,23,25,26,27],thank:[2,8],thei:[1,2,3,4,5,7,12,13,15,16,19,23,25,27,28],them:[2,7,12,13,14,15,20,27,28,29],themselv:28,therebi:3,therefor:[2,14,25,28],therein:2,thereof:15,thi:[1,2,3,4,5,7,8,10,12,13,14,16,17,18,19,20,21,22,23,25,26,27,28],thier:0,thing:[5,10,13,15,16,17,18,20,28],third:7,thoma:[0,2],those:[2,3,5,12,23,27,28],though:[1,2,12,17,20,23,27],thousand:3,thread:[0,1,2,3,5,7,8,9,19,20,23,25],thread_id:13,threadloc:2,threadpool:[2,4],threadpoolexecutor:2,three:[2,13],through:[5,12,13,21],throughout:13,throw_arg:17,thrown:27,thu:[2,6,7,12,16,20,23,29],tian:[0,2],ties:3,tim:[0,2],time:[1,2,3,6,12,13,14,15,16,17,18,19,20,21,22,23,25,28,29],timeout:[0,1,2,5,7,8,9,14,15,18,19,20,23],timeout_exc:7,timeout_valu:21,timeoutexpir:2,timer:[2,7,13,14,21],timestamp:23,titl:[3,5],toe:2,toggl:14,token:[13,18],tokenpool:[13,18],told:2,toma:2,tomaz:[0,2],too:[2,5,7,12,13,20,21],took:21,tool:[8,9,23,27],top:2,topolog:12,total:2,tour:3,tox:2,tpool:[0,2,4,8,14],tpool_except:14,tpooledconnectionpool:[2,13],trace:[2,14,15,17],trace_nam:14,traceback:[2,15,21,23],track:[0,2,13],trampolin:[2,6,7],transact:23,transfer:[2,29],transpar:[6,26,29],trap_error:2,travi:[0,2],treat:2,tree:[6,12,27],tri:7,trick:28,tricki:7,trigger:[15,21],trim:2,truli:[2,5,18],trunk:6,tsafe:2,tucker:0,tune:10,tupl:[1,2,10,12,15,17,19,23],turn:[7,12],tushar:[0,2],tutori:9,tweak:[2,22],twice:12,twist:[0,2],twistedr:2,twistedutil:2,two:[1,5,12,15,18,21,29],txt:5,tyler:[0,2],type:[2,3,5,10,12,17,21,23,28,29],typeerror:2,typic:[5,12,19],typo:[0,2],udp:2,ultim:12,unavail:29,unavoid:17,unblock:[12,19,20],unbound:20,uncaught:[1,12],uncompress:[2,22],uncov:0,under:[2,8,22,25],underli:[2,12,23,26],understand:[1,2,4,8,27],unencrypt:23,unexpect:21,unexpectedli:[7,28],unfinish:[2,13,19],unicod:[2,22],unidirect:5,unidirection:5,uniform:12,uniqu:[12,18],unit:[1,2,27],unittest:[6,27],univers:[2,8,9],universal_newlin:2,unix:[2,23],unknown:12,unless:12,unlik:[12,19],unlink:[0,2,17],unmodifi:2,unnecessari:2,unpack:2,unpatch:2,unpredict:1,unqualifi:2,unrel:0,unreli:29,unschedul:15,unspecifi:12,unspew:14,until:[1,2,3,7,12,15,16,17,18,19,20,28],unus:[2,13],unwrap:2,updat:[2,6],upgrad:[0,2],upload:12,upon:[13,25],upper:[3,20],upstream:[2,12],urban:[0,2],url:[2,3,5,8,23,26],url_length_limit:23,url_match:5,url_regex:5,url_schem:[2,23],urllib2:[0,2,5,21,26],urllib:[3,5,8,26],urlopen:[0,3,5,8,26],usabl:23,usag:[2,3,8,12],use:[0,1,2,3,4,5,7,12,13,14,16,17,18,21,22,23,25,26,27,28,29],use_certificate_fil:26,use_hub:[2,4,7],use_privatekey_fil:26,use_result:13,used:[1,2,6,12,13,14,16,17,19,20,23,25,26,28],useful:[0,1,10,12,13,14,21,23,27],useless:[12,13],user:[2,4,8,13,23,29],uses:[1,2,3,14,28],using:[0,1,2,3,5,6,7,10,12,14,17,18,21,23,25,26,27,28,29],usr:5,usual:27,utf:[2,22],util:[2,14],uuid:12,v20:2,val:0,valid:22,valu:[1,2,3,5,10,12,13,14,15,16,17,20,21,22,23,28],value1:12,value2:12,valueerror:[2,19,20],vanderlinden:[0,2],variabl:[2,7,8,10,22,23,27,28],variant:19,variou:[2,3],varrazzo:[0,2,25],vast:28,vatamaniuc:[0,2],vector:22,verbos:[1,2],veri:[1,2,3,5,12,13,18,20,21],verifi:27,version:[1,2,3,10,22,23,24,25,26,27],versu:12,via:[2,7,10,18,27,28],victor:[0,2],violat:23,vishvananda:2,visit:15,volunt:0,wai:[1,2,5,10,12,15,17,18,22,23,25,27,28],wait:[0,2,5,7,12,13,14,15,16,17,18,19,20,22,23,26],wait_each:12,wait_each_except:12,wait_each_success:12,wait_on:15,waital:[5,12,16],waiter:15,waiting_for:12,waitpid:2,wake:[0,2,7,13,20],wall_second:23,want:[1,2,3,12,13,17,23,27,28],warn:22,warning_count:13,water:[13,18],weak:25,web:[3,8,22,23],webcrawl:[0,5],webob:0,weboscket:0,websocket:[0,2,8,9,23],websocket_chat:5,websockets13:2,websocketwsgi:[5,22],weight:6,weird:[2,27],well:[2,5,12,23,25,27],were:[0,2,3,5,6,12,19,27],what:[1,2,4,7,8,12,14,25,27],whatev:[12,13,17,18],wheel:2,when:[1,2,3,5,6,7,10,12,13,14,15,16,17,18,19,20,21,23,25,27,28,29],whenev:[13,18,19],where:[2,3,12,13,15,19,23,29],wherea:25,whether:[2,12,13,14,17,19,23,25],which:[1,2,3,5,7,12,13,14,15,16,17,18,20,22,23,25,27,28],whitespac:2,whitnei:0,who:[2,8,13,18],whole:[2,16],whoop:15,whose:12,why:[2,7],wiki:2,william:[0,2],windisch:[0,2],window:[0,2],winerror:2,with_timeout:[2,21],within:[2,8,9,12,17,19,21],without:[2,7,12,13,14,16,17,19,20,21],wodg:27,woken:[15,19],won:[1,3,7,21],wonder:6,word:[2,12,13,18],work:[1,2,3,5,6,8,12,13,16,19,22,23,25,26,27,28],workaround:2,worker:[3,5,16],world:[5,6,8,22,23,28],would:[1,2,12,13,20],wrap:[2,12,21,22,23,26,27,28],wrap_:2,wrap_pipes_with_coroutine_pip:2,wrap_socket:1,wrap_socket_with_coroutine_socket:2,wrap_ssl:[0,1,2,23],wrapper:[2,12,13,28],wright:[0,2],wrii:0,write:[2,5,6,7,8,14,25,26],writelin:2,writer:[2,5],written:[6,23,24],wrong:2,wsgi:[0,2,3,8,9,22],wsgi_app:23,wsgi_test:23,wsl:2,www:[3,5,8,21,24],x509:26,xreadlin:2,yamamoto:2,yandex:5,yang:[0,2],yashwardhan:0,yes:3,yet:[2,6,12,22,27],yield:[1,2,3,10,12,13,14,17,18,21,23,25,28],yimg:[3,5,8],you:[1,2,3,5,6,7,8,10,12,13,14,15,17,18,21,22,23,25,26,27,28,29],young:0,your:[0,1,2,5,7,12,26,27],yourself:[5,7],yuichi:0,yule:0,zed:2,zero:[16,18,19,20],zeromq:[0,2,8,24],zeroreturnerror:2,zhang:[0,2],zhengwei:2,ziegler:0,zip:5,zipkin:2,zlib:12,zmq:[0,2,8,9,29]},titles:["Authors","Basic Usage","0.31.0","Design Patterns","Environment Variables","Examples","History","Understanding Eventlet Hubs","Eventlet Documentation","Module Reference","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">backdoor</span></code> \u2013 Python interactive interpreter within a running process","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">corolocal</span></code> \u2013 Coroutine local storage","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">dagpool</span></code> \u2013 Dependency-Driven Greenthreads","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">db_pool</span></code> \u2013 DBAPI 2 database connection pooling","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">debug</span></code> \u2013 Debugging tools for Eventlet","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">event</span></code> \u2013 Cross-greenthread primitive","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">greenpool</span></code> \u2013 Green Thread Pools","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">greenthread</span></code> \u2013 Green Thread Implementation","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pools</span></code> - Generic pools of resources","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">queue</span></code> \u2013 Queue class","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">semaphore</span></code> \u2013 Semaphore classes","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">timeout</span></code> \u2013 Universal Timeouts","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">websocket</span></code> \u2013 Websocket Server","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">wsgi</span></code> \u2013 WSGI server","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">eventlet.green.zmq</span></code> \u2013 \u00d8MQ support","Greening The World","Using SSL With Eventlet","Testing Eventlet","Threads","Zeromq"],titleterms:{"\u00f8mq":[24,29],"class":[19,20],"function":[1,7],"import":25,The:25,Using:26,With:26,api:[1,29],argument:13,author:0,backdoor:10,basic:1,bug:0,chat:5,client:3,connect:[5,13],constructor:13,consum:5,content:[8,12],continu:23,contributor:0,control:1,conveni:1,coroloc:11,coroutin:11,coverag:27,crawler:5,cross:15,dagpool:12,databas:13,databaseconnector:13,db_pool:13,dbapi:13,debug:14,depend:12,design:3,dispatch:3,doctest:27,document:[8,29],driven:12,echo:5,environ:4,event:15,eventlet:[7,8,14,24,26,27],exampl:[5,12],except:12,extens:23,feed:5,find:0,forward:5,gener:18,green:[16,17,24,25],greenpool:16,greenthread:[1,12,15,17],hassl:0,header:23,histori:6,hook:23,how:7,hub:[7,27],implement:17,indic:8,interact:10,interpret:10,introspect:12,lab:0,librari:[25,27],licens:8,linden:0,local:11,maintain:0,modul:[9,12],monkeypatch:25,more:7,multi:5,network:1,non:23,origin:0,patch:1,pattern:3,pool:[13,16,18,28],port:5,post:[12,23],preload:12,primari:1,primit:15,process:10,produc:5,propag:12,pyopenssl:26,python:[8,10],queue:19,rational:12,recurs:5,refer:9,relat:7,resourc:18,respons:23,run:10,scan:12,scraper:5,semaphor:20,server:[3,5,22,23],simpl:28,socket:5,spawn:1,ssl:[23,26],standard:[23,25,27],storag:11,success:12,support:[8,23,24],tabl:8,test:27,thank:0,thread:[16,17,28],timeout:21,tool:14,tpool:28,tutori:12,understand:7,univers:21,usag:1,user:5,variabl:4,version:8,web:5,websocket:[5,22],what:29,who:0,within:10,work:7,world:25,write:27,wsgi:[5,23],you:0,zeromq:29,zmq:24}}) \ No newline at end of file
+Search.setIndex({docnames:["authors","basic_usage","changelog","design_patterns","environment","examples","history","hubs","index","modules","modules/backdoor","modules/corolocal","modules/dagpool","modules/db_pool","modules/debug","modules/event","modules/greenpool","modules/greenthread","modules/pools","modules/queue","modules/semaphore","modules/timeout","modules/websocket","modules/wsgi","modules/zmq","patching","ssl","testing","threading","zeromq"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,sphinx:56},filenames:["authors.rst","basic_usage.rst","changelog.rst","design_patterns.rst","environment.rst","examples.rst","history.rst","hubs.rst","index.rst","modules.rst","modules/backdoor.rst","modules/corolocal.rst","modules/dagpool.rst","modules/db_pool.rst","modules/debug.rst","modules/event.rst","modules/greenpool.rst","modules/greenthread.rst","modules/pools.rst","modules/queue.rst","modules/semaphore.rst","modules/timeout.rst","modules/websocket.rst","modules/wsgi.rst","modules/zmq.rst","patching.rst","ssl.rst","testing.rst","threading.rst","zeromq.rst"],objects:{"":{zmq:[24,1,0,"-"]},"eventlet.backdoor":{SocketConsole:[10,0,1,""],backdoor:[10,3,1,""],backdoor_server:[10,3,1,""]},"eventlet.backdoor.SocketConsole":{"switch":[10,2,1,""]},"eventlet.corolocal":{get_ident:[11,3,1,""],local:[11,0,1,""]},"eventlet.dagpool":{Collision:[12,4,1,""],DAGPool:[12,0,1,""],PropagateError:[12,4,1,""]},"eventlet.dagpool.DAGPool":{__getitem__:[12,2,1,""],__init__:[12,2,1,""],get:[12,2,1,""],items:[12,2,1,""],keys:[12,2,1,""],kill:[12,2,1,""],post:[12,2,1,""],running:[12,2,1,""],running_keys:[12,2,1,""],spawn:[12,2,1,""],spawn_many:[12,2,1,""],wait:[12,2,1,""],wait_each:[12,2,1,""],wait_each_exception:[12,2,1,""],wait_each_success:[12,2,1,""],waitall:[12,2,1,""],waiting:[12,2,1,""],waiting_for:[12,2,1,""]},"eventlet.db_pool":{BaseConnectionPool:[13,0,1,""],ConnectTimeout:[13,4,1,""],ConnectionPool:[13,5,1,""],DatabaseConnector:[13,0,1,""],GenericConnectionWrapper:[13,0,1,""],PooledConnectionWrapper:[13,0,1,""],RawConnectionPool:[13,0,1,""],TpooledConnectionPool:[13,0,1,""],cleanup_rollback:[13,3,1,""]},"eventlet.db_pool.BaseConnectionPool":{clear:[13,2,1,""],get:[13,2,1,""],item:[13,2,1,""],put:[13,2,1,""]},"eventlet.db_pool.DatabaseConnector":{credentials_for:[13,2,1,""],get:[13,2,1,""]},"eventlet.db_pool.GenericConnectionWrapper":{affected_rows:[13,2,1,""],autocommit:[13,2,1,""],begin:[13,2,1,""],change_user:[13,2,1,""],character_set_name:[13,2,1,""],close:[13,2,1,""],commit:[13,2,1,""],cursor:[13,2,1,""],dump_debug_info:[13,2,1,""],errno:[13,2,1,""],error:[13,2,1,""],errorhandler:[13,2,1,""],insert_id:[13,2,1,""],literal:[13,2,1,""],ping:[13,2,1,""],query:[13,2,1,""],rollback:[13,2,1,""],select_db:[13,2,1,""],server_capabilities:[13,2,1,""],set_character_set:[13,2,1,""],set_isolation_level:[13,2,1,""],set_server_option:[13,2,1,""],set_sql_mode:[13,2,1,""],show_warnings:[13,2,1,""],shutdown:[13,2,1,""],sqlstate:[13,2,1,""],stat:[13,2,1,""],store_result:[13,2,1,""],string_literal:[13,2,1,""],thread_id:[13,2,1,""],use_result:[13,2,1,""],warning_count:[13,2,1,""]},"eventlet.db_pool.PooledConnectionWrapper":{close:[13,2,1,""]},"eventlet.db_pool.RawConnectionPool":{connect:[13,2,1,""],create:[13,2,1,""]},"eventlet.db_pool.TpooledConnectionPool":{connect:[13,2,1,""],create:[13,2,1,""]},"eventlet.debug":{format_hub_listeners:[14,3,1,""],format_hub_timers:[14,3,1,""],hub_blocking_detection:[14,3,1,""],hub_exceptions:[14,3,1,""],hub_listener_stacks:[14,3,1,""],hub_prevent_multiple_readers:[14,3,1,""],hub_timer_stacks:[14,3,1,""],spew:[14,3,1,""],tpool_exceptions:[14,3,1,""],unspew:[14,3,1,""]},"eventlet.event":{Event:[15,0,1,""]},"eventlet.event.Event":{ready:[15,2,1,""],send:[15,2,1,""],send_exception:[15,2,1,""],wait:[15,2,1,""]},"eventlet.greenpool":{GreenPile:[16,0,1,""],GreenPool:[16,0,1,""]},"eventlet.greenpool.GreenPile":{next:[16,2,1,""],spawn:[16,2,1,""]},"eventlet.greenpool.GreenPool":{free:[16,2,1,""],imap:[16,2,1,""],resize:[16,2,1,""],running:[16,2,1,""],spawn:[16,2,1,""],spawn_n:[16,2,1,""],starmap:[16,2,1,""],waitall:[16,2,1,""],waiting:[16,2,1,""]},"eventlet.greenthread":{GreenThread:[17,0,1,""],getcurrent:[17,3,1,""],kill:[17,3,1,""],sleep:[17,3,1,""],spawn:[17,3,1,""],spawn_after:[17,3,1,""],spawn_after_local:[17,3,1,""],spawn_n:[17,3,1,""]},"eventlet.greenthread.GreenThread":{cancel:[17,2,1,""],kill:[17,2,1,""],link:[17,2,1,""],unlink:[17,2,1,""],wait:[17,2,1,""]},"eventlet.hubs":{get_default_hub:[7,3,1,""],get_hub:[7,3,1,""],trampoline:[7,3,1,""],use_hub:[7,3,1,""]},"eventlet.patcher":{import_patched:[25,3,1,""],is_monkey_patched:[25,3,1,""],monkey_patch:[25,3,1,""]},"eventlet.pools":{Pool:[18,0,1,""],TokenPool:[18,0,1,""]},"eventlet.pools.Pool":{create:[18,2,1,""],free:[18,2,1,""],get:[18,2,1,""],item:[18,2,1,""],put:[18,2,1,""],resize:[18,2,1,""],waiting:[18,2,1,""]},"eventlet.pools.TokenPool":{create:[18,2,1,""]},"eventlet.queue":{Empty:[19,4,1,""],Full:[19,4,1,""],LifoQueue:[19,0,1,""],LightQueue:[19,0,1,""],PriorityQueue:[19,0,1,""],Queue:[19,0,1,""]},"eventlet.queue.LightQueue":{empty:[19,2,1,""],full:[19,2,1,""],get:[19,2,1,""],get_nowait:[19,2,1,""],getting:[19,2,1,""],put:[19,2,1,""],put_nowait:[19,2,1,""],putting:[19,2,1,""],qsize:[19,2,1,""],resize:[19,2,1,""]},"eventlet.queue.Queue":{join:[19,2,1,""],task_done:[19,2,1,""]},"eventlet.semaphore":{BoundedSemaphore:[20,0,1,""],CappedSemaphore:[20,0,1,""],Semaphore:[20,0,1,""]},"eventlet.semaphore.BoundedSemaphore":{release:[20,2,1,""]},"eventlet.semaphore.CappedSemaphore":{acquire:[20,2,1,""],balance:[20,6,1,""],bounded:[20,2,1,""],locked:[20,2,1,""],release:[20,2,1,""]},"eventlet.semaphore.Semaphore":{acquire:[20,2,1,""],balance:[20,6,1,""],bounded:[20,2,1,""],locked:[20,2,1,""],release:[20,2,1,""]},"eventlet.timeout":{Timeout:[21,0,1,""],with_timeout:[21,3,1,""]},"eventlet.timeout.eventlet.timeout.Timeout.Timeout":{cancel:[21,2,1,""],pending:[21,5,1,""]},"eventlet.tpool":{Proxy:[28,0,1,""],execute:[28,3,1,""]},"eventlet.websocket":{WebSocket:[22,0,1,""],WebSocketWSGI:[22,0,1,""]},"eventlet.websocket.WebSocket":{close:[22,2,1,""],send:[22,2,1,""],wait:[22,2,1,""]},"eventlet.wsgi":{format_date_time:[23,3,1,""],server:[23,3,1,""]},eventlet:{GreenPile:[1,0,1,""],GreenPool:[1,0,1,""],Queue:[1,0,1,""],StopServe:[1,0,1,""],Timeout:[1,0,1,""],backdoor:[10,1,0,"-"],connect:[1,3,1,""],corolocal:[11,1,0,"-"],dagpool:[12,1,0,"-"],db_pool:[13,1,0,"-"],debug:[14,1,0,"-"],event:[15,1,0,"-"],greenpool:[16,1,0,"-"],greenthread:[17,1,0,"-"],import_patched:[1,3,1,""],listen:[1,3,1,""],monkey_patch:[1,3,1,""],pools:[18,1,0,"-"],queue:[19,1,0,"-"],serve:[1,3,1,""],sleep:[1,3,1,""],spawn:[1,3,1,""],spawn_after:[1,3,1,""],spawn_n:[1,3,1,""],tpool:[28,1,0,"-"],websocket:[22,1,0,"-"],wrap_ssl:[1,3,1,""],wsgi:[23,1,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","module","Python module"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","exception","Python exception"],"5":["py","attribute","Python attribute"],"6":["py","property","Python property"]},objtypes:{"0":"py:class","1":"py:module","2":"py:method","3":"py:function","4":"py:exception","5":"py:attribute","6":"py:property"},terms:{"0":[0,1,3,5,12,13,15,17,18,19,20,21,22,23,26,27],"001":27,"01":2,"02":2,"0mq":29,"1":[1,3,5,12,14,15,20,21,23,24,26,27],"10":13,"100":[0,2,9,26],"1000":[1,3,16],"10000":[3,5],"10038":2,"1024":[5,23,26],"104":2,"11":5,"115":2,"120":15,"123":2,"127":[1,5,26,27],"13":22,"136":[0,2],"139":2,"158":2,"16":27,"162":0,"183":0,"194":0,"1950":29,"2":[0,8,9,15,18,20,21,23,24,26],"20":[27,28],"200":[3,5,23],"2006":6,"2008":2,"2009":5,"2010":2,"22":[0,5],"22e9de1d7957":2,"295":2,"3":[0,3,8,15,23,24],"30":[13,21],"3000":10,"3001":5,"32":[5,22],"32384":5,"327":2,"334":2,"365":26,"37":2,"4":[3,8,12,13,15,18,23],"400":2,"403":5,"404":5,"414":23,"427":2,"5":[5,8,13,18,21],"50":[1,5,26],"500":23,"508":2,"53":0,"541":2,"547":2,"583":2,"598":2,"5c0322dc559bf":2,"6":23,"6000":[3,5],"601":2,"619":2,"62":2,"645":2,"651":2,"654":2,"66":0,"660":2,"677":2,"683":2,"69":0,"6f":23,"7":[8,26],"70":0,"7000":5,"705":2,"71":0,"718":2,"722":2,"7231":23,"73":[0,2],"74":[0,2],"76":[2,22],"7692":2,"77":[0,2],"78":0,"8":[0,22,25],"80":[2,5],"8090":[5,22,23],"8192":23,"83":[0,2],"8388608":22,"8443":26,"86":0,"89":0,"8mib":[2,22],"9":[0,22],"90":18,"9010":5,"91":2,"94":0,"94p2":2,"95":0,"9999":1,"9p9m":2,"\u00f8mq":[8,9],"abstract":[15,16,29],"boolean":23,"break":[2,3,5,27],"byte":[2,5,23,29],"case":[0,2,3,5,7,12,13,18,19,20,21,23,25,26,27,28,29],"catch":[2,12,21],"class":[1,2,7,8,9,10,11,12,13,15,16,17,18,21,22,23,25,28],"default":[2,7,12,13,17,19,20,21,22,23,27,28],"do":[1,2,3,5,7,12,14,15,16,17,20,22,25,27,28],"export":23,"final":[2,5,12,13,21],"float":[14,15,17,21],"function":[2,3,5,8,10,12,13,14,16,17,18,21,22,23,25,27,28],"hron\u010dok":2,"import":[0,1,2,3,5,6,7,8,10,12,13,15,18,22,23,26,27,28],"int":21,"kobli\u017eek":0,"long":[2,10,13,14,16,21,23],"new":[1,2,3,5,10,12,13,15,16,18,19,20,26,28],"nov\u00fd":0,"ond\u0159ej":0,"pi\u00ebt":0,"public":2,"return":[1,2,3,5,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,28],"short":[5,14],"static":3,"switch":[2,7,10,17,28],"throw":15,"transient":2,"true":[1,2,3,5,7,12,14,15,17,19,20,21,23,25,28],"try":[2,5,12,13,14,15,21,25],"villac\u00ed":[0,2],"while":[2,3,5,12,15,23,28,29],A:[2,5,7,12,13,16,18,19,20,22,23,25,28,29],As:[12,21,22,23,26],At:[12,23],But:[2,12,14],By:[12,17,22,28],For:[1,5,12,15,17,19,23,26,27],If:[1,3,7,8,10,12,13,15,16,17,18,19,20,21,22,23,25,26,27],In:[1,2,7,10,12,13,16,18,19,20,21,26,29],It:[1,2,3,5,7,10,12,13,14,15,16,17,18,19,20,22,25,27,28],Its:12,NOT:17,Not:[2,5,12,27],Of:12,On:7,One:[3,12,23,25,27],Or:12,That:[3,12,27],The:[0,1,2,3,4,5,7,8,10,12,13,14,15,16,17,18,19,20,22,23,27,28],Then:12,There:[2,3,16,18,20,21,27],These:[1,4,12,27],To:[1,5,7,8,12,14,16,17,22,23,27],With:[2,8,12,28,29],_:[2,15],__:12,__all__:10,__class__:12,__del__:2,__doc__:10,__enter__:2,__exit__:2,__file__:5,__future__:5,__getitem:12,__getitem__:12,__init__:[2,12],__main__:[5,7],__name__:[5,10,12],__set__:2,__str__:2,__version__:2,_at_fork_reinit:2,_exc:15,_exit_func:2,_imp:2,_main_wrapp:2,_queuelock:2,_recv_loop:2,_socket_nodn:0,aayush:0,abil:[2,25,27],abl:[1,6,17,21,23],abort:[1,2,17,21],about:[2,3,5,6,10,12,14,15,23,25,27],abov:[10,12,23],abramowitz:0,absenc:0,accept:[0,1,2,3,4,5,10,12,13,18,23,26,29],access:[1,2,10,27,28],accident:[1,3],accompani:23,account:[2,20],accumul:[0,2],accur:23,achiev:[14,28],acquir:[0,2,20],across:[2,19],act:[5,18],action:25,activ:[10,23],actor:2,actual:[5,12,18,23],acycl:12,ad:[0,2,6,19],adamkg:0,add:[1,2,5],addit:[13,14,17,21,23],addition:2,additional_modul:[1,25],addl:29,addr:[1,5,26],address:[1,2,3,5,12,23],addressfamili:1,adjust:18,adopt:2,advanc:4,advantag:[1,25,26],advic:0,advis:16,advisori:2,af_inet:[1,26],affect:18,affected_row:13,affin:2,afford:[1,25],after:[1,2,6,12,13,14,17,20,21,23,27],ag:[0,2],again:[2,7,12,13,15,20],against:[2,14,25],aggreg:3,agnost:13,agusto:2,aha:12,aka:12,alaniz:0,alanp:2,aldona:0,alex:[0,2],alexei:[0,2],alexi:[0,2],alia:[12,13],alik:13,all:[1,2,3,5,6,12,13,15,16,17,19,22,23,26,27],allow:[0,1,2,12,13,16,22,23,29],along:2,alreadi:[2,3,5,12,13,15,16,17,18,22,23,28],already_handl:2,also:[1,2,3,6,7,12,16,22,23,25,28],alter:2,altern:[2,12],although:[2,12],alvarez:2,alwai:[2,12,19,21,23],amajorek:2,ambroff:[0,2],amen:28,amount:[1,3,13,16],an:[0,1,2,3,4,5,6,7,10,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29],andrei:[0,2],andrew:0,ani:[1,3,4,5,6,7,12,13,14,16,17,18,21,23,25,27,28],annot:27,announc:25,annoy:1,anonym:0,anoth:[1,2,7,12,15,17,20,26],answer:[2,12],anthoni:0,antonio:[0,2],anymor:2,anyth:[1,12],anywai:2,api:[2,7,8,13,19,20,23],app:[2,3,5],appar:25,appear:[2,25],append:23,appli:[2,3],applic:[1,2,3,5,7,10,12,14,21,22,23,25],appreci:0,approach:25,appropri:[2,12,27],ar:[0,1,2,3,4,5,7,8,10,12,13,14,15,16,17,18,19,20,21,22,23,25,27,28,29],arbitrari:[12,15],arg1:23,arg2:23,arg:[1,2,10,11,12,13,15,16,17,19,21,23,28],argument:[0,1,2,3,7,9,10,12,14,15,16,17,18,20,21,22,23,25],armstrong:2,around:[1,2],arrai:23,arrang:[5,15,17],arriv:12,artur:[0,2],ashutosh:[0,2],ask:[2,12],aspect:[3,25],assertionerror:15,assign:2,associ:[2,12,16],astrum:[0,2],asynchat:2,asynchron:[2,13,29],asyncor:25,atle:0,atom:29,attack:22,attempt:[12,20],attent:0,attribut:[2,12,28],attributeerror:2,authent:13,author:[2,8,29],auto:2,autocommit:13,automat:[2,7,25],autowrap:28,autowrap_nam:28,avail:[1,2,7,8,12,13,16,17,18,19,22],averi:2,avoid:[2,12,15,25],awai:[6,17,27],awaken:20,awar:[1,2,12,21,24],awesom:27,ayncor:2,azhar:[0,2],b:[5,12,15,25,26],bachri:[0,2],back:[2,5,7,13,18,22,23],backbon:6,backdoor:[2,8,9],backdoor_serv:10,backend:7,backlog:[1,2],backtrac:2,backward:2,bad:[2,3,12],badli:29,balanc:20,ballanc:0,ban:3,bando:0,bandwidth:23,bar:23,bare:3,barton:[0,2],base:[2,5,6,7,13,23,25,27],baseconn:13,baseconnectionpool:[2,13],baseexcept:[21,23],basehttpserv:25,basi:[0,2,7,13,15,23],basic:[3,8],baz:15,bean:6,becam:6,becaus:[1,2,3,4,7,12,19,20,22,25,27],becciu:2,becom:[3,12,13,16,20,23],been:[0,2,7,10,12,13,19,21,22,23],befor:[2,4,7,10,12,13,18,20,21,23,25,28],began:6,begin:[4,7,13],behav:[1,2,10,12,19,20,23,25,28],behavior:[1,2,3,4,12,14,16,17,20,22,25],behaviour:2,being:[1,2,5,7,14,17,29],beislei:0,below:16,ben:[0,2],benchmark:2,bend:2,benefit:[13,25],bennett:[0,2],benoit:[0,2],best:[7,18,25,27],beta:[3,5,8],better:[0,2,14],between:[0,1,2,3,10,12,15,27,28],beyond:7,bidirect:5,big:27,bilenko:0,bin:[2,5],bind:[1,2,12,24,25,26,27,29],bit:13,bitbucket:[0,2],blank:2,block:[1,2,3,6,10,12,13,14,16,18,19,20,21,26,28],block_on:2,blockingli:20,board:2,bob:[0,6],bodi:[2,3,5,8,10,23,26],body_length:23,boil:3,bombard:29,book:[2,29],bool:13,borzenkov:[0,2],both:[2,12,13,19,25,27],bound:[3,20,23,29],boundedsemaphor:[2,20],branch:[2,25],brandon:2,brantlei:0,brett:2,brian:[0,2],broadcast:5,broken:[2,5,22],brought:2,brows:2,browser:[5,22],brunswick:[0,2],brutal:5,bruynoogh:[0,2],bryan:0,buffer:[0,2],buflen:2,bufsiz:2,bug:[2,8,20],bugfix:2,build:[2,10,12,18],build_product_for_kei:12,builder:12,built:[1,2,7,25,26],builtin:[2,25],bulg:29,bunch:[1,2,3,5,8,13,15,16,25,27],bundl:2,burk:[0,2],busi:[0,2],busywait:2,c:[3,5,12,24,28],ca_cert:1,cach:0,cadefault:0,cafil:0,calcul:17,call:[1,2,3,4,5,7,10,12,13,14,15,16,17,18,19,20,21,22,23,25,27,28],call_aft:2,callabl:[2,12,21],callback:[2,5],calledprocesserror:2,caller:[2,10,12,13,17,18,21],can:[0,1,2,3,4,5,7,10,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],cancel:[1,2,17,21],cannot:[18,21,23],canon:[3,17],capabl:5,capac:[16,20],capath:0,capit:2,capitalize_response_head:[2,23],cappedsemaphor:20,care:3,carlisl:0,carter:0,categor:12,caus:[2,3,7,12,13,15,17,18,23],cavanaugh:[0,2],caveat:[13,21],cb:5,ccp:2,ceas:6,cert:[23,26],cert_req:1,certain:[1,2,12,25],certfil:23,certif:[2,26],cesar:[0,2],cflag:12,cgi:2,cgihttpserv:2,chain:12,challeng:25,chanc:[0,1,14],chang:[2,3,7,10,12,14,16,22,25,27],changbo:0,change_us:13,channel:[2,19],character_set_nam:13,characterist:23,chase:12,chat:[0,2,8],chat_serv:5,chatserv:5,cheap:1,check:[1,2,12,13,18,20,21],check_hostnam:2,chesneau:0,chet:0,child:2,children:0,chri:[0,2],christofi:[0,2],christoph:[0,2],chrome:2,chronolog:12,chu:0,chuck:0,chunk:[0,1,2,23],chunked_encod:2,chunkreaderror:2,chwagssd:2,cipher:2,circular:2,clad:29,clai:[0,2],classmethod:13,clean:2,cleaner:2,cleanup:[2,13],cleanup_rollback:13,clear:[2,13,14],cleaton:[0,2],clever:1,client:[0,1,2,5,8,10,14,22,23,26,27,29],client_addr:1,client_conn:26,client_ip:23,client_sock:[1,27],clock:2,clone:2,close:[0,1,2,5,13,22,23,26],closed_callback:5,closer:2,closur:22,code:[0,1,2,3,5,7,8,12,14,21,22,23,27,28],coexist:22,collect:[3,5,13,23,28],collin:[0,2],collis:12,com:[2,3,5,6,8,13,21,24,26],come:[2,3,12,23,25,28],comic:29,command:[5,10,26,27],comment:2,commit:13,common:[1,2,3,7,12,25,28],commun:[1,2,3,15,23,28],comparison:[2,29],compat:[0,2,13,20,28],compil:[5,12],complet:[1,2,3,7,12,16,17,19,23,25,27,28],complex:3,complianc:2,complic:12,concaten:3,concept:[1,6],concurr:[1,3,5,8,12,13,16,18,28],condit:2,configur:[2,7,12,26,28],confin:28,conform:0,conjunct:[14,28],conn:13,conn_info:10,conn_pool:13,connect:[1,2,3,8,9,10,22,23,26,27,28,29],connect_ex:2,connect_tcp:2,connect_timeout:13,connectionpool:13,connecttimeout:13,conserv:1,consid:[7,12,14,25],consist:[1,2,20,27],consol:[10,27],constant:[2,16],constern:12,constrain:12,construct:[1,3,4,12,13,16,17,18],constructor:[2,9],consult:2,consum:[1,2,3,8,12,16,18,19],contact:2,contain:[2,3,5,12,13,14,17,18,23,25,27,28],content:[2,3,5,9,23],context:[1,2,17,18,20,26],contin:2,continu:[0,2,9,10,12],contrast:12,contribut:[0,12],contributor:8,contriv:3,control:[2,3,4,5,7,8,17,25],conveni:[0,2,3,8,10,16,21,22,25,27],convent:[27,29],convert:[1,2,22],cooper:[1,3,10,13,17,18,21,25,28],coordin:5,copi:[2,5,27],copyright:[2,10],core:2,corei:[0,2],coro:2,coroloc:[2,8,9],corotwin:2,coroutin:[1,2,5,6,7,8,9,15,17,18,28],coroutinepool:2,correct:[0,2,12,25,27],correctli:[0,2],correspond:[12,13,18],corrupt:1,cosmic:29,cost:28,costa:[0,2],could:[2,3,5,6,12],count:[2,19,20],counter:20,counterpart:26,coupl:12,cours:[5,12,25],courtesi:2,cover:27,coverag:[2,8],cp:13,cpu:[2,21],cpython:[2,8],crash:[2,5],crawl:5,crawler:[3,8],creat:[3,13,15,16,17,18,19,22,23,26],create_connect:2,creation:[1,13],credenti:13,credentials_for:13,credit:10,critic:14,cross:[8,9,28],crt:23,ctrl:5,cuni:[0,2],current:[0,1,2,7,8,10,11,12,13,14,15,16,17,19,20,21,25,27,28],current_s:2,current_thread:2,curri:17,curried_arg:17,curried_kwarg:17,cursor:[13,28],custom:[1,2,23],custom_pool:23,customiz:2,cycl:[15,18],cython:24,d:[0,2,3,5,12,27],dag:12,dagpool:[2,8,9],dagu:[0,2],dai:[6,26],daisuk:[0,2],dan:2,danc:2,daniel:[0,2,25],daringfirebal:5,darwin:2,data:[0,1,2,3,5,12,14,19,21,23],databas:[8,9,28],databaseconnector:9,datagram:29,date_tim:23,davanum:[0,2],dave:0,david:[0,2],davoian:0,db:[2,13],db_modul:13,db_pool:[2,8,9],dbapi:[8,9],dbfbfc818e3d:2,dbname:13,dc:13,dead:10,deadlock:[2,12,16],deal:2,death:2,debug:[0,2,8,9,10,11,17,23],decid:[13,25],decis:23,decod:5,decor:[2,22],decoupl:12,decrement:20,def:[1,3,5,8,12,15,16,17,18,22,23,28],defaultselector:2,defer:2,defin:[18,23,25],deflat:[0,2],del:2,delai:[1,17],delet:2,deliv:[12,19],deliveri:[2,12,29],delport:0,demand:13,demo:5,demonstr:5,deni:0,denomin:7,dep:12,depend:[0,1,2,5,6,7,8,9,13,25,26,29],deprec:[2,7,8,23],deprecationwarn:2,depth:2,deriv:25,derk:[0,2],desc:10,descriptor:[2,7,14,23],deseri:22,design:[1,8,27],desir:[1,6,7,12,17,18,28],despit:2,dest:5,destin:13,destroi:5,detail:[1,2,14,22],detect:[0,2,14,23,27],detector:[2,14],determin:[12,13,14],deva:0,develop:[2,6,22],devpol:2,devpollselector:2,diagnos:12,diagnosi:0,dict:[10,12],dictionari:[2,10,13,23],did:[2,12],didn:3,differ:[0,1,3,5,12,15,16,19,20,22,28,29],difficult:12,dir:10,direct:[12,20],directli:[1,12,13,15,17,21,27],directori:[5,6,26,27],dirnam:5,disabl:[2,7,17,23],disadvantag:25,discard:[2,12],disconnect:[2,5,23],discov:12,discret:29,disguis:29,dispatch:[5,7,8,27],distinct:12,distinguish:[2,12],distract:2,distribut:27,dmitri:[0,2],dmitrii:[0,2],dn:2,dnspython:[0,2],do_handshake_connect:2,do_handshake_on_connect:1,do_some_stuff:20,do_someth:16,doc:[2,20,26],docstr:2,doctest:8,document:[0,1,2,7,15,22],doe:[2,5,7,10,12,14,18,20,27],doesn:[2,3,5,7,12,13,20,21,25,27],don:[1,2,3,5,12,14,23,25,27],donagh:2,done:[0,1,2,3,5,13,18,20,25],donovan:[0,2,6],dostuff:18,doubl:[0,2],down:[0,2,3,19],download:27,downstream:12,dprog:12,draft:2,dramat:3,driven:[2,8,9,23],drop:[2,16,19],drug:29,du:0,due:[2,20],dump:27,dump_debug_info:13,dup:[0,2,23],duplex:2,duplic:2,dure:[2,6,13,25,27],dweimer:2,e:[1,2,5,8,12,13,16,17,25],each:[1,2,3,7,10,12,16,19,23,27,28],eai_nodata:2,earli:[2,16,23,25],easi:[2,3,7,23,26,27],easier:[2,5,12,27],easili:[3,13],easy_instal:2,echo:[3,8],echoserv:[2,5],ed:[2,10],edward:[0,2],eexist:2,effect:[5,12,13,29],effici:2,effort:14,either:[7,12,13,17,18,21,25,26,29],elabor:[22,23],elaps:[1,7,17],element:[3,25],elif:5,elig:17,elimin:[2,7],els:[2,5,12,17,19,21],emb:2,embed:23,emit:27,empti:[2,5,12,18,19,21,22,23],en_al:[3,5,8],enabl:[2,7],enchant:[0,2],encod:[0,2,22],encount:12,encrypt:23,end:5,endless:2,endpoint:29,engin:25,enotconn:2,enough:[16,27],enqueu:19,ensur:[1,2,7,12],enter:12,enthusiast:2,entir:[15,25,27],entri:[2,13,19,20],enum34:2,enumer:12,env:[2,5,23],environ:[0,2,3,5,7,8,22,23,27,28],environment:27,eof:5,epol:[2,7,27],epollselector:2,equal:[0,20],equival:[4,21,25],era:29,erdfelt:[0,2],erenst:[0,2],eric:[0,2],erpc:2,err:12,errno:[13,22],error:[0,2,5,13,15,22,23],errorhandl:13,especi:[2,14],essenc:[1,12],essenti:3,etc:2,eugen:0,evalu:27,even:[2,12,17,23],evenlet:23,event:[0,2,7,8,9,14,23,29],eventlet:[0,1,2,3,4,5,6,9,10,11,12,13,15,16,17,18,19,20,21,22,23,25,28,29],eventlet_hub:[2,4,7,27],eventlet_no_greendn:2,eventlet_threadpool_s:[4,28],eventlet_tpool_dn:2,eventlet_tpool_gethostbynam:2,eventu:12,everi:[1,2,5,7,12,13,14,19,20,23,25,28],everyth:[1,2,12,25,27],everywher:7,evid:3,evt:[2,15],exact:[0,2,29],exactli:[2,12,20,25,26],exampl:[0,1,2,3,8,13,15,17,21,22,23,25,26,27,28],exc:[2,12,15],exc_aft:2,exc_info:[2,15,17],exce:[13,18,20],exceed:[2,23],except:[0,1,2,3,5,13,14,15,16,17,19,21,23,25,29],exceptionsubclass:12,excess:[1,2,22],exec:2,execut:[1,2,3,10,13,14,16,17,21,23,27,28],execv:2,exercis:[5,27],exist:[1,2,7,12,13,16,18,27],exit:[2,5,16,17,23],expect:[2,23],expens:17,expir:2,expiri:2,explain:2,explicit:[2,12,13],explicitli:[1,2,7,12,17,25],express:[17,18],extens:[0,2,9],extern:[2,3,6,12],extrem:16,face:1,fact:[3,12],factor:27,fai:2,fail:[2,4,12,21,27],failur:[2,12],fall:3,fals:[1,2,5,12,14,17,18,19,20,21,23],famili:1,farm:[5,16],fashion:[2,26],fast:2,faster:[1,17,19],fastest:[7,17],favo:[0,2],favor:2,fcntl:2,fd:[0,2,5,7],featur:[1,2,5,21,23],feed:[3,8],feedpars:[3,5],feedscrap:[3,5],feng:0,fetch:[3,5,8,19,26],fetch_titl:[3,5],fetish:29,few:[2,3,4,6,22,25],fewer:[1,2],field:[2,23],figur:[0,14],file:[2,3,5,7,14,15,16,22,23,25,27],filenam:[16,27],filter:12,find:[1,8,12,22,23],findit:5,fine:[7,25],finer:27,finish:[12,16,17,23],finit:[1,17],fire:2,first:[1,2,4,7,12,13,17,18,19,21,25,26],five:12,fix:[0,2,12],flag:[0,2,12,21],flori:[0,2],flow:12,flush:[2,5],follow:[2,12,17,22,23,26,27],foo:[2,23,27],foo_class_test:27,foo_test:27,forbidden:5,forc:[4,28],forcibl:22,ford:[0,2],forestal:2,forev:[12,23],forgot:12,forgotten:7,fork:[2,6],form:[7,19],format:[12,14,15,23,27],format_date_tim:23,format_hub_listen:14,format_hub_tim:14,formerli:19,forth:[12,22],fortun:[25,28],forward:[2,6,8,23,28],found:[5,19],fraction:[15,17],frame:[2,17,22],framework:[5,6,7],free:[1,13,16,18,19],freebsd:2,friendli:1,from:[0,1,2,3,5,7,8,10,12,13,14,15,16,17,18,19,22,23,25,26,27,28,29],from_brows:22,ftplib:2,fukuchi:[0,2],full:[2,3,19,22,23,27],fuller:2,fulli:[2,5,23],func:[1,16,17,21,23],functool:18,fund:2,fundament:1,further:29,furthermor:2,futur:[2,8],g:[0,1,2,12,13,16,17,25],gao:2,garbag:13,garcia:2,garth:2,gasp:3,gaynor:2,gcb:0,gener:[1,2,8,9,12,13,15,17,22,23,27,29],genericconnectionwrapp:13,genrsa:26,geoff:[0,2],geoffrei:[0,2],georg:[0,2],gerrard:[0,2],get:[0,1,2,3,5,6,7,12,13,14,16,17,18,19,20,21,27,29],get_default_hub:[2,7],get_hub:[2,7],get_id:[11,28],get_nowait:19,getaddrinfo:2,getattr:2,getcurr:17,gethostbynam:[2,5],getsocknam:27,getsockopt:[0,2],geturl:5,gevent:2,gevorg:0,gh:[0,2],gholt:2,ghsa:2,gif:[3,5,8],gigabyt:3,github:[2,24],give:[0,2,13,18],given:[3,7,10,12,13,14,16,17,19,20,22],global:[1,2,3],go:[5,14,23],goal:1,godwin:0,goe:19,goetz:[0,2],gogreen:0,gohad:[0,2],gone:2,good:[0,1,3,5,7,15,17,23,25],goodspe:[0,2],googl:[2,3,5,8,21,26],got:[3,5,8,12,13,18],gotten:[12,19],govern:14,grace:[2,5,22],gracefulli:1,grainger:[0,2],grammat:2,grant:[0,2],granular:27,graph:12,great:[0,5],greater:[14,18,20],greatli:0,green:[0,1,2,3,5,8,9,23,26,28,29],green_fileobject:2,greendn:2,greenfil:2,greenfileio:2,greenio:2,greenlet:[2,6,7,10,11,14,17,19,23,28],greenletcontext:2,greenletexit:[17,23],greenlib:2,greenpil:[1,2,3,5,16],greenpip:2,greenpool:[1,2,3,5,8,9,12,23],greensocket:[0,2],greenssl:2,greensslobject:2,greenthread:[0,2,5,7,8,9,10,13,14,16,18,19,20,21,24,28],gregori:[0,2],grinberg:[0,2],group:5,grow:3,grugq:[0,2],gt:17,guarante:12,guard:20,gubarev:[0,2],guemar:[0,2],gunicorn:2,guo:0,gysin:0,h1:23,ha:[0,1,2,3,5,6,7,10,12,13,15,16,17,18,20,21,22,23,25,26],had:[2,3,6,7,19],haferkamp:[0,2],haikel:[0,2],hand:[3,5,12,29],handi:3,handl:[0,1,2,3,5,10,12,22,23,26,27],handler:[2,5,22],hang:[2,23],hansen:[0,2],happen:[3,4,7,12,20,25],happili:2,hard:[12,14,18],hardcod:27,harder:27,hardi:0,harkot:[0,2],harri:0,hasn:17,hassl:8,have:[1,2,3,5,7,12,13,17,19,23,25,26,27,28],he:6,header:[0,2,9,22],headers_raw:2,hello:[5,22,23,26],hello_world:[5,22,23],help:[0,2,10,12,23],henc:12,here:[1,2,3,5,10,20,21,22,25,26,27],hi:6,high:[13,18],higher:2,hint:[0,23],histor:13,histori:8,hit:1,hk:23,hmm:12,hoerner:2,hog:2,hohberg:2,hold:[1,2,13,15,18],holger:0,holt:[0,2],hood:25,hook:[9,14],host:[1,2,6,13],hostnam:13,hostport:10,how:[1,2,3,5,8,10,12,13,14,15,20,23,27],howev:[6,12],hrachyshka:[0,2],html:[2,5,23,27],html_path:5,http:[2,3,5,6,8,18,21,23,24,26],http_pool:18,httpc:2,httpd:2,httpdate:2,httplib2:[2,18,25],httplib:2,httpprotocol:23,httpserver:2,hua:[0,2],hub:[0,2,4,8,14,28],hub_blocking_detect:14,hub_except:[14,17],hub_listener_stack:14,hub_prevent_multiple_read:14,hub_timer_stack:14,hudson:2,huge:27,hundr:23,hung:12,hussain:[0,2],hybrid:7,i1:[3,5,8],i:[1,2,3,5,6,7,8,16,17,25],ibarra:2,id:11,idea:[7,17],ideal:7,ident:[2,5],identifi:12,idiom:[1,3],idl:[2,13],ietf:23,ignor:[1,2,5,19,20,23],ihar:[0,2],illumin:1,imag:[3,5,8],imagin:[3,20],imap:[3,5,8,12,16],img:3,immedi:[1,12,15,17,19,20],imp:2,imped:27,implement:[0,1,2,5,6,7,8,9,12,14,15,18,19,20],implic:12,implicit:12,implicitli:12,import_patch:[1,3,5,25],importerror:2,imposs:2,improp:2,improperli:2,improv:[0,2,23],includ:[2,3,6,10,12,13,23,25,27],inclus:27,incom:[1,22,29],incompat:[0,2],incorpor:2,incorrect:[0,2],incorrectli:2,increas:[2,19],incred:[0,5,14],increment:[3,20],indetermin:[12,18],index:[2,8],indic:[5,12,18,19,23],indra:6,infinit:[2,19],info:[10,23],inform:[1,10,12,25],inherit:[23,25],init:2,initi:[2,12,19,20],inject:[2,29],input:[1,2,3,5,12,16,23],insecur:26,insensit:2,insert_id:[2,13],insid:23,inspect:[1,7,10,14],inspir:2,instal:[2,5,7,14,27],instanc:[1,7,12,13,17,18,21,22,23],instead:[1,2,3,4,7,12,13,14,16,20,25,27],instruct:2,integ:[2,16,17,20],integr:[0,2],intend:[13,21],intention:12,interact:[8,9,12,22],interchang:1,interest:[3,5,19],interfac:[1,2,25,26,28,29],interfer:17,interlock:20,intern:[2,7,10,13,20],internet:[2,5],interpret:[8,9],interrupt:[12,14],intl:[3,5,8],introduc:[0,2],invalid:[0,2],investig:2,invis:3,invit:2,invoc:28,invok:20,involv:[3,12,23,27],io:2,ioerror:2,ip:[3,5,23],ippolito:[0,6],ipv6:2,is_monkey_patch:25,is_timeout:2,ishaya:2,isinst:[12,28],isn:[2,3,27],isol:2,isotop:29,issu:[0,2,6,23],issuer:26,item:[12,13,15,16,18,19],iter:[0,1,2,3,5,12,16],itertool:16,its:[1,2,3,4,5,10,12,13,14,16,17,18,19,20,27,28],itself:[1,2,3,5,7,12,13,14,17,21,25,27,29],jacofouri:2,jago:0,jake:[0,2],jakub:[0,2],jame:0,jan:[0,2],janusz:[0,2],jarrod:0,jaum:2,jessica:2,jira:2,jm8w:2,job:[0,2,3,5,16],joe:0,johann:[0,2],john:0,johnson:0,join:[2,3,5,19],join_reactor:2,josh:[0,2],joshua:0,json:2,jsonhttp:2,juan:2,julien:2,junctur:14,junyi:2,just:[3,5,12,25,26,27],justdoit0823:2,justin:2,k:23,kaprielian:0,kartic:0,kasarher:2,kashirin:2,kasurd:0,keep:[2,5,21,26],keepal:[2,23],kei:[3,12,23,25,26,28,29],kent:0,kept:3,kernel:14,kerr:[0,2],kerrin:[0,2],kevent:2,kevin:0,keyboardinterrupt:5,keyerror:12,keyfil:23,keyword:[1,2,10,12,13,17,21,25],kill:[2,12,17,23],killal:2,kim:[0,2],kind:5,know:[1,2,7,12,14],known:[2,12],konstantin:[0,2],kortmann:2,kovari:[0,2],kqueue:[2,7,27],kqueueselector:2,krekel:0,krishnamurthi:0,kruglyak:[0,2],kuo:[0,2],kw:[1,11,13,16],kw_additional_modul:[1,25],kwan:0,kwarg3:23,kwarg4:23,kwarg:[2,10,13,16,17,23,28],kwd:[12,21],lab:[3,6,8],lack:[2,25,27],lambda:[5,18],languag:12,larg:[2,17],larger:20,lasso:[0,2],last:[2,12,15,21],lastli:27,late:25,later:[1,2,3,21,26],latin:2,launch:[1,3,7,12,16,23],lazi:7,lead:0,leak:2,learn:10,least:[1,2,17,27],leav:[1,10,12],lee:[0,2],left:[2,5,12],legaci:2,legal:2,len:[3,5,8,23],length:[2,5,22,23],lengthi:13,less:[2,16,19,20,23,29],let:[7,12],level:[2,23],levent:[0,2],lib:[2,6,27],liberal_regex_for_matching_url:5,libev:[2,7],libnam:12,librari:[0,1,2,6,7,8,12,19,24,28],libzmq:2,licens:[2,10],life:[6,13],lifespan:13,lifetim:25,lifoqueu:19,light:6,lightqueu:19,like:[1,2,5,7,12,13,14,17,19,20,22,23,25,26,27,28],limit:[1,2,3,5,13,16,18,20,21,27],linb:[0,2],linden:[2,3,6,8],line:[1,2,3,5,7,15,16,21,23,25,27],linger:2,link:[1,2,5,17],linkflag:12,linux:[2,7,27],lior:[0,2],list:[0,2,3,4,5,15,16,17,27],listen:[1,2,3,5,7,10,14,22,23,26,27],liter:[0,12,13],littl:[5,7,19,27,28],live:0,ll:[5,27,28],local:[1,7,8,9,10,27],localhost:[5,10,13,27],locat:[0,6],lock:[1,2,20],log:[0,2,14,22,23],log_format:[2,23],log_output:[2,23],log_x_forwarded_for:23,logfil:2,logger:23,logic:14,logo:[3,5,8],logutil:2,lon:2,longer:[2,13],look:27,loop:[1,2,3,5,6,7,10,17,23],loss:2,lost:2,lot:1,lowercas:[0,2],lowest:[7,19],lu:[0,2],luci:0,luke:0,luo:[0,2],m:5,macosx:2,mad:2,made:[2,5,8,19],magic:25,mai:[1,5,6,7,12,13,15,17,18,19,20,21,23,25,26,29],mail:0,main:[1,2,6,7,17,25,28],mainloop:7,maintain:[8,13],major:[1,2,19,28],majorek:0,make:[0,1,2,3,5,7,12,14,15,20,23,26,27,28],makefil:[2,5,21],makegreenfil:2,malcolm:[0,2],malicki:0,manag:[1,2,5,7,13,18,20],mandat:23,mani:[0,1,2,5,12,16,20,23,27,29],manner:[7,25],manual:2,manuel:2,map:13,marc:0,marcel:2,marcin:[0,2],marcu:[0,2],marhuenda:2,mark:[2,13,18],mark_as_clos:[2,7],mashup:5,mask:2,match:[2,18,28],matt:[0,2],matthew:[0,2],max:[12,16,18],max_ag:13,max_frame_length:22,max_http_vers:23,max_idl:13,max_siz:[13,18,23],maximum:[1,2,18,19,22,23],maxsiz:19,mcarter:2,mccabe:2,mclaren:[0,2],mean:[2,4,5,7,12,13,19,23,25,27,29],meant:[2,6,10],measur:13,mechan:[2,23],memori:[1,2,3,16],mere:[2,17],merg:2,merritt:[0,2],messag:[2,5,22,23,29],meth:28,method:[0,1,2,3,7,12,13,17,18,19,20,22,23,25,28],michael:[0,2],middl:2,might:[7,12,15,17,21,22,23,25,27,28],miguel:[0,2],mike:[0,2],mikepk:[0,2],min:18,min_siz:[2,13,18],mind:21,minimum:[3,23],minimum_chunk_s:[0,2,23],minimum_write_chunk_s:23,minor:2,miro:2,misc:2,mishra:[0,2],mismatch:[2,27],miss:[2,27],mission:2,mistak:[2,14],mit:8,mix:29,mode:2,modern:2,modif:2,modifi:[2,3,18,25],modul:[0,1,2,5,7,8,10,13,14,15,17,19,22,23,25,26,27,28,29],module_nam:25,modulenam:1,mollett:2,moment:[14,23],monkei:2,monkey_patch:[1,2,25],monkeypatch:[1,2,8,28],monoton:2,more:[1,2,3,5,6,8,10,12,16,18,19,20,22,23,25,26],most:[1,2,5,6,13,15,19,20,21,25,27],mostli:19,move:[2,5],mswindow:2,much:[1,2,12,13,20,26,27],multi:[2,8,19],multicast:29,multipl:[1,2,5,7,10,12,13,14,15,20,23,25,29],multiplex:7,multiprocess:19,multitudin:2,murau:[0,2],murthi:0,muscl:29,must:[2,12,13,15,17,18,20,21,23,25],my:21,my_func:28,my_handl:22,myapp:10,myfunc:10,myhandl:1,myhub:7,myobject:18,mypackag:7,mypool:18,mysock:21,mysql:2,mysqldb:[0,2,13],n:[3,5,23,26],nake:1,name:[1,2,6,7,12,13,23,25,27,28],nameerror:2,nameserv:2,nat:[0,2],nativ:[7,25,28],natur:12,nearli:1,necessari:[2,7,12,18,19,22],necessarili:12,need:[1,2,4,7,12,18,20,23,25,26],neg:[2,16,20],neither:12,net:[2,5],network:[2,6,8,25,27],neudorf:[0,2],never:[10,12,15,19,21],new_connect:5,new_siz:[16,18],new_sock:[3,5],new_url:5,new_writ:5,newli:12,next:[2,3,12,16,17,20],nginx:2,nica:[0,2],nice:[0,2,27],nick:[0,2],noblock:[0,2],nobodi:2,node:[12,26],non:[2,5,6,9,12,18,25,26],nonblock:[2,28],nonblockingli:1,none:[1,2,5,7,10,12,13,14,15,16,18,19,20,21,22,23,25],nonsens:2,nonsocket:2,nontrivi:12,nonzero:20,nor:[12,18],normal:[1,3,7,10,13,14,17,22,23,25,28,29],nose:[2,27],nosetest:27,notabl:2,notdon:12,note:[1,3,4,5,15,17,22,27],noth:17,notic:[2,12],notify_open:2,now:[2,12,13],nullari:18,number:[1,2,3,5,12,13,15,16,18,19,20,23,27],nvisit:5,o2:12,o:[0,6,7,16,17],obj:[13,18,28],object:[1,2,7,12,13,15,16,17,18,19,22,23,28],observ:[10,12],obtain:12,obviou:1,occasion:[17,27],occur:[15,21],octal:0,oden:0,off:[1,3,12,25],often:[2,12,14],ok:[3,5,20,23],old:[2,7],oldest:22,omit:[1,12,21,27],onc:[2,3,6,12,13,15],one:[1,2,3,4,5,7,10,12,13,15,16,17,18,19,20,21,23,25,26,27,28,29],ones:[1,5,7,12,25,27],onli:[0,1,2,4,5,7,8,12,13,15,17,18,19,21,23,25,26,28,29],onno:2,onto:28,opaqu:18,open:[0,1,2,3,5,6,8,13,16,21,23],openssl:[0,2,26],oper:[0,2,5,6,7,10,13,15,16,18,19,21,23,28],oppenheim:[0,2],opportun:17,opposit:20,optim:[2,3,4],option:[0,1,2,12,19,20,22,23,27,28],order:[3,6,7,12,13,18,19,20,22,27,28],order_as_stack:18,org:[3,5,8,23,24],organ:29,orient:29,orig_err:12,origin:[8,12,15,22],originalerror:12,orishoshan:[0,2],orlov:[0,2],os:[0,1,2,5,25,27,28],oserror:2,other:[1,2,3,7,12,13,15,17,18,19,20,22,23,25,27,28],otherwis:[17,19,20],our:5,out:[0,1,2,5,10,13,14,15,16,18,20,21,25],outbound:5,outgo:3,output:[2,12,27],outq:5,outsid:[12,21],over:[1,2,3,5,12,16,17,25,26],overal:[2,16],overhaul:2,overhead:[19,28],overrid:2,overridden:[2,23],overriden:[0,2,13,18],own:[5,7,12,16,17,27,28],owner:2,p:5,packag:[2,23,25,27],page:[0,2,5,8],pagel:[0,2],pai:0,pair:[2,12,23,25,29],parallel:[1,2,3,5,27],paramet:[1,2,12,13,16,21,23],paramiko:2,parent:[2,15,17,28],pars:[3,5],parse_q:2,part:[1,2,23],parti:7,partial:[2,12,18],particip:5,particular:[2,3,13,25,27],pascu:2,pass:[0,2,5,7,12,13,15,18,21,22,23,26],passwd:13,past:25,patch:[0,2,8,25],patcher:[0,2,25],patcher_test:2,path:[2,5,12,22],path_info:[2,5,22],pathlib:2,patienc:0,patrick:0,patrin:2,pattern:[1,5,8],paul:[0,2],pavel:6,payload:[22,23],peak:13,peer:29,pend:[1,12,21],pep333:23,pep:[0,2,25],per:[0,1,2,13,23],perform:[2,6,10,12,17,23,25],perhap:5,period:13,permessag:[0,2],peter:[0,2],phu:[0,2],physic:29,pick:[4,20],pie:12,pigmej:2,pile:[3,5],pin:2,ping:13,pipe:[5,22,28],place:[2,7,19,25,27],plai:2,plain:[2,3,5,13,23],plan:21,platform:[2,7,27],plch:2,pleas:[2,22,26],plu:[2,12],plugin:27,plumb:2,png:3,podoliaka:[0,2],point:[1,2,5,12,14,15],poll:[0,2,7,12],pollhub:2,pollselector:2,pollut:2,polyak:[0,2],pool:[1,2,3,4,5,8,9,12,14],pooledconnectionwrapp:13,popen4:2,popen:2,popul:18,port:[1,2,3,8,10,23,27],portant:[0,2],posit:[12,14,19,20,21],possibl:[1,2,7,12,17,19,20,25],post:[0,3,5,9],postgr:0,posthook:[2,23],potenti:2,power:[14,26],pprint:12,practic:[3,7,25],pre:[0,18],preced:0,precis:2,precompil:12,predict:14,preemptiv:1,prefer:[1,7,22],prematur:2,prepopul:12,present:[1,2,15,25,27,29],preserv:[2,15],preston:[0,2,6],pretend:23,pretti:5,prevent:[1,2,14,17],previou:[2,13,18],previous:[2,12],primari:[2,8,13,22,28],primit:[1,8,9,17,28],primitv:5,print:[1,2,3,5,8,12,13,14,15,16,17,18,23,26,27,28],print_funct:5,printout:27,prior:12,prioriti:19,priorityqueu:19,privat:[23,26],probabl:[2,7],problem:[2,3,12,21,25],problemat:23,proc:2,proce:12,process:[1,2,3,5,8,9,12,16,19,22,23],produc:[2,8,12,19,28],producer_consum:5,product:[3,12,14],profil:[0,2],program:[4,5,7,12],programmat:12,progress:12,project:[0,2,6,29],promot:7,proof:6,propag:2,propagateerror:12,proper:20,properli:[2,23],properti:[17,20,22],proport:16,protect:[2,3,14],protocol:[2,22,23],provabl:12,provid:[0,1,2,3,5,12,13,18,21,22,23,25,27,28,29],provision:23,proxi:[0,2,3,13,28],psycopg2:[2,13,25],psycopg:[2,25],pub:2,pull:[0,2],punct:5,purpos:[2,3,26,27],push:[5,20],put:[2,5,7,13,15,18,19,23,29],put_nowait:19,putter:19,py27:2,py2:2,py37:2,py39:2,py3:2,py3k:2,py:[0,2,5,15,22,23,26,27],pycon:[2,6],pycurl:2,pyevent:[2,7,28],pygtk:0,pyobj:2,pyopenssl:[1,2,8],pypi:[0,2,5],pytest:2,python2:2,python3:[0,2],python:[0,1,2,3,5,6,7,9,12,23,24,25,26,27,28],pythonpath:[5,27],pyzmq:[2,24],q:5,qi:2,qsize:19,qthcn:0,quad:2,quan:[0,2],quantiti:16,queri:[2,13],question:[0,12],queu:[1,29],queue:[1,2,5,8,9,15,25,29],quick:1,quickli:5,quirk:0,quit:[1,5,16,25,27],r:[0,2,5,16,23],race:2,radioact:29,radix:0,rai:29,rais:[1,2,5,7,12,13,14,15,16,17,19,20,21,22,23],ralf:[0,2],ramakrishnan:[0,2],ran:27,rand:2,random:[2,5,20,28],rang:5,rare:[2,21,25],rather:[1,3,5,12,27],rational:9,raw_path_info:2,rawconnectionpool:13,raylu:[0,2],raymon:2,raymond:0,rcvtimeo:2,rdtype:2,re:[2,5,15,21,25,26,28],reach:20,reactor:2,read:[0,1,2,3,5,7,8,14,21,23,26,27],read_chat_forev:5,readabl:[1,2],readal:2,reader:[2,3,5],readi:[2,7,12,15],readlin:[0,2,3,5,21],readm:0,readuntil:2,real:28,realli:14,realtim:12,reason:[12,13,25,27,28],rebuild:[2,12],receiv:[2,3,14,19,29],recent:[2,15,19,21],recommend:12,reconnect:29,record:[12,14],recurs:[2,8,12],recursionerror:2,recursive_crawl:5,recv:[2,3,5],recv_into:2,red:6,redbo:2,reduc:[0,2],redund:2,reentrant:[2,16],ref:2,refactor:2,refer:[1,2,8,13,15,25],reflect:[2,12],regard:0,regardless:[1,2,12,17],regist:[7,14],register_at_fork:2,regular:[1,2,5],reimplement:2,reimport:2,rel:2,relat:[1,2,8,16,25],relationship:29,releas:[2,20],relev:12,reli:[20,25],reliabl:[2,29],reload:5,remain:[8,13,23,28],remot:2,remote_port:[0,2],remov:[2,5,8,13,14,17,19],renam:2,render:0,repeatedli:[3,15],replac:[2,12,25],report:[0,2,12,19,27],repr:[5,26],repres:[1,12,13,16,20,28],represent:2,repro:0,req:26,request:[0,1,2,3,5,8,10,12,22,23,26],request_lin:23,request_method:5,requir:[1,2,5,6,7,12,13,20,23,25],rescu:25,research:29,resembl:19,reset:[2,15],resiz:[2,16,18,19],resolut:14,resolv:[2,5],resourc:[8,9,14,20],resourcewarn:2,respect:[0,2,3,5,12,19],respond:[0,3,23],respons:[0,2,9,22],rest:[1,10,12,13],restart:12,restor:25,restrict:[1,28],restructur:7,restserv:6,result:[0,1,2,3,5,12,13,15,16,17,18,21],result_from_a:12,result_from_zlib:12,resum:[2,10,12,14,19],retri:[0,2],retriev:[1,3,12,16,17,19],return_valu:12,retval:15,reus:[13,15],reuse_addr:1,reuse_port:1,revers:20,review:2,rfc3493:2,rfc7231:23,rfc:[2,23],rfk:[0,2],rhel:2,rhode:2,right:[2,17,18],risk:16,rivera:0,rlock:2,rm:2,robinson:0,robot:5,robust:[2,3],rollback:13,roman:[0,2],root:13,routin:18,rss:3,rtyler:2,ru:5,rudd:0,ruijun:[0,2],rule:[10,25],run:[0,1,2,3,5,6,7,8,9,12,14,16,17,23,26,27,28],runner:2,running_kei:12,runtim:[18,25],runtimeerror:15,rw:5,ryan:[0,2],s33kr1t:13,s:[0,1,2,3,4,5,6,7,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],safe:[1,2,7,25,28],safeti:5,sai:12,sake:26,salmon:[0,2],sam:2,same:[0,1,2,3,5,6,7,10,12,14,15,16,17,20,21,22,23,25,26,27],sampl:23,samuel:[0,2],saranwrap:2,save:[0,1],saw:5,scenario:23,schedul:[1,2,6,7,17,21],schema:13,scheme:2,schmir:[0,2],schmitt:0,scope:[2,7],scott:[0,2],scraper:[3,8],script:2,sean:[0,2],search:[5,8],second:[0,1,2,7,13,14,15,17,18,19,21],secondlif:[2,26],secret:29,section:[21,23],secur:[2,23,26],sedov:2,see:[1,2,4,5,7,12,14,15,17,21,22,25,27],seed:5,seek:2,seem:5,seen:5,select26:2,select:[0,1,2,7,13,25],select_db:13,selector:2,selectselector:2,self:[10,15,18,26],sem:20,semant:[2,20,29],semaphor:[0,2,8,9],send:[2,5,15,22,23],send_except:[2,15],send_hundred_continue_head:2,send_hundred_continue_respons:23,sendal:[0,2,3,5],sender:5,sendto:2,sens:27,sensibl:[2,27],sent:[2,23],separ:[1,2,16],sequenc:[2,12,25],sergei:[0,2],sergeyev:[0,2],serial:[12,22],serv:[1,2,10,12,23,27],serve_forev:2,server:[1,2,8,9,10,26,27,29],server_cap:13,server_ev:23,server_hostnam:2,server_sid:[1,23],server_sock:27,servic:3,session:1,set:[1,2,5,10,12,13,14,17,18,20,21,22,23,26,28],set_accept_st:26,set_character_set:13,set_hundred_continue_response_head:23,set_isolation_level:[2,13],set_nonblock:2,set_num_thread:2,set_server_opt:13,set_sql_mod:13,setitim:[2,14],settimeout:[0,2],setup:[2,12,27,29],setuptool:2,sever:[12,13],seyeong:[0,2],sha1:26,share:[1,13,14],shaun:[0,2],shaw:2,shepelev:[0,2],ship:2,shop:26,shorter:14,shorthand:12,should:[1,2,12,15,17,20,21,22,23,25,28],shouldn:2,show:[3,5],show_valu:14,show_warn:13,shown:[12,23],shutdown:[2,13,26],side:3,sigalarm:14,sigchld:2,sign:[20,26],signal:14,signatur:[2,17],signific:2,silenc:21,silent:4,similar:[2,15,19],similarli:12,simmon:[0,2],simon:0,simpl:[3,5,8,12,22,23],simplehttpserv:2,simplejson:2,simpler:28,simplest:28,simpli:[1,2,7,10,12,13,22,23,25,27],simplic:[1,26],simultan:[0,2,3,5,29],sinc:[5,25,28],singh:0,singl:[1,2,10,12,13,15,16,18,22,23,25],singleton:7,sit:1,site:[5,23],situ:10,situat:[12,16,20],six:[2,5],size:[2,4,12,16,18,19,23,28],size_or_pool:16,skip:[2,27],skip_if_no_ssl:2,skirko:[0,2],slant:0,sleep:[1,2,5,15,17,21,25],slide:0,slight:25,slightli:[2,3,22,23],slot:[16,19],slow:25,small:[0,2,5,23],smart:[2,27],snapshot:12,sndhwm:2,so:[0,1,2,3,4,5,7,10,12,13,15,17,20,21,23,25,27],so_reuseaddr:[0,1,2],so_reuseport:2,sock:[1,2,10,22,23,26],sock_dgram:29,sock_stream:[26,29],socket:[0,1,2,3,7,8,10,14,17,22,23,25,26,28,29],socket_timeout:[2,23],socketconsol:10,socketserv:25,softwar:13,some:[1,2,3,5,6,7,12,13,17,18,20,21,25,26,27,28,29],someon:[2,12],someth:[2,3],sometim:[2,25,27],somewhat:3,soon:12,soren:[0,2],sorri:2,sort:[5,12,25],sottil:0,soup:27,sourc:[0,2,5,6,8,27],soviet:29,spandex:29,spare:6,spawn:[2,3,5,8,10,12,15,16,17,23,26,27],spawn_aft:[1,2,17],spawn_after_loc:17,spawn_mani:12,spawn_n:[1,3,5,15,16,17],speak:29,spec:[22,23],special:[7,12,21],specif:[1,7,12,13,17,23,27],specifi:[4,7,10,12,14,15,17,18,20,23,25],spent:6,spew:14,sporad:0,spread:2,sqlite:2,sqlstate:13,squeaki:2,squelch:0,sriniva:[0,2],ssl:[0,1,2,8,9,22,25],ssl_listen:2,ssl_version:1,sslconnect:2,sslcontext:2,sslsocket:[2,26],sslv23_method:26,sslwantreaderror:2,stack:[5,14,15,17],stacktrac:15,stand:2,standalon:16,standard:[1,2,3,5,8,9,19,26],stanescu:0,stanworth:[0,2],starmap:16,start:[1,2,3,5,6,7,12,17,23],start_respons:[3,5,23],start_url:5,starting_id:28,startup:2,stasiak:[0,2],stat:13,state:[6,10,14,25],statement:[1,2,12,13,18,21,25],statu:23,status_cod:23,stawiarski:[0,2],stderr:23,stdin:15,stdlib:[2,27],stdlib_queu:19,stdout:14,stefan:[0,2],stefano:0,step:2,steven:[0,2],stick:[5,10,28],still:[2,12,13,21,22],stinner:[0,2],stock:[0,2],stolen:29,stomp:2,stop:[1,2,6,12,14],stopiter:[12,16],stopserv:1,storag:[8,9],store:[3,12,15],store_result:13,str:[2,12,23],straightforward:2,straightforwardli:12,strang:2,stream:29,strict:[12,29],strictli:[12,20],string:[2,3,12,14,21,22,23,28],string_liter:13,strip:[2,5],structur:[1,3],stuart:[0,2],stub:27,stuck:12,stuf:1,stuff:[1,2],style:[3,6],sub:[2,27],subclass:[2,12,13,18,19],submiss:0,submodul:2,subprocess:[0,2],subscrib:2,subsect:1,subsequ:[12,19],subset:13,substanti:7,subtl:2,subtli:20,succe:12,succeed:12,success:2,successfulli:[12,17],suffic:12,suggest:0,suit:[2,13,16],suitabl:2,sullivan:0,summari:[1,27],supersocket:2,suppli:[1,7,10,17,23,28],support:[0,2,5,7,9,19,22,25,27,29],suppos:[12,13,18],suppress:[2,21],suppress_ragged_eof:[1,2],sure:[0,1,2,7,20],suspend:[1,7,16,20],svn:6,swallow:2,swap:25,swap_in:2,swap_out:2,switch_out:2,switchingtodeadgreenlet:2,sy:[2,15,23,25],synchron:[2,19,29],syntax:2,syntaxwarn:2,syscal:[0,2],system:[1,2,7,14,25,27],systemexit:5,szotten:[0,2],t:[1,2,3,5,7,12,13,14,17,20,21,23,25,27],takashi:2,take:[1,6,12,13,15,20,29],taken:13,tal:0,talk:[2,6,8],tarbal:[2,27],target:[13,17],task:[2,7,16,19],task_don:19,taso:0,tavi:[0,2],tcp:[1,2,29],tcp_listen:2,tcp_nodelai:2,tcp_quickack:2,tcp_server:2,teardown:29,technic:23,tediou:5,tegel:[0,2],tell:[14,19,27],telnet:[5,10],templat:23,tempmod:27,temporarili:25,ten:3,tend:13,term:[1,3,8],termin:[1,5,12,14,17,22,26],tesler:[0,2],tess:0,test:[0,2,8,12,13,23,26],test_024a_expect_100_continue_with_head:23,test_024b_expect_100_continue_with_headers_multiple_chunk:23,test_024c_expect_100_continue_with_headers_multiple_nonchunk:23,test_import_patched_default:2,text:[2,3,5,23],than:[1,3,5,12,13,16,17,18,19,20,23,25,26,27],thank:[2,8],thei:[1,2,3,4,5,7,12,13,15,16,19,23,25,27,28],them:[2,7,12,13,14,15,20,27,28,29],themselv:28,therebi:3,therefor:[2,14,25,28],therein:2,thereof:15,thi:[1,2,3,4,5,7,8,10,12,13,14,16,17,18,19,20,21,22,23,25,26,27,28],thier:0,thing:[5,10,13,15,16,17,18,20,28],third:7,thoma:[0,2],those:[2,3,5,12,23,27,28],though:[1,2,12,17,20,23,27],thousand:3,thread:[0,1,2,3,5,7,8,9,19,20,23,25],thread_id:13,threadloc:2,threadpool:[2,4],threadpoolexecutor:2,three:[2,13],through:[5,12,13,21],throughout:13,throw_arg:17,thrown:27,thu:[2,6,7,12,16,20,23,29],ti:3,tian:[0,2],tim:[0,2],time:[1,2,3,6,12,13,14,15,16,17,18,19,20,21,22,23,25,28,29],timeout:[0,1,2,5,7,8,9,14,15,18,19,20,23],timeout_exc:7,timeout_valu:21,timeoutexpir:2,timer:[2,7,13,14,21],timestamp:23,titl:[3,5],toe:2,toggl:14,token:[13,18],tokenpool:[13,18],told:2,toma:2,tomaz:[0,2],too:[2,5,7,12,13,20,21],took:21,tool:[8,9,23,27],top:2,topolog:12,total:2,tour:3,tox:2,tpool:[0,2,4,8,14],tpool_except:14,tpooledconnectionpool:[2,13],trace:[2,14,15,17],trace_nam:14,traceback:[2,15,21,23],track:[0,2,13],trampolin:[2,6,7],transact:23,transfer:[2,29],transpar:[6,26,29],trap_error:2,travi:[0,2],treat:2,tree:[6,12,27],tri:7,trick:28,tricki:7,trigger:[15,21],trim:2,truli:[2,5,18],trunk:6,tsafe:2,tucker:0,tune:10,tupl:[1,2,10,12,15,17,19,23],turn:[7,12],tushar:[0,2],tutori:9,tweak:[2,22],twice:12,twist:[0,2],twistedr:2,twistedutil:2,two:[1,5,12,15,18,21,29],txt:5,tyler:[0,2],type:[2,3,5,10,12,17,21,23,28,29],typeerror:2,typic:[5,12,19],typo:[0,2],udp:2,ultim:12,un:25,unavail:29,unavoid:17,unblock:[12,19,20],unbound:20,uncaught:[1,12],uncompress:[2,22],uncov:0,under:[2,8,22,25],underli:[2,12,23,26],understand:[1,2,4,8,27],unencrypt:23,unexpect:21,unexpectedli:[7,28],unfinish:[2,13,19],unicod:[2,22],unidirect:5,unidirection:5,uniform:12,uniqu:[12,18],unit:[1,2,27],unittest:[6,27],univers:[2,8,9],universal_newlin:2,unix:[2,23],unknown:12,unless:12,unlik:[12,19],unlink:[0,2,17],unmodifi:2,unnecessari:2,unpack:2,unpatch:2,unpredict:1,unqualifi:2,unrel:0,unreli:29,unschedul:15,unspecifi:12,unspew:14,until:[1,2,3,7,12,15,16,17,18,19,20,28],unus:[2,13],unwrap:2,up:[2,5,7,10,12,13,14,16,17,18,19,20,23,26,27],updat:[2,6],upgrad:[0,2],upload:12,upon:[13,25],upper:[3,20],upstream:[2,12],urban:[0,2],url:[2,3,5,8,23,26],url_length_limit:23,url_match:5,url_regex:5,url_schem:[2,23],urllib2:[0,2,5,21,26],urllib:[3,5,8,26],urlopen:[0,3,5,8,26],us:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,27,28,29],usabl:23,usag:[2,3,8,12],use_certificate_fil:26,use_hub:[2,4,7],use_privatekey_fil:26,use_result:13,useless:[12,13],user:[2,4,8,13,23,29],usr:5,usual:27,utf:[2,22],util:[2,14],uuid:12,v20:2,v2:2,v:[0,2],val:0,valid:22,valu:[1,2,3,5,10,12,13,14,15,16,17,20,21,22,23,28],value1:12,value2:12,valueerror:[2,19,20],vanderlinden:[0,2],variabl:[2,7,8,10,22,23,27,28],variant:19,variou:[2,3],varrazzo:[0,2,25],vast:28,vatamaniuc:[0,2],ve:[12,13,25],vector:22,verbos:[1,2],veri:[1,2,3,5,12,13,18,20,21],verifi:27,version:[1,2,3,10,22,23,24,25,26,27],versu:12,via:[2,7,10,18,27,28],victor:[0,2],violat:23,vishvananda:2,visit:15,volunt:0,vs:23,w:[0,2,5],wa:[2,3,6,10,12,19,20,21,27],wai:[1,2,5,10,12,15,17,18,22,23,25,27,28],wait:[0,2,5,7,12,13,14,15,16,17,18,19,20,22,23,26],wait_each:12,wait_each_except:12,wait_each_success:12,wait_on:15,waital:[5,12,16],waiter:15,waiting_for:12,waitpid:2,wake:[0,2,7,13,20],wall_second:23,want:[1,2,3,12,13,17,23,27,28],warn:22,warning_count:13,water:[13,18],we:[0,1,2,3,5,12,25,27],weak:25,web:[3,8,22,23],webcrawl:[0,5],webob:0,weboscket:0,websocket:[0,2,8,9,23],websocket_chat:5,websockets13:2,websocketwsgi:[5,22],weight:6,weird:[2,27],well:[2,5,12,23,25,27],were:[0,2,3,5,6,12,19,27],what:[1,2,4,7,8,12,14,25,27],whatev:[12,13,17,18],wheel:2,when:[1,2,3,5,6,7,10,12,13,14,15,16,17,18,19,20,21,23,25,27,28,29],whenev:[13,18,19],where:[2,3,12,13,15,19,23,29],wherea:25,whether:[2,12,13,14,17,19,23,25],which:[1,2,3,5,7,12,13,14,15,16,17,18,20,22,23,25,27,28],whitespac:2,whitnei:0,who:[2,8,13,18],whole:[2,16],whoop:15,whose:12,why:[2,7],wiki:2,william:[0,2],windisch:[0,2],window:[0,2],winerror:2,with_timeout:[2,21],within:[2,8,9,12,17,19,21],without:[2,7,12,13,14,16,17,19,20,21],wodg:27,woken:[15,19],won:[1,3,7,21],wonder:6,word:[2,12,13,18],work:[1,2,3,5,6,8,12,13,16,19,22,23,25,26,27,28],workaround:2,worker:[3,5,16],world:[5,6,8,22,23,28],would:[1,2,12,13,20],wrap:[2,12,21,22,23,26,27,28],wrap_:2,wrap_pipes_with_coroutine_pip:2,wrap_socket:[1,2],wrap_socket_with_coroutine_socket:2,wrap_ssl:[0,1,2,23],wrapper:[2,12,13,28],wright:[0,2],wrii:0,write:[2,5,6,7,8,14,25,26],writelin:2,writer:[2,5],written:[6,23,24],wrong:2,ws:[5,22],wsgi:[0,2,3,8,9,22],wsgi_app:23,wsgi_test:23,wsl:2,ww:[3,5,8],www:[3,5,8,21,24],x509:26,x:[5,23],xreadlin:2,y3:[3,5,8],yamamoto:2,yandex:5,yang:[0,2],yashwardhan:0,ye:3,yet:[2,6,12,22,27],yield:[1,2,3,10,12,13,14,17,18,21,23,25,28],yimg:[3,5,8],you:[1,2,3,5,6,7,8,10,12,13,14,15,17,18,21,22,23,25,26,27,28,29],young:0,your:[0,1,2,5,7,12,26,27],yourself:[5,7],yuichi:0,yule:0,zed:2,zero:[16,18,19,20],zeromq:[0,2,8,24],zeroreturnerror:2,zhang:[0,2],zhengwei:2,ziegler:0,zip:5,zipkin:2,zlib:12,zmq:[0,2,8,9,29]},titles:["Authors","Basic Usage","0.32.0","Design Patterns","Environment Variables","Examples","History","Understanding Eventlet Hubs","Eventlet Documentation","Module Reference","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">backdoor</span></code> \u2013 Python interactive interpreter within a running process","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">corolocal</span></code> \u2013 Coroutine local storage","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">dagpool</span></code> \u2013 Dependency-Driven Greenthreads","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">db_pool</span></code> \u2013 DBAPI 2 database connection pooling","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">debug</span></code> \u2013 Debugging tools for Eventlet","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">event</span></code> \u2013 Cross-greenthread primitive","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">greenpool</span></code> \u2013 Green Thread Pools","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">greenthread</span></code> \u2013 Green Thread Implementation","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pools</span></code> - Generic pools of resources","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">queue</span></code> \u2013 Queue class","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">semaphore</span></code> \u2013 Semaphore classes","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">timeout</span></code> \u2013 Universal Timeouts","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">websocket</span></code> \u2013 Websocket Server","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">wsgi</span></code> \u2013 WSGI server","<code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">eventlet.green.zmq</span></code> \u2013 \u00d8MQ support","Greening The World","Using SSL With Eventlet","Testing Eventlet","Threads","Zeromq"],titleterms:{"0":2,"1":2,"10":2,"100":23,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"18":2,"19":2,"2":[2,13],"20":2,"21":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"3":2,"30":2,"31":2,"32":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"\u00f8mq":[24,29],"class":[19,20],"function":[1,7],"import":25,If:0,The:25,To:0,With:26,api:[1,29],argument:13,author:0,backdoor:10,basic:1,bug:0,chat:5,client:3,connect:[5,13],constructor:13,consum:5,content:[8,12],continu:23,contributor:0,control:1,conveni:1,coroloc:11,coroutin:11,coverag:27,crawler:5,cross:15,dagpool:12,databas:13,databaseconnector:13,db_pool:13,dbapi:13,debug:14,depend:12,design:3,dispatch:3,doctest:27,document:[8,29],driven:12,e:0,echo:5,environ:4,event:15,eventlet:[7,8,14,24,26,27],exampl:[5,12],except:12,extens:23,feed:5,find:0,forward:5,gener:18,green:[16,17,24,25],greenpool:16,greenthread:[1,12,15,17],hassl:0,header:23,histori:6,hook:23,how:7,hub:[7,27],i:0,implement:17,indic:8,interact:10,interpret:10,introspect:12,lab:0,librari:[25,27],licens:8,linden:0,local:11,maintain:0,modul:[9,12],monkeypatch:25,more:7,multi:5,network:1,non:23,origin:0,patch:1,pattern:3,pool:[13,16,18,28],port:5,post:[12,23],preload:12,primari:1,primit:15,process:10,produc:5,propag:12,pyopenssl:26,python:[8,10],queue:19,rational:12,recurs:5,refer:9,relat:7,resourc:18,respons:23,run:10,scan:12,scraper:5,semaphor:20,server:[3,5,22,23],simpl:28,socket:5,spawn:1,ssl:[23,26],standard:[23,25,27],storag:11,success:12,support:[8,23,24],tabl:8,test:27,thank:0,thread:[16,17,28],timeout:21,tool:14,tpool:28,tutori:12,understand:7,univers:21,us:26,usag:1,user:5,variabl:4,version:8,web:5,websocket:[5,22],what:29,who:0,within:10,work:7,world:25,write:27,wsgi:[5,23],x:2,you:0,zeromq:29,zmq:24}}) \ No newline at end of file
diff --git a/doc/ssl.html b/doc/ssl.html
index 015dfc2..33f1725 100644
--- a/doc/ssl.html
+++ b/doc/ssl.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Using SSL With Eventlet &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Using SSL With Eventlet &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="examples.html" title="Examples"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Using SSL With Eventlet</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="using-ssl-with-eventlet">
+ <section id="using-ssl-with-eventlet">
<h1>Using SSL With Eventlet<a class="headerlink" href="#using-ssl-with-eventlet" title="Permalink to this headline">¶</a></h1>
<p>Eventlet makes it easy to use non-blocking SSL sockets. If you’re using Python 2.7 or later, you’re all set, eventlet wraps the built-in ssl module.</p>
<p>In either case, the <code class="docutils literal notranslate"><span class="pre">green</span></code> modules handle SSL sockets transparently, just like their standard counterparts. As an example, <code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.urllib2</span></code> can be used to fetch https urls in as non-blocking a fashion as you please:</p>
@@ -55,7 +57,7 @@
<span class="nb">print</span><span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
</pre></div>
</div>
-<div class="section" id="pyopenssl">
+<section id="pyopenssl">
<h2>PyOpenSSL<a class="headerlink" href="#pyopenssl" title="Permalink to this headline">¶</a></h2>
<p><code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.OpenSSL</span></code> has exactly the same interface as <a class="reference external" href="https://launchpad.net/pyopenssl">pyOpenSSL</a> <a class="reference external" href="http://pyopenssl.sourceforge.net/pyOpenSSL.html/">(docs)</a>, and works in all versions of Python. This module is much more powerful than <code class="xref py py-func docutils literal notranslate"><span class="pre">socket.ssl()</span></code>, and may have some advantages over <a class="reference external" href="https://docs.python.org/3/library/ssl.html#module-ssl" title="(in Python v3.9)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">ssl</span></code></a>, depending on your needs.</p>
<p>For testing purpose first create self-signed certificate using following commands</p>
@@ -115,10 +117,11 @@ $ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key &gt; server.cert
<blockquote>
<div><p>$ python client.py</p>
</div></blockquote>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -149,7 +152,7 @@ $ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key &gt; server.cert
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -174,13 +177,14 @@ $ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key &gt; server.cert
<li class="right" >
<a href="examples.html" title="Examples"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Using SSL With Eventlet</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/testing.html b/doc/testing.html
index 91da0fa..b1da91b 100644
--- a/doc/testing.html
+++ b/doc/testing.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Testing Eventlet &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Testing Eventlet &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="hubs.html" title="Understanding Eventlet Hubs"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Testing Eventlet</a></li>
</ul>
</div>
@@ -43,7 +45,7 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="testing-eventlet">
+ <section id="testing-eventlet">
<h1>Testing Eventlet<a class="headerlink" href="#testing-eventlet" title="Permalink to this headline">¶</a></h1>
<p>Eventlet is tested using <a class="reference external" href="http://somethingaboutorange.com/mrl/projects/nose/">Nose</a>. To run tests, simply install nose, and then, in the eventlet tree, do:</p>
<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ python setup.py <span class="nb">test</span>
@@ -59,15 +61,15 @@
</div>
<p>That’s it! The output from running nose is the same as unittest’s output, if the entire directory was one big test file.</p>
<p>Many tests are skipped based on environmental factors; for example, it makes no sense to test kqueue-specific functionality when your OS does not support it. These are printed as S’s during execution, and in the summary printed after the tests run it will tell you how many were skipped.</p>
-<div class="section" id="doctests">
+<section id="doctests">
<h2>Doctests<a class="headerlink" href="#doctests" title="Permalink to this headline">¶</a></h2>
<p>To run the doctests included in many of the eventlet modules, use this command:</p>
<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ nosetests --with-doctest eventlet/*.py
</pre></div>
</div>
<p>Currently there are 16 doctests.</p>
-</div>
-<div class="section" id="standard-library-tests">
+</section>
+<section id="standard-library-tests">
<h2>Standard Library Tests<a class="headerlink" href="#standard-library-tests" title="Permalink to this headline">¶</a></h2>
<p>Eventlet provides the ability to test itself with the standard Python networking tests. This verifies that the libraries it wraps work at least as well as the standard ones do. The directory tests/stdlib contains a bunch of stubs that import the standard lib tests from your system and run them. If you do not have any tests in your python distribution, they’ll simply fail to import.</p>
<p>There’s a convenience module called all.py designed to handle the impedance mismatch between Nose and the standard tests:</p>
@@ -76,16 +78,16 @@
</div>
<p>That will run all the tests, though the output will be a little weird because it will look like Nose is running about 20 tests, each of which consists of a bunch of sub-tests. Not all test modules are present in all versions of Python, so there will be an occasional printout of “Not importing %s, it doesn’t exist in this installation/version of Python”.</p>
<p>If you see “Ran 0 tests in 0.001s”, it means that your Python installation lacks its own tests. This is usually the case for Linux distributions. One way to get the missing tests is to download a source tarball (of the same version you have installed on your system!) and copy its Lib/test directory into the correct place on your PYTHONPATH.</p>
-</div>
-<div class="section" id="testing-eventlet-hubs">
+</section>
+<section id="testing-eventlet-hubs">
<h2>Testing Eventlet Hubs<a class="headerlink" href="#testing-eventlet-hubs" title="Permalink to this headline">¶</a></h2>
<p>When you run the tests, Eventlet will use the most appropriate hub for the current platform to do its dispatch. It’s sometimes useful when making changes to Eventlet to test those changes on hubs other than the default. You can do this with the <code class="docutils literal notranslate"><span class="pre">EVENTLET_HUB</span></code> environment variable.</p>
<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>$ <span class="nv">EVENTLET_HUB</span><span class="o">=</span>epolls nosetests
</pre></div>
</div>
<p>See <a class="reference internal" href="hubs.html#understanding-hubs"><span class="std std-ref">Understanding Eventlet Hubs</span></a> for the full list of hubs.</p>
-</div>
-<div class="section" id="writing-tests">
+</section>
+<section id="writing-tests">
<h2>Writing Tests<a class="headerlink" href="#writing-tests" title="Permalink to this headline">¶</a></h2>
<p>What follows are some notes on writing tests, in no particular order.</p>
<p>The filename convention when writing a test for module <cite>foo</cite> is to name the test <cite>foo_test.py</cite>. We don’t yet have a convention for tests that are of finer granularity, but a sensible one might be <cite>foo_class_test.py</cite>.</p>
@@ -94,8 +96,8 @@
<span class="n">client_sock</span> <span class="o">=</span> <span class="n">eventlet</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="s1">&#39;localhost&#39;</span><span class="p">,</span> <span class="n">server_sock</span><span class="o">.</span><span class="n">getsockname</span><span class="p">()[</span><span class="mi">1</span><span class="p">]))</span>
</pre></div>
</div>
-</div>
-<div class="section" id="coverage">
+</section>
+<section id="coverage">
<h2>Coverage<a class="headerlink" href="#coverage" title="Permalink to this headline">¶</a></h2>
<p>Coverage.py is an awesome tool for evaluating how much code was exercised by unit tests. Nose supports it if both are installed, so it’s easy to generate coverage reports for eventlet. Here’s how:</p>
<div class="highlight-sh notranslate"><div class="highlight"><pre><span></span>nosetests --with-coverage --cover-package<span class="o">=</span>eventlet
@@ -107,10 +109,11 @@
</pre></div>
</div>
<p>(<code class="docutils literal notranslate"><span class="pre">tempmod</span></code> and <code class="docutils literal notranslate"><span class="pre">console</span></code> are omitted because they get thrown away at the completion of their unit tests and coverage.py isn’t smart enough to detect this.)</p>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -145,7 +148,7 @@
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -170,13 +173,14 @@
<li class="right" >
<a href="hubs.html" title="Understanding Eventlet Hubs"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Testing Eventlet</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/threading.html b/doc/threading.html
index 7fbd8c5..9650740 100644
--- a/doc/threading.html
+++ b/doc/threading.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Threads &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Threads &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="ssl.html" title="Using SSL With Eventlet"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Threads</a></li>
</ul>
</div>
@@ -43,14 +45,14 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="threads">
+ <section id="threads">
<h1>Threads<a class="headerlink" href="#threads" title="Permalink to this headline">¶</a></h1>
<p>Eventlet is thread-safe and can be used in conjunction with normal Python threads. The way this works is that coroutines are confined to their ‘parent’ Python thread. It’s like each thread contains its own little world of coroutines that can switch between themselves but not between coroutines in other threads.</p>
<img alt="_images/threading_illustration.png" src="_images/threading_illustration.png" />
<p>You can only communicate cross-thread using the “real” thread primitives and pipes. Fortunately, there’s little reason to use threads for concurrency when you’re already using coroutines.</p>
<p>The vast majority of the times you’ll want to use threads are to wrap some operation that is not “green”, such as a C library that uses its own OS calls to do socket operations. The <a class="reference internal" href="#module-eventlet.tpool" title="eventlet.tpool"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tpool</span></code></a> module is provided to make these uses simpler.</p>
<p>The optional <a class="reference internal" href="hubs.html#understanding-hubs"><span class="std std-ref">pyevent hub</span></a> is not compatible with threads.</p>
-<div class="section" id="tpool-simple-thread-pool">
+<section id="tpool-simple-thread-pool">
<h2>Tpool - Simple thread pool<a class="headerlink" href="#tpool-simple-thread-pool" title="Permalink to this headline">¶</a></h2>
<p>The simplest thing to do with <a class="reference internal" href="#module-eventlet.tpool" title="eventlet.tpool"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tpool</span></code></a> is to <a class="reference internal" href="#eventlet.tpool.execute" title="eventlet.tpool.execute"><code class="xref py py-func docutils literal notranslate"><span class="pre">execute()</span></code></a> a function with it. The function will be run in a random thread in the pool, while the calling coroutine blocks on its completion:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">thread</span>
@@ -63,21 +65,9 @@
</pre></div>
</div>
<p>By default there are 20 threads in the pool, but you can configure this by setting the environment variable <code class="docutils literal notranslate"><span class="pre">EVENTLET_THREADPOOL_SIZE</span></code> to the desired pool size before importing tpool.</p>
-<span class="target" id="module-eventlet.tpool"></span><dl class="py function">
-<dt id="eventlet.tpool.execute">
-<code class="sig-prename descclassname">eventlet.tpool.</code><code class="sig-name descname">execute</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">meth</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.tpool.execute" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute <em>meth</em> in a Python thread, blocking the current coroutine/
-greenthread until the method completes.</p>
-<p>The primary use case for this is to wrap an object or module that is not
-amenable to monkeypatching or any of the other tricks that Eventlet uses
-to achieve cooperative yielding. With tpool, you can force such objects to
-cooperate with green threads by sticking them in native threads, at the cost
-of some overhead.</p>
-</dd></dl>
-
-<dl class="py class">
-<dt id="eventlet.tpool.Proxy">
-<em class="property">class </em><code class="sig-prename descclassname">eventlet.tpool.</code><code class="sig-name descname">Proxy</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">obj</span></em>, <em class="sig-param"><span class="n">autowrap</span><span class="o">=</span><span class="default_value"></span></em>, <em class="sig-param"><span class="n">autowrap_names</span><span class="o">=</span><span class="default_value"></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.tpool.Proxy" title="Permalink to this definition">¶</a></dt>
+<span class="target" id="module-eventlet.tpool"></span><dl class="py class">
+<dt class="sig sig-object py" id="eventlet.tpool.Proxy">
+<em class="property"><span class="pre">class</span> </em><span class="sig-prename descclassname"><span class="pre">eventlet.tpool.</span></span><span class="sig-name descname"><span class="pre">Proxy</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">autowrap</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">autowrap_names</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.tpool.Proxy" title="Permalink to this definition">¶</a></dt>
<dd><p>a simple proxy-wrapper of any object that comes with a
methods-only interface, in order to forward every method
invocation onto a thread in the native-thread pool. A key
@@ -97,10 +87,23 @@ of strings, which represent the names of attributes that should be
wrapped in Proxy objects when accessed.</p>
</dd></dl>
-</div>
-</div>
+<dl class="py function">
+<dt class="sig sig-object py" id="eventlet.tpool.execute">
+<span class="sig-prename descclassname"><span class="pre">eventlet.tpool.</span></span><span class="sig-name descname"><span class="pre">execute</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">meth</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#eventlet.tpool.execute" title="Permalink to this definition">¶</a></dt>
+<dd><p>Execute <em>meth</em> in a Python thread, blocking the current coroutine/
+greenthread until the method completes.</p>
+<p>The primary use case for this is to wrap an object or module that is not
+amenable to monkeypatching or any of the other tricks that Eventlet uses
+to achieve cooperative yielding. With tpool, you can force such objects to
+cooperate with green threads by sticking them in native threads, at the cost
+of some overhead.</p>
+</dd></dl>
+
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -131,7 +134,7 @@ wrapped in Proxy objects when accessed.</p>
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -156,13 +159,14 @@ wrapped in Proxy objects when accessed.</p>
<li class="right" >
<a href="ssl.html" title="Using SSL With Eventlet"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Threads</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
diff --git a/doc/zeromq.html b/doc/zeromq.html
index 6673426..40cedaf 100644
--- a/doc/zeromq.html
+++ b/doc/zeromq.html
@@ -1,18 +1,19 @@
<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
<head>
<meta charset="utf-8" />
- <title>Zeromq &#8212; Eventlet 0.31.0 documentation</title>
- <link rel="stylesheet" href="_static/classic.css" type="text/css" />
- <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
+
+ <title>Zeromq &#8212; Eventlet 0.32.0 documentation</title>
+ <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
+ <link rel="stylesheet" type="text/css" href="_static/classic.css" />
- <script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+ <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
- <script src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -34,7 +35,8 @@
<li class="right" >
<a href="threading.html" title="Threads"
accesskey="P">previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Zeromq</a></li>
</ul>
</div>
@@ -43,9 +45,9 @@
<div class="bodywrapper">
<div class="body" role="main">
- <div class="section" id="zeromq">
+ <section id="zeromq">
<h1>Zeromq<a class="headerlink" href="#zeromq" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="what-is-omq">
+<section id="what-is-omq">
<h2>What is ØMQ?<a class="headerlink" href="#what-is-omq" title="Permalink to this headline">¶</a></h2>
<p>“A ØMQ socket is what you get when you take a normal TCP socket, inject it with a mix of radioactive isotopes stolen
from a secret Soviet atomic research project, bombard it with 1950-era cosmic rays, and put it into the hands of a drug-addled
@@ -62,14 +64,15 @@ Further, messages may be queued in the event that a peer is unavailable to recei
or in some cases one-to-many (multicast) relationships. With the exception of ZMQ::PAIR,
0MQ sockets may be connected to multiple endpoints using connect(),
while simultaneously accepting incoming connections from multiple endpoints bound to the socket using bind(), thus allowing many-to-many relationships.</p>
-</div>
-<div class="section" id="api-documentation">
+</section>
+<section id="api-documentation">
<h2>API documentation<a class="headerlink" href="#api-documentation" title="Permalink to this headline">¶</a></h2>
<p>ØMQ support is provided in the <code class="xref py py-mod docutils literal notranslate"><span class="pre">eventlet.green.zmq</span></code> module.</p>
-</div>
-</div>
+</section>
+</section>
+ <div class="clearer"></div>
</div>
</div>
</div>
@@ -101,7 +104,7 @@ while simultaneously accepting incoming connections from multiple endpoints boun
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <input type="text" name="q" aria-labelledby="searchlabel" />
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
@@ -126,13 +129,14 @@ while simultaneously accepting incoming connections from multiple endpoints boun
<li class="right" >
<a href="threading.html" title="Threads"
>previous</a> |</li>
- <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.31.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
+ <li class="nav-item nav-item-this"><a href="">Zeromq</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2005-2010, Eventlet Contributors.
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 3.0.0.
+ Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){